如何实现两个GameObject受projectile碰撞时的互斥变色效果?
问题根源排查
你当前出现两个对象同时变红,大概率是两个原因:
- 碰撞回调逻辑没有区分当前碰撞到的具体是哪个目标对象,直接统一给两个对象都设置了红色
- 两个目标对象共用了同一个材质实例,修改一个的材质颜色时另一个也会同步变化
实现方案(基于Unity引擎)
方案1:逻辑挂载在Projectile(球)上,适合固定2个目标的场景
- 首先给球挂载如下脚本,在Inspector面板拖入两个目标对象即可:
using UnityEngine; public class ProjectileHit : MonoBehaviour { // Inspector面板手动关联场景内的两个目标对象 public GameObject target1; public GameObject target2; private readonly Color _hitColor = Color.red; private readonly Color _normalColor = Color.white; // 如果用Trigger碰撞,改为OnTriggerEnter(Collider other),判断逻辑改为other.gameObject private void OnCollisionEnter(Collision collision) { if (collision.gameObject == target1) { target1.GetComponent<Renderer>().material.color = _hitColor; target2.GetComponent<Renderer>().material.color = _normalColor; } else if (collision.gameObject == target2) { target2.GetComponent<Renderer>().material.color = _hitColor; target1.GetComponent<Renderer>().material.color = _normalColor; } } }
方案2:逻辑挂载在目标对象上,适合目标数量可能扩展的场景
- 给两个目标对象都挂载同一个脚本,无需手动关联对象:
using UnityEngine; public class HitColorChange : MonoBehaviour { // 静态变量自动收集所有同类型目标 private static HitColorChange[] _allTargets; private Renderer _targetRenderer; private readonly Color _hitColor = Color.red; private readonly Color _normalColor = Color.white; private void Awake() { _targetRenderer = GetComponent<Renderer>(); _allTargets = FindObjectsOfType<HitColorChange>(); SetColor(_normalColor); } private void SetColor(Color color) { _targetRenderer.material.color = color; } // 如果用Trigger碰撞,改为OnTriggerEnter(Collider other) private void OnCollisionEnter(Collision collision) { // 提前给球设置标签为Projectile做判断 if (collision.gameObject.CompareTag("Projectile")) { foreach (var target in _allTargets) { target.SetColor(target == this ? _hitColor : _normalColor); } } } }
注意事项
- 两个目标对象不要共用同一个材质资源,要各自使用独立的材质实例,否则修改颜色会同步生效
- 所有参与碰撞的对象都需要挂载Collider组件,球需要额外挂载Rigidbody组件才能触发碰撞回调
内容的提问来源于stack exchange,提问作者Rekun1Love
相关产品推荐
相关产品推荐

