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

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);
}

关键修改说明

  1. 归属状态追踪:_currentOwner变量确保只有第一个触碰的对象能获得立方体控制权,后续触碰不会覆盖。
  2. 触发逻辑优化:OnTriggerEnter中先判断是否已被认领,避免重复赋值。同时用CompareTag替代直接字符串比较,性能更优。
  3. 统一更新逻辑:FixedUpdate仅处理当前归属者的移动,不会同时执行玩家和敌人的吸引逻辑。
  4. 代码复用:将移动、旋转、设置父物体的逻辑抽成MoveToOwner方法,减少冗余代码,便于后续修改。

内容的提问来源于stack exchange,提问作者Roman Babenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:39:39