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

Unity仿过山车大亨:基于相机方向实现轨道预制件偏移定位

解决Unity过山车大亨克隆的轨道定位问题

核心思路

把相机的水平方向转换到最后一段轨道的局部坐标系中,以此判断玩家想要的轨道延伸/偏移方向,再基于轨道自身的轴计算新位置。

快速实现步骤

  • 获取最后放置轨道的Transform组件,作为参考坐标系
  • 提取相机的水平方向(忽略Y轴高度,保证只在地面平面判断方向):
    Vector3 camHorizontalForward = Camera.main.transform.forward;
    camHorizontalForward.y = 0;
    camHorizontalForward.Normalize();
    
  • 将相机的世界方向转换为轨道的局部方向,这样就能用轨道自身的前后(Z轴)、左右(X轴)来判断偏移:
    Vector3 localCamDir = lastPlacedTrack.InverseTransformDirection(camHorizontalForward);
    
  • 根据局部方向的分量大小,确定偏移方向:
    • 如果localCamDir.z的绝对值更大:沿轨道前后方向偏移
    • 如果localCamDir.x的绝对值更大:沿轨道左右方向偏移
  • 计算新轨道的位置,用轨道的TransformPoint方法把局部偏移转成世界坐标:
    float offsetDistance = 2f; // 轨道间的偏移距离,可调整
    Vector3 localOffset = Vector3.zero;
    
    if (Mathf.Abs(localCamDir.z) > Mathf.Abs(localCamDir.x))
    {
        localOffset.z = offsetDistance * Mathf.Sign(localCamDir.z);
    }
    else
    {
        localOffset.x = offsetDistance * Mathf.Sign(localCamDir.x);
    }
    
    Vector3 newTrackPosition = lastPlacedTrack.TransformPoint(localOffset);
    
  • 最后实例化新轨道到newTrackPosition,旋转角度和最后一段轨道保持一致(如果是转弯轨道,可根据偏移方向调整旋转)

完整示例代码

public GameObject trackPrefab;
public Transform lastPlacedTrack;
public float trackSpacing = 2f;

public void PlaceNextTrack()
{
    if (lastPlacedTrack == null || trackPrefab == null) return;

    // 获取相机水平方向
    Vector3 camForward = Camera.main.transform.forward;
    camForward.y = 0;
    if (camForward.magnitude < 0.1f) return; // 避免相机垂直向下时出错
    camForward.Normalize();

    // 转换到轨道局部空间
    Vector3 localCamDir = lastPlacedTrack.InverseTransformDirection(camForward);

    // 计算局部偏移
    Vector3 localOffset = Vector3.zero;
    if (Mathf.Abs(localCamDir.z) > Mathf.Abs(localCamDir.x))
    {
        localOffset.z = trackSpacing * Mathf.Sign(localCamDir.z);
    }
    else
    {
        localOffset.x = trackSpacing * Mathf.Sign(localCamDir.x);
    }

    // 生成新轨道
    Vector3 newPos = lastPlacedTrack.TransformPoint(localOffset);
    GameObject newTrack = Instantiate(trackPrefab, newPos, lastPlacedTrack.rotation);
    lastPlacedTrack = newTrack.transform;
}

额外优化点

  • 如果需要支持转弯轨道,可以在判断方向后,给新轨道添加对应的旋转角度(比如左右偏移时,轨道旋转90度)
  • 可以加入射线检测,确保新轨道位置在地面上,避免悬空

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:20:40