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

Sponsored Link

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

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

 

Unityの基本技に、

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

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

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

 

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

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

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

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

 

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

 

unity transform 移動

 

適当に

  • Plane
  • Sphere

を召喚してMaterialを追加して色をつけてみましょう。

今回はSphereを動かすので「Practice.sc」というスクリプトを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.sc)を以下のように編集します。

 

this.gameObectでスクリプトがアタッチされているオブジェクトを取得。

.transformでそのトランスフォーム情報コンポーネントを取得し、Translateメソッドを発動させてます。

Update関数はフレームごとに呼び出されるので、1フレームごとに0.05だけx座標が移動しているということになります。fをつけているのは0.05をfloat型のオブジェクトにしているためですね。

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

 

 

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

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

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

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

unity transform 移動

position属性を使ったオブジェクトを移動させる方法は次の3ステップ。

 

Step1. Vector3の変数にtransform.positonを代入

まず、スクリプトがアタッチされているオブジェクトの位置情報を新しいVector3型の変数に代入。

変数名をposとすると、こんな感じでいいでしょう。

this.gameObjectでスクリプトがアタッチされているオブジェクト情報を取得し、.transformでそのtransformコンポーネントをゲット。

さらにそのtransformコンポーネントのposition属性値を.positionでVector3型で取得し、それを変数posに代入しているわけです。

 

Step2. 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.scのUpdate関数を次のように編集しましょう。

このスクリプトでは、一旦、posというVector3型の変数に代入した値を持ったVector3型のインスタンスを生成し、それに動かしたい量を加え、これをオブジェクトのtransform.positionに代入し直しています。

このスクリプトでいうとx軸座標が0.05増えていることになりますね。

これがUpdate関数内にあるため、フレームが切り替わるたびにオブジェクトのx座標が0.05増えていくのですね。

 

Practice.scのスクリプト全体としては次のようになります。

 

 

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

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


Sponsored Link

コメントはこちらからお願いします!



もう1本読んでみる