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
相关产品推荐
相关产品推荐

