2022/7/29

【Unity】座標をX,Y,Z個別に設定して移動する拡張メソッドを作る

Unityでオブジェクトを移動させようとすると以下の3つの方法があります。 1.Transform.positionに代入する方法 2.Transform.SetPositionAndRotation()メソッドを使う方法 3.Transform.Translate()メソッドを使う方法 X座標を50に移動し、Y座標とZ座標は変えたくない場合は1のTransform.positionに代入する方法を使う事になると思います。 コードは以下のようになります。

transform.position = new Vector3(50.0f, transform.position.y, transform.position.z);

もしくは

Vector3 pos = transform.position;
pos.x = 50.0f;
transform.position = pos;

position.xに直接代入ができない為どうしてもややこしくなってしまします。 最初のパターンであれば1行だしそこまで悪くないような気がします。しかしTransformの変数名が titleCursorTransform で、ローカル座標を使いたい場合はどうでしょう。

titleCursorTransform.localPosition = new Vector3(
    50.0f,
    titleCursorTransform.localPosition.y,
    titleCursorTransform.localPosition.z
    );

かなり長くなりコードの見通しが悪くなってしまいます。

座標をX,Y,Z個別に設定して移動する拡張メソッドを作る

今回はこの問題をC#の拡張メソッドを使って解決しようと思います。 コードは以下のようになります。

namespace UnityEngine {
    static class Extensions {
        public static void SetLocalX(this Transform self, float value) {
            self.localPosition = new Vector3(value, self.localPosition.y, self.localPosition.z);
        }
    }
}

UnityEngineのTransformを拡張したいので、まずUnityEngineのnamespaceに拡張メソッド用の静的クラスを宣言します。 そしてその中に静的メソッドを定義します。 this引数をつけた変数の型にメソッドが追加され、その引数として大元のtransform.positionが呼び出せるようになります。(privateメンバにはアクセスできない事に注意!)

使い方

titleCursorTransform.SetLocalX(50.0f);

これだけでX座標のみを変更し移動できるようになりました。 記述も短くやってる事もとてもわかりやすくなりました。 他のパターンも用意

namespace UnityEngine {
    static class Extensions {
        public static void SetX(this Transform self, float value) {
            self.position = new Vector3(value, self.position.y, self.position.z);
        }
        public static void SetY(this Transform self, float value) {
            self.position = new Vector3(self.position.x, value, self.position.z);
        }
        public static void SetZ(this Transform self, float value) {
            self.position = new Vector3(self.position.x, self.position.y, value);
        }
        public static void SetLocalX(this Transform self, float value) {
            self.localPosition = new Vector3(value, self.localPosition.y, self.localPosition.z);
        }
        public static void SetLocalY(this Transform self, float value) {
            self.localPosition = new Vector3(self.localPosition.x, value, self.localPosition.z);
        }
        public static void SetLocalZ(this Transform self, float value) {
            self.localPosition = new Vector3(self.localPosition.x, self.localPosition.y, value);
        }
    }
}

なぴぃ
Twitter:@napiiey

フォロー
library_books 関連記事

forumコメント