Unity多物体碰撞冲突限制:实现立方体被首个触碰者吸引
解决方案:立方体仅飞向首个触碰对象
核心问题是缺少归属状态追踪,导致同时触发时两个吸引逻辑并行执行。以下是修复后的实现:
修改思路
- 添加状态变量记录首个触碰的对象(立方体归属者)
- 触发时仅在未被认领的情况下设置归属
- 统一更新逻辑,仅响应当前归属者的吸引操作
- 复用重复代码,提升可维护性
修复后代码
[SerializeField] private Transform _cube; [SerializeField] private Transform _playerParent; [SerializeField] private Transform _enemyParent; private Rigidbody _rigidbody; // 记录首个触碰的对象,标记立方体归属 private Transform _currentOwner; private void Start() { _rigidbody = GetComponent<Rigidbody>(); } public void OnTriggerEnter(Collider collider) { // 仅当立方体未被认领时,才设置归属 if (_currentOwner != null) return; if (collider.CompareTag("Player")) { _currentOwner = collider.transform; } else if (collider.CompareTag("Enemy")) { _currentOwner = collider.transform; } } private void FixedUpdate() { if (_currentOwner == null) return; // 根据归属者标签执行对应逻辑 if (_currentOwner.CompareTag("Player")) { MoveToOwner(_playerParent); } else if (_currentOwner.CompareTag("Enemy")) { MoveToOwner(_enemyParent); } } // 复用移动逻辑,避免代码重复 private void MoveToOwner(Transform targetParent) { _cube.position = Vector3.MoveTowards(_cube.position, targetParent.position, 0.02f); _cube.rotation = targetParent.rotation; _rigidbody.isKinematic = true; _cube.SetParent(targetParent); }
关键修改说明
- 归属状态追踪:
_currentOwner变量确保只有第一个触碰的对象能获得立方体控制权,后续触碰不会覆盖。 - 触发逻辑优化:
OnTriggerEnter中先判断是否已被认领,避免重复赋值。同时用CompareTag替代直接字符串比较,性能更优。 - 统一更新逻辑:FixedUpdate仅处理当前归属者的移动,不会同时执行玩家和敌人的吸引逻辑。
- 代码复用:将移动、旋转、设置父物体的逻辑抽成
MoveToOwner方法,减少冗余代码,便于后续修改。
内容的提问来源于stack exchange,提问作者Roman Babenko
相关产品推荐
相关产品推荐

