2

Unity で、非静的オブジェクトを 1 つからペアにテレポートする領域を含むプロジェクトに取り組んでいます。その部分は問題ありませんが、便宜上、ペアのサイズが変更された場合に 1 つのオブジェクトのサイズを変更して、常に同じサイズになるようにするスクリプトの一部を作成しようとしています。そしてこれまでのところ、それは機能します-ほとんど。私が遭遇する唯一の問題は、Transform コンポーネントを介してサイズを変更しようとするときです。たとえば、インスペクターで数値を入力するか、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;
        }
    }
}

シーン内の 2 つの立方体でこれをテストしました。ギズモを使用してサイズを変更したり、インスペクターの変換編集フィールドに手動で数値を入力したりできました。

編集: を利用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 に答える