ere*_*ger 2 camera triggers renderer unity-game-engine
void OnTriggerStay(Collider other)
{
if (other.gameObject.CompareTag("tree"))
{
Color color = other.gameObject.GetComponent<Renderer>().material.color;
color.a = 0.5f;
}
}
Run Code Online (Sandbox Code Playgroud)
如果带有“树”标签的对象进入相机的触发器,我希望该对象的不透明度为 0.5。但没有成功。我怎样才能解决这个问题?谢谢。
虽然其他两个答案在技术上是正确的,但您很可能错过了允许更改 a 的 alpha 的非常重要的步骤Material。我将猜测并假设您Material使用Asset Creation Menu. 默认情况下,Material RenderMode设置为Opaque。
为了允许更改Material颜色的 Alpha,您需要将或设置RenderMode为。如果您使用自定义着色器,则需要更改代码以格式化为上述之一。如果您需要帮助修改着色器,最好在新问题中得到回答。TransparentFadeRenderTypes
为了清楚起见,这里有一张 gif 来说明可能出现的混乱情况:
编辑:为了完整性,这里有一个完整的脚本,RenderMode如果您不想在编译时更改它,它将在运行时切换您的材料。
using UnityEngine;
public static class MaterialUtils
{
public enum BlendMode
{
Opaque,
Cutout,
Fade,
Transparent
}
public static void SetupBlendMode(Material material, BlendMode blendMode)
{
switch (blendMode)
{
case BlendMode.Transparent:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
material.SetFloat("_Mode", 3.0f);
break;
case BlendMode.Opaque:
material.SetOverrideTag("RenderType", "");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = -1;
material.SetFloat("_Mode", 0.0f);
break;
default:
Debug.LogWarning("Warning: BlendMode: " + blendMode + " is not yet implemented!");
break;
}
}
}
[RequireComponent(typeof(MeshRenderer))]
public class TestScript : MonoBehaviour
{
[SerializeField] private MeshRenderer mr = null;
[SerializeField] private float alphaChange = 0.5f;
private bool isOpaque = true;
private void Awake()
{
if (mr == null)
mr = GetComponent<MeshRenderer>();
}
private void OnMouseDown()
{
// store our color struct and change the alpha channel
Color clr = mr.material.color;
clr.a = alphaChange;
// instance our material to alter the rendermode
Material mat = mr.material;
// update our render mode to transparent and our color to the new alpha
MaterialUtils.SetupBlendMode(mat, isOpaque ? MaterialUtils.BlendMode.Transparent : MaterialUtils.BlendMode.Opaque);
mat.color = clr;
// apply our material change
mr.material = mat;
// toggle our bool
isOpaque = !isOpaque;
}
}
Run Code Online (Sandbox Code Playgroud)
您最初的问题没有说明您是否需要将材质切换回不透明,但我将其包括在内。您可以保留RenderModeasTransparent并简单地将 alpha 更改回 ,1.0f使其再次完全不透明。同样,下面是上述脚本实际运行的 gif 示例:
为了表明该代码片段正在运行,我在立方体后面放置了 2 个球体。对于您所需要的内容来说,该片段可能有点过分了,但是如果其他人偶然发现了这个问题并且需要一个更通用的答案,那就是!
| 归档时间: |
|
| 查看次数: |
4714 次 |
| 最近记录: |