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