【Unity基礎】transformを変更してオブジェクトを移動させる2つの方法




Unityのtransformを変更してオブジェクトを移動させたい!

どうも、Linです。湿布、まとめ買いです。

 

Unityの基本技に、

オブジェクトを移動させる

というものがありますよね?

ゲーム上のキャラクターやボール、カメラなどを移動させたくなる瞬間は誰しもあることでしょう。

 

そんなときに知っておきたいのが、

オブジェクトのtransform値を変更して移動させる

という方法です。

Unityでtransformを変更してオブジェクトを移動させる方法は次の2つあります。

  1. Translateメソッドを使う方法
  2. transformのposition属性を変更する方法

 

この2つの方法をマスターするために、赤いボールをx軸方向にゆっくり移動させる、というゲームを作ってみましょう。

 

unity transform 移動

 

適当に

  • Plane
  • Sphere

を召喚してMaterialを追加して色をつけます。

 

 

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

 

https://gyazo.com/66d562f2b3a38aeec8e81e12027e5f8d

 

これで準備完了!あとは好みで、Sphereに重力を持たせるためにrigidbodyコンポーネントを追加しておきましょう。

 

 

transformのTranslateメソッドで移動させる方法

まず1つ目の方法はtransfomのTranslateメソッドで移動させる方法です。

この方法は、

ゲームオブジェクト.transform.Translate(x,y,z)

で、指定したx・y・zだけオブジェクトの位置を移動させることができます。

 

unity transform 移動

 

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

この状態でゲームを再生すると次のようになりますね。
https://gyazo.com/4976d9985230012ccb459be0d395713a

 

うん。確かにx軸の方向にボールがどんどん移動していってますね。

 

 

 

transformのposition属性を使ってオブジェクトを移動させる方法

続いて、transformのposition属性を使って移動させる方法です。

ゲームオブジェクト.trasform.position

としてやると、ゲームオブジェクトのtransformコンポーネントの位置情報をVector3型で取り出せるのです。

 

unity transform 移動

 

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



				
	}
}

 

 

スクリプトを編集した状態でゲームを再生すると、

https://gyazo.com/4976d9985230012ccb459be0d395713a

うん。1つ目の移動方法の「Traslateメソッド」を使った場合とだいたい同じ挙動を示してますね。

これでtransform.positionを使ったオブジェクト移動の方法は終了です。

 

 

Unityのオブジェクトの移動だったらTranslateメソッドの方が楽!

以上がUnityでオブジェクトを移動させる方法でした。

  1. Translateメソッドを使う
  2. position属性を増やす

という2つの方法がありましたが、ぶっちゃけ、

1つ目のTranslateメソッドの方が1,000倍ぐらい楽です笑

 

今回整理してみて、transformのposition属性がこんなにも厄介な奴とは思いませんでした。

  • transform.positionはVector3型である
  • C#のスクリプトからではVector3の値が変更できない

ということのせいで、ちょっとめんどくさい。

特にUnity初心者の方には圧倒的にTranslateメソッドをおすすめしますね。

 

それでは!

Lin




音生入力で楽にブログを書く技が満載!
ブログ音声入力術

音声入力の使い方から文章を書くコツまで完全網羅。ブログを書きたいすべての人向けの電子書籍