Animatorのステートがonの状態になったら何かしら実行する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class state_on : MonoBehaviour
{
    //自分のAnimatorComponentを入れる変数anim
    private Animator anim;

    void Start()
    {
        //変数animに自分のAnimatorのcomponentを取得して入れる
        anim = this.GetComponent<Animator>();
    }

    void Update()
    {
        //AnimatorのLayerの場所を指定して(GetCurrentAnimatorStateInfo(0)というのはレイヤーが一枚目という意味)
        //それを変数AnimatorStateInfo型のstateInfoに入れる
        AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0);
        //testというstateがonになるとhogeと出る
        if (stateInfo.IsName("test"))
        {
            Debug.Log("hoge");
        }
    }
}


レイヤーの一枚目はGetCurrentAnimatorStateInfo(0)で取れる
f:id:shinobigiken:20170723073219p:plain

関数の呼び出し

関数の呼び出し

//最初にa関数を呼び出す
void Start(){
    //ここの()の中は数値、文字、真偽値を入れる。何も入れなくてもよい
    a(99.99f);
}

//a関数は実数のx(ここの()の中でもらった数値を変数に代入する)
void a(float x){
    Debug.Log(x);
}


関数に初期値を持たせる
例1

void Start(){
    //a関数を呼び出して何も数値がない場合
    a();
}

//floatのxの初期値を100にしているのでx=100
void a(float x  = 100){
    Debug.Log(x);
}


例2

void Start(){
    //a関数を呼び出して数値がある場合
    a(99.99f);
}

//floatのxは関数を呼び出している時に設定された99.99fが使われる(100は無視される)
void a(float x  = 100){
Debug.Log(x);
}


関数に初期値を複数持たせる

void Start(){
    //kansu関数呼び出し引数にaは100,bは200の値を持たせる
    kansu(a:100 b:200);
}

//kansu関数aは整数bは整数(引数としてもらった値を入れる)
void kansu(int a, int b){
    Debug.Log(a+b)
}


オーバーロード(自動的に引数に合う関数を呼び出してくれる)

//kansu関数呼び出し(初期値を呼び出したい関数の型に指定する)
//例えばkansu(100);と書けばvoid kansu( int a){}が呼び自動で出される
//kansu(100 , 200 );と書けばvoid kansu(int a , int b){}が自動で呼び出される
//kansu(“文字”)と書けばvoid kansu(string s){}が自動で呼び出される
void Start(){
    kansu();
}

//kansu関数(整数がひとつだったらこの関数を呼び出してaに代入する)
void kansu(int a){
    Debug.Log(a);
}

//kansu関数(整数が二つだったらこの関数を呼び出してaとbに代入する)
    void kansu(int a,int b){
    Debug.Log(a+b);
}

//kansu関数(文字列だったらsに代入する)
    void kansu(string s){
    Debug.Log(s);
}


戻り値(関数を呼び出して、数値を戻してもらう)

//kansu関数を呼び出して戻してもらって、consoleに表示
void Start(){
    Debug.Log(kansu(100,200));
}

//kansu関数(ここはvoidではなく、戻してほしいデータ型名を最初に入れる)
int kansu(int x ,int y){
    //returnで関数を呼び出した所に数値を戻す
    return x + y;
}

instantiateとenabledのメリットデメリット

・instantiateでそのつど出現させてる場合
メリット:Destroyするので、出現していない間はメモリに負荷がかからない
デメリット:instantiateが重いので、生成時に一瞬負荷がスパークする

・enabledで表示させている場合
メリット:enabledが軽いので、負荷が急に上がらない
デメリット:出現していない間もオブジェクトが存在するので、メモリに負荷がかかる

といった良し悪しがあるので、一概にどちらが負担が軽いということはなく、
どれくらい生成してどれくらいの時間表示させるのか、消すタイミングなどで適切なほうを選択するのが良い

マテリアルの値をスクリプトで変える方法2 (指定したマテリアルを使用しているオブジェクト全てに反映する)

