【Unity】Transformを使って3Dオブジェクトを移動させる方法
今回はUnityのTransformを使用する方法をご紹介します。
オブジェクトを動かす際には必須の技術ですので、要点を理解しておきましょう。
本記事でご紹介する内容は以下の通りです。
- Transformとは
- Transformの基本的な使い方
- オブジェクトの移動方法
Unityの基本的な使い方については以下記事でご紹介していますのでご参考ください。
Transformとは
Unity公式リファレンスより「オブジェクトの位置、回転、スケールを扱うクラス」と説明があります。
また、Unityシーン内のオブジェクトはすべてTransformを持っており、位置、回転、スケールの3つを保持しています。そしてこの保持する3つの情報を編集することもできます。
つまり、Transformとはオブジェクトの位置情報やスケール情報を管理するためのクラスであると言えます。
ここで重要になるのが、座標系の考え方です。
ワールド座標・ローカル座標
Unityの勉強をしていると「ワールド座標」「ローカル座標」という言葉を耳にするかもしれません。
では具体的にその違いはどこにあるのでしょうか。以下表にまとめてみました。
概要 | 中心座標位置(x=0,y=0,z=0) |
親オブジェクトの有無
|
|
ワールド座標 | Unity世界全体から見た座標 | 3D空間全体の中心 | 無 |
ローカル座標 | 親オブジェクトから見た座標 | 親のいる座標 | 有 |
これだけではイメージしづらいという方のために実際に例を見てみましょう。
まず親オブジェクトを持たないSphere(World:色は赤)を作成します。Positionは適当な値で構いませんが、今回は以下のように設定します。
次に作成したWorldを親にもつSphere(Local:色は青)を作成します。Positionは先ほど設定した親オブジェクトの値と同じ値に設定してください。
関係は以下のようになっていれば問題ありません。
すると同じ値に設定したはずのSphereの位置関係が以下のようになります。(赤:World、青:Local)
Y=1に設定したWorld(赤)の位置を座標の中心とするY=1のLocal(青)は、ワールド座標ではY=2を指していることがわかると思います。
親オブジェクトを持たないオブジェクトはすべてワールド座標で考え、親オブジェクトを持つオブジェクトはすべてローカル座標で考えるということがわかると思います。
これはPositionに限らず、RotationおよびScaleでも同じです。
ワールド座標とローカル座標の違いをご理解いただけたでしょうか。
Transformの基本的な使用方法
ここまでの話を聞いてTransformってややこしい?と感じてしまった方がいるかもしれません。しかし、位置や角度、大きさを設定するのは非常に簡単です。
先ほどWorldのPositionを設定したように、プログラミングなど一切必要なしに設定することができます。
Inspectorビュー以下のパラメータを変更するだけでそれぞれの値を設定することができます。
改めてそれぞれのプロパティについて確認してみましょう。表にまとめましたのでご確認ください。
プロパティ | 機能 |
Position |
X,Y,Z座標のトランスフォームの位置
|
Rotation |
X, Y, Z 軸周辺でのトランスフォームの回転角 (単位:度)
|
Scale |
X, Y, Z 軸に沿ったトランスフォームのスケール。
1の場合は、元の大きさ 。
|
オブジェクトを移動させる方法
次にオブジェクトを移動させる方法を考えます。
ここで少しプログラミングを使用しますがそれほど難しいものではありませんのでお付き合いください。
移動方法は複数考えられますが、ここでは一例としてTransformクラスのPositionの値を少しずつ加算していく方法とTransformのPublic関数であるTranslateを使用する方法の2つをご紹介します。
Positionの値を加算する
Positionの値を少しずつ増やしていくことで移動を表現する方法をご紹介します。
まずはじめにPositionが(X=0,Y=1,Z=0)のCubeを作成してください。
次に新しいスクリプトを追加します。
名前は任意ですが、今回は「MoveSample」としました。
作成したMoveSampleを選択して任意のエディターで開いて編集していきます。
作成したスクリプトの中身は以下のようになっていると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveSample : MonoBehaviour { // はじめに呼び出される void Start () { } // フレームごとに呼び出されアップデートされる void Update () { } } |
Update()にPositionの値を加算していく処理を入れることで徐々に位置を移動させていきたいと思います。
以下のようにプログラムを書き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveSample : MonoBehaviour { // Update is called once per frame void Update () { // 自分自身のTransformを取得 Transform myTransform = this.transform; // 先ほど取得したTransformの情報から座標の情報を取得 // Vector3:3D ベクトルと位置の表現 Vector3 pos = myTransform.position; // x,y,z座標の値をフレームごと0.05加算する pos.x += 0.05f; pos.y += 0.05f; pos.z += 0.05f; // 自分の座標を加算した値に設定 myTransform.position = pos; } } |
プログラムを書き換えて実行すると以下のような動きになります。
先ほど設定した0.05fという数値を変えてみると速度が変わります。
この時、いちいち数値を変更することが面倒というときに変数として速度を扱うと非常に便利です。
プログラムを以下のように変更してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveSample : MonoBehaviour { //速度を変数として扱う public float speed = 0.05f; // Update is called once per frame void Update () { //自分自身のTransformを取得 Transform myTransform = this.transform; //先ほど取得した情報Transformの情報から座標の情報を取得 Vector3 pos = myTransform.position; //x,y,z座標の値をフレームごとspeed分加算 pos.x += speed; pos.y += speed; pos.z += speed; //自分の座標を先ほど加算した値に変更 myTransform.position = pos; } } |
プログラムを変更してUnityエディタ→Inspectorビュー→MoveSampleスクリプトの欄を見てください。Speedがパラメータとして変更することが可能になっていることがわかると思います。
この値を変更すると、Cubeが動く速度が変更されます。
実際にSpeedの値を0.5に変更して実行してみましょう。
先ほどの10倍速になっていることがわかると思います。
このように変更する可能性がある数値は変数にするとあとで変更がスムーズになるのでおすすめです。
Translateを使用する
続いてTranslateを使用してオブジェクトを移動させる方法をご紹介します。
先ほども説明した通り、TranslateとはTransformクラスの関数の一つです。以下のように使用します。
relativeToの座標をtranslationの方向と距離を移動する関数ということですが、わかりづらいので簡単に言い換えると、
移動方向と距離をtranslationで指定して、ワールド座標かローカル座標かをrelativeToで指定してオブジェクトを移動させることができます。
ちなみにtranslationはX,Y,Z座標をそれぞれFloatで与えてあげれば問題ありません。つまり先ほどの関数を書き換えると以下のようになります。
- Translate(float x,float y,float z,Space relativeTo = Space.Self)
先ほどのプログラムを以下のように書き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveSample : MonoBehaviour { //速度変数 public float speed = 0.05f; // Update is called once per frame void Update () { // 自分自身のtransformを取得 Transform myTransform = this.transform; //Translate関数を使用 //Translate(float x,float y,float z,Space relativeTo = Space.Self) myTransform.Translate(speed,speed,speed,Space.World); } } |
実際に実行して動きを見てみましょう。
加算によってオブジェクトを移動させる方法と同じような挙動を作成することができました。
まとめ
いかがでしたでしょうか。
Transformを使いこなすことができればオブジェクトを好きな方向に移動させることができます。
他にもTransformクラスの関数を使用すれば、オブジェクトを回転させたりすることも可能です。
基本的な挙動はTransformクラスを使用することで実装することができますので、様々な動きをつけてオブジェクトをリアルに動かしてみてください。
オブジェクトの移動に関しては以下の記事でアセットの一つである「iTween」を使用した方法も紹介しています。ぜひご参考ください。
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!