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

如何检测脚下地面是否移动?非父子化实现角色控制器随移动物体同步移动

角色控制器随移动物体同步移动(无需父子化)

不用SetParent()的核心思路是手动计算移动物体的位移/旋转增量,直接应用到角色位置上,避免父子化继承父物体缩放、旋转带来的异常。针对你的场景,调整代码如下:

最终实现代码

public Transform rotateObj; 
public GameObject Player;
Vector3 lastObjPos;
Vector3 playerLocalPos;
bool isOnRotatingObj;

void Start()
{
    lastObjPos = rotateObj.position; 
}

void Update()
{
    // 保留你的物体旋转逻辑
    transform.Rotate(RotateAmount * speed * Time.deltaTime);

    // 计算移动物体这一帧的位移增量
    Vector3 objPositionDelta = rotateObj.position - lastObjPos;
    lastObjPos = rotateObj.position;

    RaycastHit hit;
    bool isCurrentlyOnObj = false;
    // 从角色位置向下射线,检测是否站在目标旋转物体上
    if (Physics.Raycast(Player.transform.position, Vector3.down, out hit, 1.2f))
    {
        if (hit.transform == rotateObj)
        {
            isCurrentlyOnObj = true;
            if (!isOnRotatingObj)
            {
                // 首次站上去时,记录角色相对于旋转物体的局部位置
                playerLocalPos = rotateObj.InverseTransformPoint(Player.transform.position);
            }
            // 用物体当前的变换更新角色位置:局部位置转世界坐标 + 位移增量
            Player.transform.position = rotateObj.TransformPoint(playerLocalPos) + objPositionDelta;
        }
    }
    isOnRotatingObj = isCurrentlyOnObj;
}

关键逻辑说明

  1. 位移增量计算:每一帧对比旋转物体的当前位置和上一帧位置,得到位移增量,直接加到角色位置上,保证角色跟随物体平移。
  2. 旋转适配:当角色首次站在旋转物体上时,记录角色在物体局部空间的位置;后续每一帧用物体的当前旋转,将这个局部位置转换为世界坐标,确保角色随物体旋转同步移动。
  3. 射线检测优化:从角色位置向下发射射线,精准判断角色是否站在目标物体上,避免误触发其他物体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:02:39