【Unity】Transformの変更を調べる

オブジェクトが動いたことを知る良い方法はないの?

Transform.hasChangedプロパティから調べられるわ

Transformの移動や回転などの変更を調べる方法の紹介です。

結論を言うと、Transform.hasChangedプロパティの値から分かります。このプロパティはTransformの変更フラグであり、Transformが変更されるとtrueになります。

ただし、使い方には注意すべき点もあり、実際の使い方をサンプルコードを示しながら解説していきます。

動作環境
  • Unity2021.1.23f1

Transformの変更を検知する

Transform.hasChangedプロパティはTransformの変更を表すフラグで、falseがセットされてからTransformに何らかの変更があるとtrueに変わります。

そのため、変更を調べる前にTransform.hasChangedプロパティにfalseをセットする必要があります。一度trueがセットされたら、falseをセットするまで変更がなくてもtrueのままになります。

以下、Transformが変更されたときにデバッグログを出力するスクリプトです。

TransformUpdateChecker.cs
using UnityEngine;

public class TransformUpdateChecker : MonoBehaviour
{
    private void Update()
    {
        // 変更フラグがセットされていれば、
        // Transformが変更されたとみなす
        if (transform.hasChanged)
        {
            // 変更ログを出力
            print("Transformが変更された!");

            // 変更フラグをクリア
            transform.hasChanged = false;
        }
    }
}

このスクリプトをTransformUpdateChecker.csとしてUnityプロジェクトに保存し、Transformの変更をチェックしたい対象のゲームオブジェクトにアタッチすると機能します。

実行結果

ゲームオブジェクトのPosition、Rotation、Scaleを変えるとフラグがセットされることが確認できました。

フラグがセットされる条件・されない条件

先述の例以外にも、Transform.hasChangedフラグがセットされる条件が存在します。

フラグがセットされる例されない例についていくつか紹介します。

異なる親オブジェクトに移動されたとき

異なる親オブジェクト配下に移動されると、フラグがセットされます。

また、ある親オブジェクト配下からヒエラルキーのルートに移動された場合もフラグがセットされます。

子オブジェクトの構造が変わったとき

チェック対象オブジェクトの子オブジェクトのヒエラルキーが変更された場合は、フラグはセットされません。

親オブジェクトのTransformが変更されたとき

親オブジェクトのPositionやRotation、Scaleが変更されたときは、フラグがセットされます。

子オブジェクトのTransformが変更されたとき

子オブジェクトのPositionやRotation、Scaleが変更された場合は、フラグはセットされません。

ゲームオブジェクト名が変更されたとき

ゲームオブジェクト名の変更では、フラグはセットされません。

これは、親オブジェクトや子オブジェクトの名前が変更された場合も同様です。

さいごに

Transformの変更は、Transform.hasChangedプロパティの値を調べることでチェックできます。チェック前にfalseを指定してフラグをクリアすることさえ忘れなければ大丈夫です。

フラグのセット条件は、オブジェクトが動いたり親オブジェクトのヒエラルキーが変わった場合です。

このことに注意しながら活用すれば良いでしょう。

参考サイト