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

Unity中如何让两个GameObject始终保持相同的Y值(C#实现)

实现脚本生成Cube与手动Cube Y轴同步的方案

嘿,这个需求挺常见的,我给你两种实用的实现思路,你可以根据项目情况选:


方法一:每帧实时同步(简单直接)

这种方式最容易上手,适合场景里物体不多的情况,直接在脚本生成的Cube的脚本里,每帧更新它的Y轴和手动Cube保持一致。

步骤:

  1. 在场景里给你的手动Cube加个标签(比如叫"ManualCube"),或者直接记住它的名字;
  2. 给脚本生成的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轴,这样不用每帧都跑代码。

步骤:

  1. 给手动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);
        }
    }
}
  1. 给生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:22:25