Unity触发器未检测物体进入/退出问题求助
解决Unity触发器OnTriggerEnter2D/Exit2D不触发问题
针对你的场景(挂载脚本的物体已将Circle Collider设为Trigger,目标物体带BoxCollider2D),以下是排查和修复步骤:
必须添加Rigidbody2D组件:Unity 2D触发器事件要求至少一方带有Rigidbody2D组件:
- 若给敌方物体添加,需将Rigidbody2D的
Body Type设为Dynamic(不能是Kinematic,除非手动控制运动并启用Use Full Kinematic Contacts) - 若给塔(挂载脚本的物体)添加,可设为
Kinematic,但必须勾选Rigidbody2D的Use Full Kinematic Contacts选项
- 若给敌方物体添加,需将Rigidbody2D的
检查Layer碰撞矩阵:打开
Edit > Project Settings > Physics2D,确认塔所在Layer与敌方物体的Layer在碰撞矩阵中是相互勾选允许碰撞的,禁用的Layer组合不会触发触发器事件确认碰撞体设置:
- 塔的Circle Collider2D确实勾选
Is Trigger,且大小、位置覆盖有效触发区域 - 敌方的BoxCollider2D不要勾选
Is Trigger(两个Trigger之间不会触发OnTrigger事件),同时确保碰撞体大小、位置正确包裹敌方物体
- 塔的Circle Collider2D确实勾选
验证脚本挂载与方法签名:
- 确认脚本正确挂载在带有Circle Collider2D的塔物体上
- 检查
OnTriggerEnter2D和OnTriggerExit2D方法签名:必须为private void OnTriggerEnter2D(Collider2D col),大小写正确,参数类型为Collider2D(而非Collider)
代码优化建议(可选)
当前Update方法中重复执行颜色设置会造成不必要的性能消耗,且目标移除后不会恢复颜色,可修改为仅在目标列表变化时处理高亮:
using System.Collections.Generic; using UnityEngine; public class TowerTargeting : MonoBehaviour { public List<GameObject> targets = new List<GameObject>(); private GameObject lastHighlightedTarget; private void OnTriggerEnter2D(Collider2D col) { Debug.Log("Enemy Found"); targets.Add(col.gameObject); UpdateTargetHighlight(); } private void OnTriggerExit2D(Collider2D col) { Debug.Log("Enemy Lost"); targets.Remove(col.gameObject); if (col.gameObject == lastHighlightedTarget) { col.gameObject.GetComponent<SpriteRenderer>().color = Color.white; lastHighlightedTarget = null; } UpdateTargetHighlight(); } private void UpdateTargetHighlight() { if (lastHighlightedTarget != null) { lastHighlightedTarget.GetComponent<SpriteRenderer>().color = Color.white; } if (targets.Count > 0) { lastHighlightedTarget = targets[0]; lastHighlightedTarget.GetComponent<SpriteRenderer>().color = Color.blue; } } }
内容的提问来源于stack exchange,提问作者Maddox Fox
相关产品推荐
相关产品推荐

