UnityのPosition周りの共通っぽい処理

Writtern by ゆう@あんのうん

はじめに

以下のゲームジャムに参加し、その成果物をアプリ化すべく、現在リファクタリングを行っているのですが、
今後のゲームジャムであると私が楽になりそうな共通処理を抜き出しました。

project-unknown.hatenablog.com

Tranform.positionの各座標の操作は、readonlyになっている為、一度別な変数に置き換えて、編集してから再代入しないといけなく、その手間を省いたものです。
staticクラス化して外部から読めるようにしているのは、

ゲームジャムだと時間がまったくなく、クラス設計がぐちゃぐちゃになって1つのクラスで他のGameObjectをいじりまくるシーンが頻発しているので、 外部参照出来るようにしています。

※本来はPosiitonをいじる時点で専用のクラス化を行うのが設計上正しいと思ってます。

「BehaviourUtility.cs」と「NumberUtility.cs」のクラスを作成して、以下のソースコードを丸コピすれば動く(はずです。
コードより下に、軽い説明を記載していますので、一緒に参照ください。

gistが使い慣れていないせいか、space4, spaceインデント設定なのにtab化されてしまってます。申し訳orz

gist.github.com

以下、各コードを軽く紹介。

NumberUtility.cs

Utilityと書いてますが、2つしか機能がありません。

GetValueOrMaximum(float value, float limit)

いわゆる 「x %= y;」とかをするメソッドです。
ただ、私自身がコードのど真ん中に「x %= y;」とか書いてあると、ん?とコードリーディングが止まったりするので、私自身への可読性向上の為に、回りくどい書き方をしています。
使用例としては、

// GameObjectのX座標を10以上いかないようにする。
float x = gameObject.transform.position.x
x++;
NumberUtility.GetValueOrMaximum(x, 10);
GetValueOrMinimum(float value, float limit)

GetValurOrMaximumの逆です。説明は省略。

BehaviourUtility.cs

BehaviourUtility.PositionX,Y,Z

引数として渡されたGameObjectの各座標を取得します。

float posX = BehaviourUtility.PositionX(gameObject);

BehaviourUtility.PositionFrom

GameObjectの座標を引数で渡されたVectorで加算/減算します。

// gameObjectの座標を、Vector3(1,0,0)へ移動させます
BehaviourUtility.PositionFrom(ref gameObject, new Vector3(1,0,0));

BehaviourUtility.PositionFromX,Y,Z

BehaviourUtility.PositionFromの各座標のみ指定するVerです。

// gameObjectのX座標を1ずらします
BehaviourUtility.PositionFromX(ref gameObject, 1);
// gameObjectのY座標を1ずらします
BehaviourUtility.PositionFromY(ref gameObject, 1);
// gameObjectのZ座標を1ずらします
BehaviourUtility.PositionFromZ(ref gameObject, 1);

BehaviourUtility.PositionAt

GameObjectのTransform.positionを引数で渡されたVector3で置き換えます。
(単純に毎回gameObject.transform.positionと書きたくなかっただけです)

// gameObjectをVector3(1,0,0)でセットします
BehaviourUtility.PositionAt(gameObject, new Vector3(1, 0, 0));

BehaviourUtility.PositionAtX,Y,Z

BehaviourUtility.PositionAtの各座標Ver, 説明は省略

BehaviourUtility.PositionAtToMaximum, BehaviourUtility. PositionAtToMinimum

BehaviourUtility.PositionAtの最大値以上/最小値以下に移動しないように制限する機能です。

BehaviourUtility.PositionAtToMaximumX,Y,Z
// gameObjectを+1移動させます。(最大値の10を超えると、10がセットされたままになります)
BehaviourUtility.PositionAtToMaximumX(ref gameObject, 1, 10);
BehaviourUtility. PositionAtToMinimumX,Y,Z
// gameObjectを-1移動させます。(最小値の0より下回ると、10がセットされたままになります)
BehaviourUtility.PositionAtToMinimumX(ref gameObject, 1, 0);

余談 自分自身のPositionを変更する場合

今回公開したコードは、あくまで別クラスからの操作に特化させています。
自分自身のpositionをいじる場合は、上記みたいな煩雑なやり方をしなくても、親クラスに以下のようなコードを記載しておいて、PositionXとかでいじったほうが良いと思います。
(コードはWebで他の先人たちのコードを取り込んでいます。

gist.github.com