アプリ制作④オブジェクトの位置・回転・スケール
レッスン4では、Unityプロジェクトのオブジェクトを動かしたり、オブジェクトへ変更を加えたりする方法について見ていきます。オブジェクトの位置や回転、スケールを変える際には、エディター内の操作でオブジェクトに変更を加える方法と、C#スクリプトで行う2つの方法があります。
アプリの最初から最後までオブジェクトが一貫した状態の場合はエディター内での変更でも十分対応可能ですが、アプリの操作でオブジェクトが変わるようにする場合などのために、C#スクリプトでの変更方法も知っておくと便利です。それでは早速、それぞれの方法について説明していきたいと思います。
Move Rotate Scale Transform
オブジェクトの位置を変える
Unityエディターで位置を変える
Unityエディタ内で、オブジェクトの位置を変える(Move)のはとても簡単です。まず、対象となるオブジェクトを階層ウィンドウで選択し、シーンビュー内でオブジェクトをドラッグ&ドロップすると、自由に新しい位置に移動することができます。
あるいは、オブジェクトを選択したあと、インスペクターウィンドウ内のトランスフォーム(Transform)コンポーネントの値を変えて、位置のX、Y、Z座標での位置を数値で指定することもできます。
オブジェクトの位置を変える際は、階層ウィンドウの上にある、移動ツールが選択されているかどうかも確認してください。ボタンをクリックして選択することもできますが、ショートカットキーの「W」も覚えておくと便利です。
スクリプトを使って位置を変える
エディターを使った方法に比べると、直感的ではなくなりますが、C#スクリプトを使用してオブジェクトの位置を変更することもできます。例えば、あるオブジェクトに以下のスクリプトをアタッチしてアプリをスタートすると、そのオブジェクトはXYZ座標それぞれ1のところへ移動して表示されます。
using UnityEngine; public class MoveObject : MonoBehaviour { void Start() { // 新しい位置(x:1, y:1, z:1)へ移動させる transform.position = new Vector3(1, 1, 1); } }
最初にあった位置から、ある速度で徐々に移動させるような場合には、以下のコードを使うことができます。
using UnityEngine; public class MoveObject : MonoBehaviour { void Start() { // 異動先(この例ではx:1, y:1, z:1)を指定する private Vector3 target = new Vector3(1, 1, 1); // 速度(この例では1)を指定する private float speed = 1; // 新しい位置(x:1, y:1, z:1)へ速度1で移動させる transform.position = Vector3.MoveTowards(transform.position, target, Time.deltaTime * speed); } }
オブジェクトの回転を変える
Unityエディターで回転を変える
オブジェクトを回転させる(Rotate)のも、位置を変えるのと同じ手順で行うことができます。まず、Unityエディタ内の階層ウィンドウでオブジェクトを選択し、シーンビュー内でオブジェクトの周りに表示される円をドラッグ&ドロップしてオブジェクトを回転させることができます。
あるいは、オブジェクトを選択したあと、インスペクターウィンドウ内のトランスフォーム(Transform)コンポーネントの値を変えて、位置のX、Y、Z座標での回転角度を数値として指定することもできます。
オブジェクトの回転を変える際は、階層ウィンドウの上にある、回転ツールが選択されているかどうかも確認してください。ボタンをクリックして選択することもできますが、ショートカットキーの「E」も覚えておくと便利です。
スクリプトを使って回転を変える
オブジェクトの位置の変更と同様に、C#スクリプトを使用してオブジェクトの回転を変更することもできます。例えば、あるオブジェクトに以下のスクリプトをアタッチしてアプリをスタートすると、そのオブジェクトはXYZ座標それぞれに沿って30度の回転をかけた状態で表示されます。
using UnityEngine; public class MoveObject : MonoBehaviour { void Start() { // XYZ軸それぞれに沿って30度の回転をかける transform.Rotate(new Vector3(30, 30, 30)); } }
今度は、Y軸に沿って1秒あたり30度の回転をかける場合の例を見ていただきたいと思います。speed
を定義したところで秒速を指定しているので、それに秒単位の時間Time.deltaTime
をかけることで秒速での回転を示しています。
using UnityEngine; public class MoveObject : MonoBehaviour { // 秒速を角度で指定 float speed = 30; void Update() { // 1秒ごとに指定した速度でY軸に沿った回転をかける transform.Rotate(new Vector3(0, speed, 0) * Time.deltaTime); } }
オブジェクトのスケールを変える
Unityエディターでスケールを変える
オブジェクトの大きさを変える(Scale)際も、位置や回転を変えるのと同じ手順で行うことができます。まず、Unityエディタ内の階層ウィンドウでオブジェクトを選択し、シーンビュー内でオブジェクトの周りに表示されるハンドルをドラッグ&ドロップしてオブジェクトのスケールを変更することができます。
あるいは、オブジェクトを選択したあと、インスペクターウィンドウ内のトランスフォーム(Transform)コンポーネントの値を変えて、位置のX、Y、Z座標でのスケールを数値として指定することもできます。
オブジェクトのスケールを変える際は、階層ウィンドウの上にある、スケールツールが選択されているかどうかも確認してください。ボタンをクリックして選択することもできますが、ショートカットキーの「R」も覚えておくと便利です。
スクリプトを使ってスケールを変える
オブジェクトの位置や回転の変更と同様に、C#スクリプトを使用してオブジェクトのスケールを変更することもできます。あるオブジェクトに以下のスクリプトをアタッチしてアプリをスタートすると、そのオブジェクトはXYZ座標それぞれに対して2倍の大きさになった状態で表示されます。
using UnityEngine; public class MoveObject : MonoBehaviour { void Start() { // XYZ軸それぞれに沿って2倍の大きさにする transform.localScale = new Vector3(2, 2, 2); } }
続いてある速度で、徐々に大きさが変わる場合のコードの例を見て見ましょう。
using UnityEngine;
public class ObjectScaling : MonoBehaviour
{
// スケール変更の速度を設定
float scaleSpeed = 0.1f;
void Update()
{
// 1秒ごとに指定した速度でX軸に沿ってスケールを変更する
transform.localScale(new Vector3(scaleSpeed, 0, 0)* Time.deltaTime);
}
}
ペアレントとチャイルドの関係
Unityではゲームオブジェクトに親子関係(ペアレントとチャイルドの関係)を構築することができることについてレッスン2でお話ししました。ペアレントオブジェクトのトランスフォーメーションは、チャイルドオブジェクトのトランスフォーメーションにも影響を与えます。
ローカルとワールドのトランスフォーメーション
それぞれのゲームオブジェクトには、ローカルトランスフォーメーション(Local Transformation)と呼ばれるものを持ちます。これは、位置、回転、スケールがペアレントオブジェクトに対して相対的なものになります。
同時にゲームオブジェクトはシーン全体の座標系(Globacl Coordinate)における位置、回転、スケールを表すワールドトランスフォーメーション(World Transformation)も持っています。ペアレントオブジェクトがない場合は、ローカルとワールドのトランスフォーメーションが同じになります。
トランスフォーメーションの継承:
チャイルドオブジェクトは、ペアレントオブジェクトからローカルトランスフォーメーションを継承します。つまり、ペアレントオブジェクトに変更が加えられると、チャイルドオブジェクトにもその変更が適用されるということです。
これは、チャイルドのローカルトランスフォーメーションがペアレントオブジェクトのローカル空間に対して相対的であるためです。例えば、ペアレントオブジェクトをシーン内の新しい位置に移動させると、そのすべてのチャイルドオブジェクトもそれに従って新しい位置に移動しますが、相対的な位置は維持されます。
ペアレントオブジェクトが車を表し、チャイルドオブジェクトがその車輪を表すような場合、車を前に移動させると、車輪もそれに連動して移動するというように使うことができます。
回転とスケールについても同様のことが言えます。ペアレントオブジェクトが家を表し、チャイルドオブジェクトが窓を表す場合、家を拡大すると窓もそれに連動して拡大します。
まとめ
いかがでしたか?これでUnityプロジェクトのシーンにあるゲームオブジェクトのトランスフォーメーションの基本についてはご理解いただけたと思います。
次回のレッスン5では、ゲームオブジェクトに色や質感をつけるためのマテリアルとテクスチャについて学んでいきます。