如何检测脚下地面是否移动?非父子化实现角色控制器随移动物体同步移动
角色控制器随移动物体同步移动(无需父子化)
不用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; }
关键逻辑说明
- 位移增量计算:每一帧对比旋转物体的当前位置和上一帧位置,得到位移增量,直接加到角色位置上,保证角色跟随物体平移。
- 旋转适配:当角色首次站在旋转物体上时,记录角色在物体局部空间的位置;后续每一帧用物体的当前旋转,将这个局部位置转换为世界坐标,确保角色随物体旋转同步移动。
- 射线检测优化:从角色位置向下发射射线,精准判断角色是否站在目标物体上,避免误触发其他物体。
内容的提问来源于stack exchange,提问作者Wurdular
相关产品推荐
相关产品推荐

