Standard Shaderを適用したモデルのフェードイン・フェードアウトは、Colorのアルファ値を変更することによって、行う。
Color値を変えるメソッドは、
Material.SetColor(string propertyName, Color color)
で、第1引数はどのColorを変えるかを指定するもの。
具体的には、Standard Shaderでは、
の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();
}
}
}