【问题标题】:Unity Fade in from transparency doesn't workUnity从透明度淡入不起作用
【发布时间】:2016-02-15 03:41:49
【问题描述】:

我在 Unity 3D 项目中遇到了材质淡出和淡入的游戏对象问题。

我在每个资产上都有一个脚本,其中包含一个返回需要更改的材料数组的函数。我用了一个辅助:

 public float timeToDisappear = 2.0f;

 void ChangeMaterialtoTransparent (Material mat) {...}

 void ChangeMaterialtoFade (Material mat) {...}

 void ChangeMaterialToOpaque(Material mat) {...}

每个淡入淡出的对象都有一个 InvisibilityField 字段,该字段返回其部分的材质。数组中的所有 InvisibilityField。

当材料褪色的时候到了,我认领它的材料并使用

    void FadeOverTime( Material[] mats)
     {
         foreach (Material mat in mats) 
         {
                 ChangeMaterialtoFade (mat);
             StartCoroutine(TurnInvisible(mats));
         }
     }

// TurnInvisible 的代码在最后,因为它不是问题,它工作正常

一切都很好。

然而,当试图让它恢复时

IEnumerator ShowAndWait(Material[] mats,int index)
     {

         yield return StartCoroutine(Show(mats, index));
         foreach (Material mat in mats) {
         ChangeMaterialToOpaque (mat);
     }


 IEnumerator Show(Material[] mats, int index)
     {
         float startTime = Time.time;
         InvisibilityField VF = _visibilityComponents [index]; 
         while (Time.time < startTime + timeToDisappear)
         {
             foreach (Material m in mats)
             {
                 float target = VF.GetOpacityLevel(m);
                 float tmp = Mathf.Lerp(0.0f,target,(Time.time - startTime)/timeToDisappear);
                 FadeColorTolevel(m,tmp);
                 print (m.name + "opacity is " + tmp + " as for " + (Time.time - startTime)/timeToDisappear);
             }
             yield return null;
         }
     }
     void FadeColorTolevel(Material mat, float lvl)
     {
         Color Col = mat.color;
         Col.a = lvl;
         mat.color = Col;
     }

仅显示某些材料(其 1 个具有多材料的模型)而其他保持不可见 - 有时 2 个具有相同材料的不同部分 1 个显示而 1 个不显示。

打印函数的打印结果声称所有材料都被限制为0.995。

淡入功能几乎与有效的淡出功能相同,所以我不知道我做错了什么。

我使用 Unity 5.2.0f3。 // 作为助手,这是可以正常工作的隐形代码

IEnumerator TurnInvisible(Material[] mats)
     {
         float startTime = Time.time;
         while (Time.time < startTime + timeToDisappear)
         {
             foreach (Material m in mats)
             {
                 float tmp = Mathf.Lerp(1.0f,0.0f,(Time.time -       startTime)/timeToDisappear);
                 FadeColorTolevel(m,tmp);
             }
             yield return null;
         }
     }

【问题讨论】:

  • 这是相当多的代码,但很难说真正的问题是什么,因为这不是short, self-contained example。建议检查哪些mats 被传递给ShowAndWait。该列表中是否缺少材料,或者可能被_transparentMaterialsNames 检查阻止?用调试器跟踪数据,你就能找到问题。
  • 很公平,主要问题在于
  • 谢谢,我确认 _transparentMaterialsNames 不是问题,并编辑了问题以删除不相关的部分。所有材料都传递给 ShowAndWait。并且打印检查说所有 14 种材料都是 lerped。它就像 m.color = Col 的一部分;不工作

标签: c# unity3d transparency fade


【解决方案1】:

问题解决了。造成混乱是因为材料设置为淡出而不是透明。我不知道有什么不同,但它似乎解决了问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2012-10-02
    • 2018-11-06
    • 2012-11-17
    • 2014-02-04
    相关资源
    最近更新 更多