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

如何让运动学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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:36:04