Unity Mesh Renderer 不会完全透明
Unity Mesh Renderer won't be completely transparent
我正在创建一个脚本,允许对象根据时间间隔淡化。
该脚本运行良好,但是当对象褪色时,它在检查器和构建中仍然非常明显。
谁能解释一下为什么以及如何使对象完全不可见?
(我知道我可以 "enable" 对象,但它使用的资源不是比褪色更多吗?我不知道 :( )
如果我有任何错误,这里是代码(代码灵感来自 unity 论坛中的一个主题)
// 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;
}
}
这是对象的样子:
假设您的代码没有问题,问题很可能出在您的 Material 设置上。这在 Unity 5 中发生了变化。要更改 Mesh Renderer
的 alpha,您还必须将 Material 的 Rendering Mode 从 Opaque(默认)到 淡入淡出 。
透明模式也可以,但不会完全透明,会导致您问题中的问题。
您可以从脚本更改模式。
属性 姓名: _Mode
使用 Debug.Log(MyRenderer.material.GetFloat("_Mode"));
,我得到以下值:
0 = Opaque
1 = Cutout
2 = Fade
3 = Transparent
我们可以将渲染模式更改为淡入淡出MyRenderer.material.SetFloat("_Mode",2);
从脚本设置渲染模式时有一个已知的 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
}
我正在创建一个脚本,允许对象根据时间间隔淡化。
该脚本运行良好,但是当对象褪色时,它在检查器和构建中仍然非常明显。
谁能解释一下为什么以及如何使对象完全不可见? (我知道我可以 "enable" 对象,但它使用的资源不是比褪色更多吗?我不知道 :( )
如果我有任何错误,这里是代码(代码灵感来自 unity 论坛中的一个主题)
// 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;
}
}
这是对象的样子:
假设您的代码没有问题,问题很可能出在您的 Material 设置上。这在 Unity 5 中发生了变化。要更改 Mesh Renderer
的 alpha,您还必须将 Material 的 Rendering Mode 从 Opaque(默认)到 淡入淡出 。
透明模式也可以,但不会完全透明,会导致您问题中的问题。
您可以从脚本更改模式。
属性 姓名: _Mode
使用 Debug.Log(MyRenderer.material.GetFloat("_Mode"));
,我得到以下值:
0 = Opaque
1 = Cutout
2 = Fade
3 = Transparent
我们可以将渲染模式更改为淡入淡出MyRenderer.material.SetFloat("_Mode",2);
从脚本设置渲染模式时有一个已知的 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
}