Unityのtransformを変更してオブジェクトを移動させたい!
どうも、Linです。湿布、まとめ買いです。
Unityの基本技に、
オブジェクトを移動させる
というものがありますよね?
ゲーム上のキャラクターやボール、カメラなどを移動させたくなる瞬間は誰しもあることでしょう。
そんなときに知っておきたいのが、
オブジェクトのtransform値を変更して移動させる
という方法です。
Unityでtransformを変更してオブジェクトを移動させる方法は次の2つあります。
- Translateメソッドを使う方法
- transformのposition属性を変更する方法
この2つの方法をマスターするために、赤いボールをx軸方向にゆっくり移動させる、というゲームを作ってみましょう。

適当に
- Plane
- Sphere
を召喚してMaterialを追加して色をつけます。

今回はSphereを動かすので「Practice.cs」というスクリプトをSphereにアタッチしてくださいね。

これで準備完了!あとは好みで、Sphereに重力を持たせるためにrigidbodyコンポーネントを追加しておきましょう。
transformのTranslateメソッドで移動させる方法
まず1つ目の方法はtransfomのTranslateメソッドで移動させる方法です。
この方法は、
ゲームオブジェクト.transform.Translate(x,y,z)
で、指定したx・y・zだけオブジェクトの位置を移動させることができます。

>>Unityの公式レファレンスはこちら↓
Translateメソッドでは
- 1つ目の引数にVector3
- 2つ目の引数に「どの座標を基準にするのか?」
を設定するのですが、2つ目の引数は入れないとローカル座標で移動させてくれるので設定しなくても大丈夫です。
ってことで、先ほど位置を移動させたいオブジェクトにアタッチしたスクリプト(Practice.cs)を以下のように編集します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Practice : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { this.gameObject.transform.Translate (0.05f, 0, 0); } }
this.gameObectでスクリプトがアタッチされているオブジェクトを取得。
.transformでそのトランスフォーム情報コンポーネントを取得し、Translateメソッドを発動させてます。
Update関数はフレームごとに呼び出されるので、1フレームごとに0.05だけx座標が移動しているということになります。fをつけているのは0.05をfloat型のオブジェクトにしているためですね。
void Update () { this.gameObject.transform.Translate (0.05f, 0, 0); }
この状態でゲームを再生すると次のようになりますね。
うん。確かにx軸の方向にボールがどんどん移動していってますね。
transformのposition属性を使ってオブジェクトを移動させる方法
続いて、transformのposition属性を使って移動させる方法です。
ゲームオブジェクト.trasform.position
としてやると、ゲームオブジェクトのtransformコンポーネントの位置情報をVector3型で取り出せるのです。

position属性を使ったオブジェクトを移動させる方法は次の3ステップ。
Vector3の変数にtransform.positonを代入
まず、オブジェクトの位置情報を新しいVector3型のインスタンスに代入。
変数名をposとすると、こんな感じでいいでしょう。
Vector3 pos = this.gameObject.transform.position;
this.gameObjectでスクリプトがアタッチされているオブジェクト情報を取得し、.transformでそのtransformコンポーネントをゲット。
さらにそのtransformコンポーネントのposition属性値を.positionでVector3型で取得し、それを変数posに代入しているわけです。
transform.positionに位置情報を入れ直す
ゲームオブジェクトのtransform情報をVector3型で取得しましたね?
じつは、
transform.position.x (または y, z)
とすることでtransform.positionのVector3のx、y、zの値を取得できるのです。
たとえば、
transform.position.x
でtransformのx座標がわかるといった感じですね。
position属性の公式レファレンスはこちら↓
移動させたいときはこの座標ごとのpositon.xやposition.yなどの値を変更すればオブジェクトを移動できそうな気がしてきますが、ここがじつは大きな落とし穴。
なんと、
C#のスクリプトだとVector3などの構造体の値を変更できない
らしいのです。
詳しくはこちら↓
よって、Vector3型のtransform.positionを変更させたいときは新しいVector3型のインスタンスを作成し、transform.positionに代入し直すという作業が必要になってくるのですね。
先ほどのPractice.csのUpdate関数を次のように編集しましょう。
void Update () { Vector3 pos = this.gameObject.transform.position; this.gameObject.transform.position = new Vector3 (pos.x + 0.05f, pos.y, pos.z); }
このスクリプトでは、一旦、posというVector3型の変数に代入した値を持ったVector3型のインスタンスを生成し、それに動かしたい量を加え、これをオブジェクトのtransform.positionに代入し直しています。
このスクリプトでいうとx軸座標が0.05増えていることになりますね。
これがUpdate関数内にあるため、フレームが切り替わるたびにオブジェクトのx座標が0.05増えていくのです。
Practice.csのスクリプト全体としては次のようになります。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Practice : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { Vector3 pos = this.gameObject.transform.position; this.gameObject.transform.position = new Vector3 (pos.x + 0.05f, pos.y, pos.z); } }
スクリプトを編集した状態でゲームを再生すると、

うん。1つ目の移動方法の「Traslateメソッド」を使った場合とだいたい同じ挙動を示してますね。
これでtransform.positionを使ったオブジェクト移動の方法は終了です。
Unityのオブジェクトの移動だったらTranslateメソッドの方が楽!
以上がUnityでオブジェクトを移動させる方法でした。
- Translateメソッドを使う
- position属性を増やす
という2つの方法がありましたが、ぶっちゃけ、
1つ目のTranslateメソッドの方が1,000倍ぐらい楽です笑
今回整理してみて、transformのposition属性がこんなにも厄介な奴とは思いませんでした。
- transform.positionはVector3型である
- C#のスクリプトからではVector3の値が変更できない
ということのせいで、ちょっとめんどくさい。
特にUnity初心者の方には圧倒的にTranslateメソッドをおすすめしますね。
それでは!
Lin

おそらく、ブロガー。
今年でフリーランス 6年目。