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

Unity C# 角色水平线路切换异常:Y轴旋转后功能失效

问题分析与解决方案

问题出在你使用了世界空间坐标系的Vector3.left和Vector3.right计算线路偏移。当角色沿Y轴旋转后,角色自身的左右方向和世界空间的左右方向完全脱节,直接导致移动逻辑失效。

修正思路

改用角色本地坐标系的方向向量——_cachedTransform.right(角色自身右侧)和-_cachedTransform.right(角色自身左侧),这样无论角色怎么旋转,移动方向都会始终匹配角色自身的左右朝向。

修正后的代码

Vector3 currentPosition = _cachedTransform.position;
Vector3 targetPosition = currentPosition;

// 基于角色本地坐标系计算目标线路位置
switch (_desiredLine)
{
    case 0:
        // 第一条线路:角色本地左侧偏移
        targetPosition += -_cachedTransform.right * _lineDistance;
        break;
    case 2:
        // 第三条线路:角色本地右侧偏移
        targetPosition += _cachedTransform.right * _lineDistance;
        break;
    // case 1 保持当前位置,无需额外操作
}

// 仅在左右方向平滑插值(保留原前后、高度位置)
targetPosition = new Vector3(targetPosition.x, currentPosition.y, currentPosition.z);
targetPosition = Vector3.Lerp(currentPosition, targetPosition, _lineBlendSpeed * Time.fixedDeltaTime);

_rigidbody.MovePosition(targetPosition);

关于TransformDirection的误区

你之前尝试的TransformDirection方法没生效,大概率是用法错误——这个方法是用来把本地空间方向转换为世界空间方向,而你需要的是直接使用角色自身的本地方向(_cachedTransform.right本身就是世界空间下的角色右侧方向),不需要额外转换。

更严谨的写法(可选)

如果需要严格固定角色在前后和高度方向的位置,避免插值时出现不必要的偏移,可以通过本地坐标转换实现:

Vector3 currentLocalPos = _cachedTransform.InverseTransformPoint(_cachedTransform.position);

// 直接修改本地坐标的X轴(对应角色左右方向)
currentLocalPos.x = _desiredLine switch
{
    0 => -_lineDistance,
    2 => _lineDistance,
    _ => 0
};

Vector3 targetPosition = _cachedTransform.TransformPoint(currentLocalPos);
targetPosition = Vector3.Lerp(_cachedTransform.position, targetPosition, _lineBlendSpeed * Time.fixedDeltaTime);

_rigidbody.MovePosition(targetPosition);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:27:16