Unity Mesh Renderer不会完全透明

我正在创建一个脚本,考虑到时间间隔,允许对象褪色。

该脚本运行良好,但是当对象褪色时,它在检查器和构建中仍然非常明显。

有人可以解释为什么以及如何使一个物体完全不可见? (我知道我可以“启用”该对象,但它不是使用比褪色更多的资源吗?我不知道:()

这是代码,如果我犯了任何错误(代码灵感来自团结论坛的主题)

// 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= 3*Interval && AccumulatedTime= 0 && AccumulatedTime = 2*Interval && 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; } } 

这是对象的样子:

在此处输入图像描述

假设您的代码很好,问题很可能来自您的材料设置。 在Unity 5中更改了此项。要更改Mesh Renderer的Alpha,还必须将材质的渲染模式不透明 (默认)更改为淡化

透明模式也很好,但不会完全透明,会导致问题出现问题

您可以从脚本更改模式。

物业名称_Mode

使用Debug.Log(MyRenderer.material.GetFloat("_Mode")); ,我得到了以下价值观:

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

我们可以使用MyRenderer.material.SetFloat("_Mode",2);渲染模式更改为淡入淡出MyRenderer.material.SetFloat("_Mode",2);

从脚本设置渲染模式时存在已知问题 。 您还必须更新所有其他属性以使更改生效。 以下是将渲染模式从脚本更改为淡入淡出的完整方法:

 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 }