Unity中如何将等距Tilemap的Vector3方向转换为常规角度方向?
Unity等距Tilemap方向转常规角度的解决方案
在使用独立于Tilemap的航点(通过LineRenderer绘制轨道)控制列车移动时,需要将计算得到的等距方向转换为常规角度(除以10后对应36张列车Sprite的索引),以下是实现方案:
核心转换函数
基于调整后的Shingo方案,适配你的等距Tilemap参数:
public static class IsometricDirectionConverter { // 等距Tilemap的角度系数,根据实际设置调整为60度的余弦值 public static float YFactor = Mathf.Cos(Mathf.Deg2Rad * 60f); /// <summary> /// 将等距空间下的方向向量转换为常规平面角度(范围0-360度) /// </summary> /// <param name="isoDirection">等距空间下的归一化方向向量</param> /// <returns>常规平面角度</returns> public static float ConvertIsometricDirectionToAngle(Vector3 isoDirection) { // 修正等距方向的Y轴分量,还原为常规平面的方向比例 Vector2 correctedDirection = new Vector2(isoDirection.x, isoDirection.y / YFactor); // 计算常规角度 float angle = Mathf.Atan2(correctedDirection.y, correctedDirection.x) * Mathf.Rad2Deg; // 将角度转换为0-360度的范围 if (angle < 0) { angle += 360f; } return angle; } }
结合现有代码使用
在你获取航点方向的逻辑后,添加转换步骤:
Vector3 targetPosition = trackPositions[currentWaypointIndex]; // Move the locomotive towards the target waypoint transform.position = Vector3.MoveTowards(transform.position, targetPosition, Mathf.Abs(speed) * Time.deltaTime); // Calculate the direction to the next waypoint Vector3 direction = (targetPosition - transform.position).normalized; // 转换为常规角度并除以10,匹配36张Sprite的索引 float normalizedAngle = IsometricDirectionConverter.ConvertIsometricDirectionToAngle(direction) / 10f; // 根据需求取整得到对应Sprite的索引 int spriteIndex = Mathf.RoundToInt(normalizedAngle);
关键调整说明
原方案中默认使用45度的余弦值作为YFactor,但根据你的等距Tilemap实际角度,将该值调整为60度的余弦值(Mathf.Cos(Mathf.Deg2Rad * 60f)),并明确声明为float类型,这是解决方向与列车Sprite不匹配问题的核心。
内容的提问来源于stack exchange,提问作者Jaxx0rr
相关产品推荐
相关产品推荐

