Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

オブジェクトのフェードイン・フェードアウト

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();
        }
    }

}