Standard Shaderを適用したモデルのフェードイン・フェードアウトは、Colorのアルファ値を変更することによって、行う。
Color値を変えるメソッドは、
Material.SetColor(string propertyName, Color color)
で、第1引数はどのColorを変えるかを指定するもの。
具体的には、Standard Shaderでは、
- _Color
- _EmissionColor
の2種類のColorクラスがあるので、どちらを指定する。
第2引数は、設定するColor.これは、RGBAのプロパティを持っているので、このうちのA(アルファ)を変えることで、フェードイン・アウトを実装する。
ポイントは、Materialから取得したColorに対して変更を加えるだけではだめで、変更したColorを、SetColor()で対象Materialに戻してやらなければいけない、ということ。
サンプルスクリプト
同じマテリアルを適用した複数のオブジェクトのフェードイン・フェードアウトを行うスクリプト。アルファ値の変更は、iTweenのValueTo()を使った。
public class Fader : MonoBehaviour { public GameObject[] targets; //Target GameObject private Material[] mats; //Target Material. Shader must be set to Fade or Transparent public float alphaMax = 1.0f; public float alphaMin = 0.0f; private Color color; // Use this for initialization void Start () { mats = new Material[targets.Length]; int i = 0; foreach (GameObject target in targets) { mats[i] = target.GetComponent<Renderer>().material; i++; } color = mats[0].GetColor("_Color"); //GetColor()で、現在のColorを取得。このスクリプトでは、すべてのオブジェクトのColorは同じと仮定している。 } public void FadeOut() { Debug.Log("FadeOut()"); iTween.ValueTo(gameObject, iTween.Hash( "from", alphaMax, "to", alphaMin, "onupdatetarget", gameObject, "onupdate", "updateFromValue", "time", 0.8f, "delay", 0.0f, "easeType", "easeOutQuad", "oncomplete", "FadeOutComplete" )); } public void FadeIn() { Debug.Log("FadeIn()"); iTween.ValueTo(gameObject, iTween.Hash( "from", alphaMin, "to", alphaMax, "onupdatetarget", gameObject, "onupdate", "updateFromValue", "time", 0.8f, "delay", 0.0f, "easeType", "easeOutQuad", "oncomplete", "FadeInComplete" )); } private void updateFromValue(float newValue) { color.a = newValue; foreach (Material mat in mats) { mat.SetColor("_Color", color); // SetColor()で、変更したColorをMaterialに戻す } } private void FadeOutComplete() { Debug.Log("Fade Out Complete"); } private void FadeInComplete() { Debug.Log("Fade In Complete"); } void Update() { if(Input.GetKeyDown("a")){ FadeOut(); } if (Input.GetKeyDown("z")) { FadeIn(); } } }