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

如何实现两个GameObject受projectile碰撞时的互斥变色效果?

问题根源排查

你当前出现两个对象同时变红,大概率是两个原因:

  1. 碰撞回调逻辑没有区分当前碰撞到的具体是哪个目标对象,直接统一给两个对象都设置了红色
  2. 两个目标对象共用了同一个材质实例,修改一个的材质颜色时另一个也会同步变化

实现方案(基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:03