変数の定義に下記のような感じで変数を作っておいてinspectorでマテリアルを設定
public Material Material_a;

あとは下記のようにマテリアルにアクセスすれば良い
Material_a.SetColor("_Color", new Color(1f, 0.0f, 0.0f, 1.0f));

マテリアルの値をスクリプトで変える方法_1 (マテリアルは同じだが、個別に変える方法)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class emission : MonoBehaviour {

	//オブジェクトを指定
	public GameObject obj_1;
	//データ型Colorを入れるcolor変数
	private Color color;
	//データ型Rendererを入れるrand変数
	private Renderer rend;

	// Use this for initialization
	void Start () {
		//obj_1のRendererComponentを取得
		rend = obj_1.GetComponent<Renderer>();
	}
	
	void Update () {

		//もしspaceを押したら
		if (Input.GetKeyDown (KeyCode.Space)) {
			//指定したオブジェクトのマテリアルの色を変更
			rend.material.SetColor("_EmissionColor", color = new Color(1f, 0.0f, 0.0f, 0.0f));
			rend.material.SetColor("_Color", color = new Color(1f, 0.0f, 0.0f, 0.0f));
			//resetコルーチン呼び出し
			StartCoroutine (reset());
		}
	}

	public IEnumerator reset(){
		//1フレーム待つ
		yield return null;
		//指定したオブジェクトのマテリアルの色を戻す
		rend.material.SetColor("_EmissionColor", color = new Color(0.0f, 0.0f, 0.0f, 0.0f));
		rend.material.SetColor("_Color", color = new Color(1.0f, 1.0f, 1.0f, 1.0f));
	}
}


下記のスクリプト説明
public GameObject obj_1;でマテリアルの値を変えたいオブジェクトを指定して
void startでそのオブジェクトのRendererComponentを取得してrendに入れる
もしspaceを押したらそのマテリアルの値を変更して
コルーチンを呼び出し、1フレ後に色を戻している。

マテリアルの色を変更するには下記の4つの仕組みで構成されている
■Renderer
レンダラー、そのオブジェクトのレンダラーにアクセスする(それぞれのオブジェクトのマテリアルの値を変更するにはこれが必須)
■material.SetColor
マテリアルを変更する合図
■"_EmissionColor"
マテリアルの、どの値を変更するか指定
■ color = new Color(1f, 0.0f, 0.0f, 0.0f)
値をどのように変えるかを指定


ここのRendererに関しては最初に
public GameObject obj_1;
private Renderer rend;
みたいに変数を定義したあげて

void startで
rend = obj_1.GetComponent();
こんな感じでrend変数にマテリアルの値を変更させたいオブジェクトのRendererコンポーネントを入れてしまうと良い
こうすればrendに指定したオブジェクトのRendererがコンポーネントが入っているので
rend.material.SetColor("_EmissionColor", color = new Color(1f, 0.0f, 0.0f, 0.0f));
上記のように書けばマテリアルが更新される

変更させる値の種類が"_EmissionColor"となっているが
他の値を変更させたい場合
マテリアルのinspector > 歯車アイコンをクリック > Edit Shader,,,
f:id:shinobigiken:20170724075934p:plain

するとshaderのpropertiesが出てくる
ここの名前を見て、例えばemissionの値をいじりたかったら”_EmissionColor”
Albedoの値を変化させたい場合は”_Color”にする
Albedoのテクスチャを貼りたい場合は”_MainTex”
f:id:shinobigiken:20170724080033p:plain

ImageEffectをSceneでonにしない方法

ImageEffectのscriptで
[ExecuteInEditMode]
と書いてある部分を消すかコメントアウト
[ExecuteInEditMode]はplayしてなくてもスクリプトが発動する
消すかコメントアウトしてからinspectorでスクリプトをon/offすればシーンに反映される

スクリプトをアクティブor非アクティブにすると呼ばれる関数

アクティブにすると呼ばれる関数

void OnEnable(){
    print("hoge");
}


非アクティブにすると呼ばれる関数

void OnDisable(){
    print("hoge")
}