UnityでTransformのposition.x, y, zの各値を、拡張メソッドで直接変えられるようにする
さんざん言われてることだとは思いますが、UnityでTransformの位置、つまりpositionの値を変更したいと思ったとき、positonのx,y,zという各値を直接変更することはできません。
//これはできない transform.position.x = 10f;
これはtransform.positionが、メンバー変数ではなくプロパティとして定義されているためです。C#では、構造体がプロパティになっている場合、その各メンバーの値を直接変更することはできない仕様らしいです。そのためpositionの値を変更したいとき、通常は以下のようにすると思います。(positionを別の変数に取り出してから値を変更する、というやり方もあるみたいですが、手間を考えるとそんなに差はない気がします)
transform.position = new Vector3(x, transform.position.y, transform.position.z)
しかし処理の出現頻度の割に、これを毎回書くのは面倒です。拡張メソッドの形にすれば処理を共通化できるのではないかと思い、Transformクラスの拡張メソッドとして実装してみました。
//xの値を0に transform.SetPosX(0f); //x方向に0.5f移動 transform.AddPosX(0.5f);
という感じで、直接positionのx,y,zの値を書き換えられて便利な気がします。
ここからは余談ですが、けっこうややこしいというか勉強になったことです。上のコードは最初はVector3構造体を拡張する形で書いてみたのですが、
public static void SetPosX(this Vector3 pos, float x) { pos = new Vector3(x, pos.y, pos.z); }
これは正常に動作しません。エラーは出ませんが、実際には値が書き変わらないという面倒なことになります。このthisで参照される値は実際にはコピーした値であり、その値を変更しても元の構造体には影響がないためです。知らないままだと思わぬところでバグが発生しそうで怖いですね。