如何让运动学Rigidbody跟随非运动学Rigidbody且保留PingPong摆锤逻辑
问题根源
你的代码存在两处位置赋值逻辑冲突:
- 先通过
_base.MovePosition()将底座位置设置为玩家位置,但是下一行直接通过transform.position = Vector3.Lerp(...)把整个物体的位置硬修改到了固定的世界坐标Y轴区间,直接覆盖了之前的跟随逻辑 - 定义的pointA、pointB是固定的世界坐标,没有和玩家的实时位置绑定,自然无法实现「跟随玩家的同时做上下往复运动」的需求
修复方案
你需要把PingPong产生的上下偏移量叠加到玩家的实时位置上,而不是单独给摆锤赋值绝对位置,修改后的代码如下:
using UnityEngine; public class Pendulum : MonoBehaviour { [SerializeField] public Rigidbody _base; public Rigidbody _player; // 这里填入你要跟随的预制体父物体Rigidbody [Space] [SerializeField] public float _speed = 200; // 存储相对于玩家位置的上下Y轴偏移量,不使用固定世界坐标 public float offsetYMin = 0.2f; public float offsetYMax = 0.5f; void Start() { _base = GetComponent<Rigidbody>(); } void FixedUpdate() { // 1. 计算PingPong产生的Y轴动态偏移 float time = Mathf.PingPong(Time.time * _speed, 1); float currentOffsetY = Mathf.Lerp(offsetYMin, offsetYMax, time); // 2. 将偏移叠加到玩家实时位置,X、Z轴完全跟随玩家 Vector3 targetPosition = _player.position + new Vector3(0, currentOffsetY, 0); // 3. 统一用Rigidbody的MovePosition赋值,避免直接修改transform导致的物理计算异常 _base.MovePosition(targetPosition); } }
补充说明
- 不要同时混用
Rigidbody.MovePosition()和直接修改transform.position,两种位置修改方式同时使用会导致物理引擎计算异常,出现位置被意外覆盖的问题 - 如果需要底座跟随玩家的同时保持X、Z轴的相对偏移,可以在
targetPosition的计算逻辑中增加对应轴的偏移值即可 - 如果上下运动需要基于玩家的局部坐标系而非世界坐标系的Y轴,可以将偏移计算改为
_player.transform.TransformDirection(new Vector3(0, currentOffsetY, 0))
内容的提问来源于stack exchange,提问作者user17247507
相关产品推荐
相关产品推荐

