【Unity】Transformを使って3Dオブジェクトを移動させる方法


今回はUnityのTransformを使用する方法をご紹介します。

オブジェクトを動かす際には必須の技術ですので、要点を理解しておきましょう。

本記事でご紹介する内容は以下の通りです。

  • Transformとは
  • Transformの基本的な使い方
  • オブジェクトの移動方法

Unityの基本的な使い方については以下記事でご紹介していますのでご参考ください。

【入門】Unityを使ったゲーム開発ができるようになる!|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ビュー以下のパラメータを変更するだけでそれぞれの値を設定することができます。

Transform

改めてそれぞれのプロパティについて確認してみましょう。表にまとめましたのでご確認ください。

プロパティ 機能
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を作成してください。

Cube

次に新しいスクリプトを追加します。

NewScript

名前は任意ですが、今回は「MoveSample」としました。

MoveSample

作成したMoveSampleを選択して任意のエディターで開いて編集していきます。

作成したスクリプトの中身は以下のようになっていると思います。

Update()にPositionの値を加算していく処理を入れることで徐々に位置を移動させていきたいと思います。

以下のようにプログラムを書き換えてください。

 

プログラムを書き換えて実行すると以下のような動きになります。

MoveCube

先ほど設定した0.05fという数値を変えてみると速度が変わります。

この時、いちいち数値を変更することが面倒というときに変数として速度を扱うと非常に便利です。

プログラムを以下のように変更してみてください。

 

プログラムを変更してUnityエディタ→Inspectorビュー→MoveSampleスクリプトの欄を見てください。Speedがパラメータとして変更することが可能になっていることがわかると思います。

Speed変数設定

この値を変更すると、Cubeが動く速度が変更されます。

実際にSpeedの値を0.5に変更して実行してみましょう。

MoveSpeed

先ほどの10倍速になっていることがわかると思います。

このように変更する可能性がある数値は変数にするとあとで変更がスムーズになるのでおすすめです。

Translateを使用する

続いてTranslateを使用してオブジェクトを移動させる方法をご紹介します。

先ほども説明した通り、TranslateとはTransformクラスの関数の一つです。以下のように使用します。

  • public void Translate (Vector3 translationSpace relativeTo= Space.Self);

relativeToの座標をtranslationの方向と距離を移動する関数ということですが、わかりづらいので簡単に言い換えると、

移動方向と距離をtranslationで指定して、ワールド座標かローカル座標かをrelativeToで指定してオブジェクトを移動させることができます。

ちなみにtranslationはX,Y,Z座標をそれぞれFloatで与えてあげれば問題ありません。つまり先ほどの関数を書き換えると以下のようになります。

  • Translate(float x,float y,float z,Space relativeTo = Space.Self)

先ほどのプログラムを以下のように書き換えてください。

実際に実行して動きを見てみましょう。

MoveTranslate

加算によってオブジェクトを移動させる方法と同じような挙動を作成することができました。

まとめ

いかがでしたでしょうか。

Transformを使いこなすことができればオブジェクトを好きな方向に移動させることができます。

他にもTransformクラスの関数を使用すれば、オブジェクトを回転させたりすることも可能です。

基本的な挙動はTransformクラスを使用することで実装することができますので、様々な動きをつけてオブジェクトをリアルに動かしてみてください。

オブジェクトの移動に関しては以下の記事でアセットの一つである「iTween」を使用した方法も紹介しています。ぜひご参考ください。

【AR】【Unity】iTweenを使用してロゴを移動・回転させてみた


Furui