Unity中如何让两个GameObject始终保持相同的Y值(C#实现)
实现脚本生成Cube与手动Cube Y轴同步的方案
嘿,这个需求挺常见的,我给你两种实用的实现思路,你可以根据项目情况选:
方法一:每帧实时同步(简单直接)
这种方式最容易上手,适合场景里物体不多的情况,直接在脚本生成的Cube的脚本里,每帧更新它的Y轴和手动Cube保持一致。
步骤:
- 在场景里给你的手动Cube加个标签(比如叫"ManualCube"),或者直接记住它的名字;
- 给脚本生成的Cube挂载下面这个脚本:
using UnityEngine; public class SyncYPosition : MonoBehaviour { // 可以直接在Inspector面板拖入你的手动Cube,比查找更可靠 public Transform manualCube; void Update() { if (manualCube == null) { // 如果没拖入,就通过标签查找(记得先给手动Cube加对应标签) manualCube = GameObject.FindWithTag("ManualCube")?.transform; return; } // 保持当前物体的X、Z不变,只同步Y轴 Vector3 newPos = transform.position; newPos.y = manualCube.position.y; transform.position = newPos; } }
注意点:
- 优先选择在Inspector拖入
manualCube,比运行时查找性能更好,也更稳定; - Update每帧都会执行,如果你场景里有大量这样的物体,可能会有点性能开销,这时候可以看第二种方法。
方法二:监听位置变化(性能更优)
如果你的手动Cube不是每帧都在动,或者你想减少不必要的计算,可以给手动Cube加个脚本,当它的位置变化时,再通知生成的Cube同步Y轴,这样不用每帧都跑代码。
步骤:
- 给手动Cube挂载这个监听脚本:
using UnityEngine; using System; public class CubePositionNotifier : MonoBehaviour { // 定义一个事件,当Y轴变化时触发 public event Action<float> OnYPositionChanged; private float lastYPos; void Start() { lastYPos = transform.position.y; } void Update() { float currentY = transform.position.y; if (Mathf.Abs(currentY - lastYPos) > 0.001f) // 避免浮点精度问题 { lastYPos = currentY; OnYPositionChanged?.Invoke(currentY); } } }
- 给生成的Cube挂载同步脚本:
using UnityEngine; public class ListenSyncY : MonoBehaviour { public Transform manualCube; private CubePositionNotifier positionNotifier; void Start() { if (manualCube == null) { manualCube = GameObject.FindWithTag("ManualCube")?.transform; if (manualCube == null) return; } positionNotifier = manualCube.GetComponent<CubePositionNotifier>(); if (positionNotifier != null) { // 订阅事件,当Y轴变化时同步 positionNotifier.OnYPositionChanged += SyncY; // 初始化时先同步一次 SyncY(manualCube.position.y); } } void SyncY(float newY) { Vector3 newPos = transform.position; newPos.y = newY; transform.position = newPos; } // 记得取消订阅,避免内存泄漏 void OnDestroy() { if (positionNotifier != null) { positionNotifier.OnYPositionChanged -= SyncY; } } }
优势:
只有当手动Cube的Y轴真的变化时,才会执行同步逻辑,性能开销更小,适合复杂场景。
不管用哪种方法,只要确保脚本生成的Cube能正确获取到手动Cube的引用,就能实现完美的Y轴同步啦~
内容的提问来源于stack exchange,提问作者jonesmax
相关产品推荐
相关产品推荐

