2016-09-07 19 views
0

時間を考慮してオブジェクトをフェードアウトさせるスクリプトを作成しています。ユニティメッシュレンダラーは完全に透明ではありません

スクリプトは非常にうまく動作しますが、オブジェクトが退色しても、インスペクタとビルドでは非常に見えます。

誰かがなぜ、どのようにオブジェクトを完全に見えないようにするのか説明できますか? (私はオブジェクトを「有効にする」ことができますが、フェーディングよりも多くのリソースを使用していませんか)私は知らない:()

ここで私は間違いを犯したここで団結のフォーラムでトピック)

// Update is called once per frame 
void Update() 
{ 
    MyTime = Time.deltaTime; 
    AccumulatedTime += MyTime; 
    if (this.name == "Cube (1)") 
    { 
     Debug.Log(AccumulatedTime); 
    } 
    if (SwitchVisibility == 1) 
    { 

     if (AccumulatedTime >= Interval && AccumulatedTime<= 2*Interval || AccumulatedTime >= 3*Interval && AccumulatedTime<= 4*Interval) 
     { 
      StartCoroutine(FadeTo(0.0f, 1.0f)); 
      SwitchVisibility = 0; 
     } 
    } 
    if (SwitchVisibility == 0) 
    { 
     if (AccumulatedTime >= 0 && AccumulatedTime <= Interval || AccumulatedTime >= 2*Interval && AccumulatedTime <= 3*Interval) 
     { 
      StartCoroutine(FadeTo(1.0f, 1.0f)); 
      SwitchVisibility = 1; 
     } 
    } 
    if (AccumulatedTime >= Interval * 4.5f) 
    { 
     AccumulatedTime = 0; 
    } 
} 

IEnumerator FadeTo(float aValue, float aTime) 
{ 
    float alpha = MyRenderer.material.color.a; 
    for (float t = 0.0f; t < 1.0f; t += Time.deltaTime/aTime) 
    { 
     OriginalColor.a = Mathf.Lerp(alpha, aValue, t); 
     Color newColor = OriginalColor; 
     MyRenderer.material.color = newColor; 
     yield return null; 
    } 
} 

は次のようになりどのオブジェクトである:あなたのコードを仮定し

enter image description here

+0

'FadeTo'関数の' aValue'と 'aTime'変数は何ですか?また、時間をかけてフェードアウトしたいですか?また、ある時点でオブジェクトを表示させたいのですか? – Programmer

+0

aTimeは、for文のTime.DeltaTimeを分割するために使用される値です。オブジェクトをフェードする速度を設定します。 私はすべての "間隔"秒(エディタで設定された間隔)をフェードインします。 私は問題を正しく説明していないかもしれませんが、私の質問は完全に見えないようにしたい、コードがうまく動作することです(オブジェクトが見えなくなっても)。 – Andromelus

+0

'Debug.Log ) 'その値が実際に0であるかどうかを確認してください。これはコードのトラブルシューティングに役立ちます。結果を教えてください。わかった。いいえ、コードが正しく動作しません。デバッグの出力を教えてください。Log(alpha) ' – Programmer

答えて

1

は、問題が非常に可能性があなたのマテリアル設定からで結構なのですが、これはユニティ5に変更します。のアルファを変更するにはまた、材料のレンダリングモードから不透明度(デフォルト)に変更して、フェードに変更する必要があります。

透明モードも問題ありませんが、完全に透過的ではありません。問題の原因はです。

スクリプトからモードを変更できます。

物件名

0 = Opaque 
1 = Cutout 
2 = Fade 
3 = Transparent 

我々は知らありMyRenderer.material.SetFloat("_Mode",2);

でフェードするレンダリングモードを変更することができます。Debug.Log(MyRenderer.material.GetFloat("_Mode"));_Mode

は、私がfollwing値を得ましたproblemレンダリングモードをスクリプトから設定します。変更を有効にするには、他のすべてのプロパティも更新する必要があります。ここではスクリプトからフェードインするために、あなたのレンダリングモードを変更するための完全な方法は次のとおりです。最後に

MyRenderer.material.SetFloat("_Mode", 2); 
MyRenderer.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); 
MyRenderer.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); 
MyRenderer.material.SetInt("_ZWrite", 0); 
MyRenderer.material.DisableKeyword("_ALPHATEST_ON"); 
MyRenderer.material.EnableKeyword("_ALPHABLEND_ON"); 
MyRenderer.material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); 
MyRenderer.material.renderQueue = 3000; 

、これはあなたのスクリプトが良いではありません、あなたのために働いている場合。以下のスクリプトを使用して、メッシュレンダラーをフェードインまたはフェードアウトすることができます。

public MeshRenderer MyRenderer; 
bool fading = false; 

void Fade(bool fadeIn, float duration) 
{ 
    if (fading) 
    { 
     return; 
    } 
    fading = true; 

    changeModeToFade(); 
    StartCoroutine(FadeTo(fadeIn, duration)); 
} 

void changeModeToFade() 
{ 
    MyRenderer.material.SetFloat("_Mode", 2); 
    MyRenderer.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); 
    MyRenderer.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); 
    MyRenderer.material.SetInt("_ZWrite", 0); 
    MyRenderer.material.DisableKeyword("_ALPHATEST_ON"); 
    MyRenderer.material.EnableKeyword("_ALPHABLEND_ON"); 
    MyRenderer.material.DisableKeyword("_ALPHAPREMULTIPLY_ON"); 
    MyRenderer.material.renderQueue = 3000; 
} 

IEnumerator FadeTo(bool fadeIn, float duration) 
{ 
    //MyRenderer.material. 
    float counter = 0f; 

    //Set Values depending on if fadeIn or fadeOut 
    float a, b; 
    if (fadeIn) 
    { 
     a = 0; 
     b = 1; 
    } 
    else 
    { 
     a = 1; 
     b = 0; 
    } 


    //Enable MyRenderer component 
    if (!MyRenderer.enabled) 
     MyRenderer.enabled = true; 

    //Get original Mesh Color 
    Color meshColor = MyRenderer.material.color; 


    //Do the actual fading 
    while (counter < duration) 
    { 
     counter += Time.deltaTime; 
     float alpha = Mathf.Lerp(a, b, counter/duration); 
     Debug.Log(alpha); 


     MyRenderer.material.color = new Color(meshColor.r, meshColor.g, meshColor.b, alpha); 
     yield return null; 
    } 

    if (!fadeIn) 
    { 
     //Disable Mesh Renderer 
     MyRenderer.enabled = false; 
    } 
    fading = false; //So that we can call this function next time 
} 

void Start() 
{ 
    //Fade(true, 3f); //Fade In 
    Fade(false, 3f);//Fade Out 
} 
関連する問題