Unity中如何让一个物体的Y坐标始终匹配另一物体的Y坐标
原代码问题排查
你贴的代码无法正常运行,存在几个明确问题:
- 缺少字段声明:类中没有定义
pongAI、pongBall两个变量,编译阶段就会报错,运行时会直接抛出空引用异常。 - 生命周期函数选错:如果
pongBall是通过刚体物理驱动移动的,把位置同步逻辑写在Update里,会因为Update和物理帧FixedUpdate的执行频率不一致,出现AI位置抖动、同步滞后的问题。 - 冗余调用:如果脚本是直接挂载在
pongAI对象上,不需要每次都通过pongAI.transform获取自身变换组件,直接调用内置的transform属性即可,减少不必要的性能开销。 - 缺少边界限制(Pong游戏通用逻辑缺失):直接同步Y值会让AI球拍跟着球跑出球场范围,不符合常规Pong玩法逻辑。
正确实现代码
以下代码直接挂载到pongAI对象上即可,支持物理帧同步、空值保护、可选平滑移动和边界限制:
using UnityEngine; public class COMPLEXAI : MonoBehaviour { [Tooltip("场景中的乒乓球对象")] public Transform pongBall; [Tooltip("AI移动速度,值越大跟随越紧,设为0则直接瞬移同步")] public float followSpeed = 8f; [Tooltip("AI球拍Y轴可移动的最小边界,根据自己的球场尺寸调整")] public float minY = -4f; [Tooltip("AI球拍Y轴可移动的最大边界,根据自己的球场尺寸调整")] public float maxY = 4f; // 球为物理刚体驱动时用FixedUpdate同步 void FixedUpdate() { if (pongBall == null) return; // 计算目标位置:保留自身X、Z坐标,Y坐标同步球的位置并限制在边界内 float targetY = Mathf.Clamp(pongBall.position.y, minY, maxY); Vector3 targetPos = new Vector3(transform.position.x, targetY, transform.position.z); if (followSpeed <= 0) { // 无延迟瞬移同步,和你最初的逻辑效果一致 transform.position = targetPos; } else { // 平滑跟随,AI表现更自然不会过于死板 transform.position = Vector3.Lerp(transform.position, targetPos, followSpeed * Time.fixedDeltaTime); } } // 如果球是直接修改Transform做非物理移动,把上面FixedUpdate的逻辑移到Update里即可 }
使用说明
- 脚本挂载完成后,在Inspector面板把场景中的
pongBall对象拖到对应公开字段的槽位上,即可解决变量未定义的报错。 - 如果不需要边界限制,直接把
Mathf.Clamp(pongBall.position.y, minY, maxY)替换为pongBall.position.y即可。 - 如果需要AI难度可调,直接调整
followSpeed参数即可:速度越低AI反应越慢、越容易漏球,速度越高AI越强。
内容的提问来源于stack exchange,提问作者Yetam
相关产品推荐
相关产品推荐

