【发布时间】: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