Unity中OnTriggerEnter检测指定外部对象碰撞的代码实现问题求助
正确实现Unity中球与两个触发器的碰撞检测
首先,你的代码里有几个明显的问题导致它无法运行:
- 拼写错误:
colission应该是collision,而且LeftHitTrigger.collision这种写法本身就不对——GameObject类并没有名为collision的属性,你没法这么直接访问。 - 语法错误:条件判断里用逗号分隔两个条件是C#不允许的,需要用逻辑与运算符
&&来连接。 - 逻辑偏差:你需要明确判断的是「碰撞发生时,进入触发器的对象是球」,同时「当前触发碰撞的是LeftHitTrigger还是RightHitTrigger」(或者反过来,取决于你的脚本挂载位置)。
下面给出两种常见的正确实现方式,你可以根据自己的需求选择:
方式一:脚本挂载在球上
如果你的脚本是挂在球对象上,那么OnTriggerEnter的参数collision就是触发碰撞的那个触发器对象(LeftHitTrigger或RightHitTrigger),代码可以这么写:
public GameObject LeftHitTrigger; public GameObject RightHitTrigger; public int AiCount = 0; public int AvatarCount = 0; public Text AiCountText; public Text AvatarCountText; private void OnTriggerEnter(Collider collision) { // 检查碰撞的对象是否是LeftHitTrigger if (collision.gameObject == LeftHitTrigger) { AiCount++; Debug.Log($"AI击中次数:{AiCount}"); AiCountText.text = AiCount.ToString(); } // 检查碰撞的对象是否是RightHitTrigger else if (collision.gameObject == RightHitTrigger) { AvatarCount++; Debug.Log($"玩家击中次数:{AvatarCount}"); AvatarCountText.text = AvatarCount.ToString(); } }
方式二:脚本分别挂载在两个触发器上
如果不想在球上挂载脚本,也可以把脚本分别挂在LeftHitTrigger和RightHitTrigger上,这样不需要预设变量,直接检测进入触发器的是球即可:
public int HitCount = 0; public Text CountText; // 在Inspector面板中给LeftHitTrigger勾选这个,RightHitTrigger不勾选 public bool IsAiTrigger; private void OnTriggerEnter(Collider collision) { // 先判断进入的是球 if (collision.CompareTag("Ball")) { if (IsAiTrigger) { HitCount++; Debug.Log($"AI击中次数:{HitCount}"); } else { HitCount++; Debug.Log($"玩家击中次数:{HitCount}"); } CountText.text = HitCount.ToString(); } }
额外注意事项:
- 确保你的球和两个触发器对象都勾选了Is Trigger(在Collider组件里)。
- 球对象需要有Rigidbody组件(即使是静态碰撞,也需要勾选Is Kinematic),否则触发事件不会生效。
- 标签"Ball"要确保已经在Unity编辑器中创建,并且正确赋值给球对象。
内容的提问来源于stack exchange,提问作者Artem Biriukov
相关产品推荐
相关产品推荐

