Unity - 调整一个游戏对象的大小以匹配另一个

Unity - Resizing one GameObject to match another

我正在 Unity 中开展一个项目,该项目涉及将任何非静态对象从一个传送到配对的区域。那部分很好,但为了方便起见,我正在尝试编写脚本的一部分,如果调整一对对象的大小时,将调整一个对象的大小,以便它们始终具有相同的大小。到目前为止它是有效的——主要是。我遇到的唯一问题是在尝试通过转换组件调整大小时 - 例如,在 Inspector 中输入数字,或使用 X 或 Y 或 Z 上的值滑块。手柄工作正常。我想这没什么大不了的,但如果我能弄清楚为什么这不起作用,这样我就可以了解将来该怎么做,我会很高兴。这是代码:

[ExecuteInEditMode]
public class TransferRegion : MonoBehaviour {
    // Unrelated code...

    public bool scaleManuallyAltered {
        get; private set;
    }

    [SerializeField]
    private TransferRegion pair;

    private Vector3 scale;

    // Called whenever the scene is edited
    void Update () {
        if (scale != gameObject.transform.localScale) {
            scaleManuallyAltered = true;
            scale = gameObject.transform.localScale;
        }
        if (pair && scaleManuallyAltered && !pair.scaleManuallyAltered) {
            pair.transform.localScale = scale;
        }
    }

    // Called AFTER every Update call
    void LateUpdate () {
        scaleManuallyAltered = false;
    }

    // Unrelated code...
}

如果有人能看出我犯了一些重大的逻辑错误,我很想知道。如果我的代码有点难以理解,我也可以稍微解释一下我的逻辑流程,我知道我很容易做出一些令人困惑的结构。
谢谢大家。

如果您希望一个对象与另一个对象具有相同的比例,为什么不通过将调整大小游戏对象的比例直接设置为它所基于的游戏对象的比例来简化您的代码?例如,此脚本在编辑模式下重新调整对象的大小以匹配其对的比例:

using UnityEngine;
using UnityEditor;
using System.Collections;

[ExecuteInEditMode]
public class tester : MonoBehaviour
{
    public Transform PairedTransform;

    void Update()
    {
        if (!Selection.Contains(gameObject))
        {
            gameObject.transform.localScale = PairedTransform.localScale;
        }
    }
}

我在场景中的两个立方体上对此进行了测试。我能够使用 gizmos 调整大小,并在检查器中的转换编辑字段中手动输入数字。

编辑:通过利用 Selection,您可以仅将比例更改应用于未在层次结构中选择的对象对。这样,这些对就不会相互竞争以重新调整自己的规模。

所以我想通了。
我不确定 我的原始代码有什么 错误,但最终我决定进入好用的旧事件领域:

[ExecuteInEditMode]
public class TransferRegion : MonoBehaviour {
    //...
    [SerializeField]
    private UnityEvent rescaled;
    //...
    void Update() {
        if (scale != gameObject.transform.localScale) {
            scale = gameObject.transform.localScale;
            rescaled.Invoke();
        }
    }
    //...
    public void OnPairRescaled() {
        gameObject.transform.localScale = pair.transform.localScale;
        scale = gameObject.transform.localScale;
    }
}

并且只需将 OnPairRescaled 事件设置为配对对象的 rescaled 事件的侦听器。

哒哒!