Unity触发检测问题:立方体触碰Checkpoint平面时颜色无变化求助
排查Unity触发后材质颜色不变化的问题
我来帮你梳理一下这个问题,你已经写了基础的触发逻辑,但颜色没生效大概率是几个常见的小细节没注意到,咱们一步步来解决:
1. 先确认触发逻辑是否真的执行了
先看Unity控制台有没有输出Checkpoint Reached:
- 如果没有输出,说明触发事件根本没触发,优先解决这个核心问题:
- 确保Checkpoint平面的Collider组件勾选了
Is Trigger - 确保玩家立方体有
Collider组件(不需要勾选Is Trigger),并且添加了Rigidbody组件(哪怕设置为Is Kinematic也可以,Unity触发事件要求至少一方带有Rigidbody) - 检查玩家立方体的Tag确实是
Player,注意大小写和拼写,别出现笔误
- 确保Checkpoint平面的Collider组件勾选了
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
相关产品推荐
相关产品推荐

