Unity - 调整一个GameObject的大小以匹配另一个

时间:2015-10-14 16:11:54

标签: c# unity3d unity3d-editor

我正在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...
}

如果有人能看到我正在制造的一些重大逻辑失败,我想知道。如果我的代码有点难以理解,我也可以解释一下我的逻辑流程,我知道我很容易制造一些令人困惑的结构。
谢谢大家。

2 个答案:

答案 0 :(得分: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;
        }
    }
}

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

编辑:通过利用Selection,您只能将比例更改应用于未在层次结构中选择的对中的对象。通过这种方式,双方不会相互竞争以重新规模化。

答案 1 :(得分: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事件的侦听器。

钽哒!