2

我正在 Unity 中开展一个项目,该项目涉及将任何非静态对象从一个传送到配对的区域。那部分很好,但为了方便起见,我正在尝试编写脚本的一部分,如果调整一个对象的大小,它将调整一个对象的大小,以便它们始终具有相同的大小。到目前为止,它的工作原理 - 主要是。我遇到的唯一问题是尝试通过 Transform 组件调整大小时 - 例如在 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...
}

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

4

2 回答 2

1

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

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;
        }
    }
}

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

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

于 2015-10-15T13:17:02.860 回答
0

所以我想通了。
我不确定我的原始代码出了什么问题,但最终我决定进入旧的方便事件的领域:

[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事件的侦听器。

达达!

于 2015-10-15T16:17:24.357 回答