You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity触发检测问题:立方体触碰Checkpoint平面时颜色无变化求助

排查Unity触发后材质颜色不变化的问题

我来帮你梳理一下这个问题,你已经写了基础的触发逻辑,但颜色没生效大概率是几个常见的小细节没注意到,咱们一步步来解决:

1. 先确认触发逻辑是否真的执行了

先看Unity控制台有没有输出Checkpoint Reached:

  • 如果没有输出,说明触发事件根本没触发,优先解决这个核心问题:
    • 确保Checkpoint平面的Collider组件勾选了Is Trigger
    • 确保玩家立方体有Collider组件(不需要勾选Is Trigger),并且添加了Rigidbody组件(哪怕设置为Is Kinematic也可以,Unity触发事件要求至少一方带有Rigidbody)
    • 检查玩家立方体的Tag确实是Player,注意大小写和拼写,别出现笔误

2. 材质属性名的坑(最常见原因)

你用的是Unity Standard材质,不同版本的属性名有区别:

  • Unity 2019及以后的版本,Standard材质的Albedo颜色对应的属性名是_BaseColor,而不是旧版本的_Color!
  • 把代码里的"_Color"改成"_BaseColor",大概率就能解决颜色不生效的问题。

3. 确认Renderer组件的获取是否正确

你的代码里colorRenderer = GetComponent<Renderer>();是获取Checkpoint平面自身的Renderer:

  • 确保这个平面确实挂了Mesh Renderer组件(在Inspector面板能看到)
  • 确保脚本是直接挂在Checkpoint平面上的,不是挂在玩家或者其他无关物体上

修正后的代码

我给你调整了一下代码,用CompareTag比直接字符串相等更高效,也能避免空引用问题:

public class Checkpoint : MonoBehaviour 
{
    Renderer colorRenderer;

    void Start() 
    {
        colorRenderer = GetComponent<Renderer>();
        // 可以取消下面注释,测试初始颜色是否生效,验证Renderer是否正常
        // colorRenderer.material.SetColor("_BaseColor", Color.blue);
    }

    void OnTriggerEnter(Collider collider) 
    {
        if(collider.gameObject.CompareTag("Player"))
        {
            colorRenderer.material.SetColor("_BaseColor", Color.green);
            Debug.Log("Checkpoint Reached");
        }
    }
}

额外小提示

  • 如果多个物体共享同一个Standard材质,用material会创建一个材质实例(只修改当前物体的颜色),如果想修改共享材质影响所有关联物体,用sharedMaterial,但触发场景下一般用material就足够
  • 检查一下Checkpoint平面的Mesh Renderer有没有被禁用(Inspector里的复选框是否勾选)

内容的提问来源于stack exchange,提问作者Shafee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:22:05