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

跑酷游戏中已激活对象的速度分配异常问题

跑酷游戏角色激活与速度传递问题解决方案

问题核心

  • 激活角色碰撞近距离未激活角色群时,仅首个被激活的角色能获得速度,后续角色无法通过链式激活传递速度
  • 激活角色通过AddForce持续加速,直接给未激活角色加力会导致激活角色被甩远,现有速度赋值逻辑仅生效一次,且新激活角色的碰撞检测未正常触发

现有代码问题分析

  • 未激活角色的Stickman组件处于禁用状态,激活后未及时启用该组件,导致其碰撞检测回调(OnTriggerEnter/Stay)无法触发,无法继续激活后续角色
  • 仅在激活瞬间给未激活角色设置一次速度,未同步激活角色的持续加速状态,新角色会逐渐掉队
  • 碰撞检测逻辑存在冗余判断,多次重复获取组件,影响性能

解决方案

1. 修复碰撞检测触发逻辑

激活未激活角色时,优先启用其Stickman组件,确保碰撞检测回调能正常工作,实现链式激活。

2. 持续同步速度而非单次赋值

在OnTriggerStay中持续同步激活角色的速度给已激活的角色,避免掉队,同时不使用AddForce,不会干扰激活角色的移动状态。

3. 简化逻辑判断

优化碰撞检测的条件判断,减少重复的组件获取操作,提升代码效率。

修改后的代码

using UnityEngine;

public class Stickman : MonoBehaviour
{
    private Rigidbody _rigidbody;

    private void Start()
    {
        _rigidbody = GetComponent<Rigidbody>();
    }

    private void OnTriggerEnter(Collider collider)
    {
        TryProcessCollider(collider);
    }

    private void OnTriggerStay(Collider other)
    {
        TryProcessCollider(other);
    }

    // 合并激活与速度同步逻辑
    private void TryProcessCollider(Collider targetCollider)
    {
        if (!enabled) return;

        var targetStickman = targetCollider.GetComponent<Stickman>();
        var targetMover = targetCollider.GetComponent<StickmanMover>();
        var targetRb = targetCollider.GetComponent<Rigidbody>();

        if (targetStickman == null || targetMover == null || targetRb == null) return;

        // 未激活则执行激活流程
        if (!targetMover.enabled)
        {
            ActivateTarget(targetCollider, targetRb);
        }
        // 已激活则同步速度,避免掉队
        else
        {
            SyncTargetVelocity(targetRb);
        }
    }

    private void ActivateTarget(Collider collider, Rigidbody targetRb)
    {
        var stickman = collider.GetComponent<Stickman>();
        var mover = collider.GetComponent<StickmanMover>();
        var animator = collider.GetComponent<StickmanAnimator>();
        var renderer = collider.GetComponentInChildren<Renderer>();

        // 先启用Stickman组件,确保碰撞检测能触发链式激活
        stickman.enabled = true;
        mover.enabled = true;
        animator.enabled = true;
        renderer.material.color = Color.yellow;

        // 初始同步速度
        SyncTargetVelocity(targetRb);
    }

    // 统一速度同步方法,仅同步前进方向速率
    private void SyncTargetVelocity(Rigidbody targetRb)
    {
        var currentForwardSpeed = _rigidbody.velocity.magnitude;
        targetRb.velocity = Vector3.forward * currentForwardSpeed;
    }
}

额外优化建议

  • 给角色设置专属碰撞Layer,过滤无关碰撞检测,提升性能
  • 给已激活角色添加状态标记,避免重复执行速度同步操作
  • 角色群数量较多时,可使用Physics.OverlapSphere批量检测附近未激活角色,优化链式激活效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:43:21