【发布时间】:2021-04-10 10:04:45
【问题描述】:
我正在制作一个 3D 益智视频游戏,当拼图接近其原始位置时,我希望在其原始位置显示拼图的半透明副本。换句话说,向玩家展示他们在正确的轨道上。
我已经这样做了,它工作正常,here's a 4 second quick gif for demonstration。
但是,当我将游戏部署到 WebGL 时,它不起作用。 The copy of the object which should be translucent simply isn't.
这是我用来创建对象的半透明副本的函数。我在this forum thread.找到了代码
基本上我正在做的是实例化一个副本,删除不必要的组件,手动更改材质设置以使对象使用透明渲染模式,将不透明度更改为 0,然后禁用渲染器,因为由于某种原因对象是不透明度设置为 0 时不完全透明。
GameObject CreateHighlight(GameObject gameObject)
{
GameObject highlight = Instantiate(gameObject);
Destroy(highlight.GetComponent<Rigidbody>());
Destroy(highlight.GetComponent<MeshCollider>());
Destroy(highlight.GetComponent<StayInside>());
Destroy(highlight.GetComponent<ObjectControl>());
// Change render mode to Transparent
Material material = highlight.GetComponent<Renderer>().material;
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
// Change alpha to 0
highlight.GetComponent<MeshRenderer>().material.color = new Color(1.0f, 1.0f, 1.0f, 0.0f);
// Stop rendering the object because setting alpha to 0 does not make the object fully transparent
highlight.GetComponent<MeshRenderer>().enabled = false;
return highlight;
}
我偶然发现了这个Reddit thread,他遇到了和我一样的问题。他说他把渲染路径从Deferred切换到Forward。我发现某个地方应该更改MainCamera 中的设置,所以我做到了。我的设置为Use Graphics Settings,所以我明确地将其设置为Forward,但没有任何改变。
【问题讨论】:
标签: unity3d transparency opacity transparent unity-webgl