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

动作游戏中角色攻击时自然移动的实现方法求助

角色攻击时自然移动且避免穿模的解决方案

方案1:Root Motion + 实时碰撞修正

保留Root Motion的自然动画过渡,同时通过碰撞检测动态调整移动距离,彻底解决穿模问题:

  • 开启Animator的Root Motion,确保攻击动画包含自然的位移曲线
  • 在OnAnimatorMove()方法中,每帧获取Root Motion的原始位移向量
  • 使用胶囊体射线检测(Physics.CapsuleCast)预判角色移动路径上的障碍物,检测范围匹配当前帧的位移长度
  • 若检测到障碍物,将位移向量修正为角色到障碍物的距离,再应用到角色Transform上
  • 额外处理:忽略角色自身碰撞体,避免误判
private Animator _animator;
private CapsuleCollider _capsule;
private LayerMask _obstacleMask;

void Awake() {
    _animator = GetComponent<Animator>();
    _capsule = GetComponent<CapsuleCollider>();
    _obstacleMask = LayerMask.GetMask("Obstacle", "Enemy");
}

void OnAnimatorMove() {
    AnimatorStateInfo attackState = _animator.GetCurrentAnimatorStateInfo(0);
    if (!attackState.IsTag("Attack")) return;

    // 获取Root Motion的帧位移
    Vector3 rawMotion = _animator.deltaPosition;
    if (rawMotion.magnitude < 0.01f) return;

    // 构建胶囊体检测的起点和终点
    float capsuleHalfHeight = _capsule.height * 0.5f;
    Vector3 start = transform.position + _capsule.center + Vector3.up * capsuleHalfHeight;
    Vector3 end = start + rawMotion.normalized * rawMotion.magnitude;

    // 检测路径上的障碍物
    if (Physics.CapsuleCast(start, start - Vector3.up * _capsule.height, _capsule.radius, 
        rawMotion.normalized, out RaycastHit hit, rawMotion.magnitude, _obstacleMask)) {
        // 修正位移至障碍物前
        rawMotion = rawMotion.normalized * hit.distance;
    }

    // 应用修正后的位移
    transform.Translate(rawMotion, Space.World);
}

方案2:动画分层 + 动态移动混合

拆分攻击动画为上下半身独立层,通过分层控制实现姿态与位移的灵活匹配:

  • 在Animator中创建两个Layer:UpperBodyAttack(权重1,播放上半身攻击动作)和LowerBodyMove(权重动态调整,播放移动步行动画)
  • 攻击触发时,上半身层锁定播放攻击动画;下半身层根据攻击方向和障碍物距离,选择对应步幅的移动动画(比如短步、半步)
  • 通过代码控制下半身层的动画进度和角色实际位移:当检测到障碍物时,切换为小步移动动画,同时限制位移不超过障碍物距离
  • 优势:完全摆脱Root Motion的固定位移限制,移动姿态与攻击动作自然融合

方案3:动画事件驱动的分段位移

将攻击移动拆分为多个动画事件触发的小幅度位移,每段位移前做障碍物检测:

  • 在攻击动画的关键帧(比如挥刀前、挥刀中、收刀阶段)添加动画事件
  • 每个事件触发时,执行一次短距离位移,位移前先检测目标方向的障碍物
  • 例如:挥刀前触发向前移动0.2米,若前方0.2米内有障碍物则只移动到障碍物前,无障碍物则正常移动
  • 配合动画根节点的微小偏移调整,让移动帧与动画帧完全对齐,消除滑行感

额外优化建议

  • 给攻击动画的位移曲线设置随节奏变化的速度(前摇快速移动,挥刀时减速),增强打击感
  • 障碍物检测时加入距离阈值(比如0.1米),避免角色紧贴障碍物导致的穿模或姿态异常
  • 若角色使用CharacterController,将修正后的位移通过Move()方法应用,而非直接修改Transform

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:20:31