移動、拡縮、回転
移動
Unityのゲームのオブジェクトの移動方法はいくつかありますが、
簡単な方法ではTransformクラスのメンバのposition、localPositionの変更、
Translate関数の使用で行うことができます。
localPosition
localPositionに新しいVector3型の変数を代入すると代入された値に
オブジェクトの座標が変更されます。
例:
transform.localPosition = new Vector3(0, 1, 0);
上記の例ではX座標 => 0、Y座標 => 1、 Z座標 => 0の場所に移動します。
※localPositionでは「x」「y」「z」に直接値を代入することはできません。
必ずVector3型で値の代入を行わなければいけません。
position
positionに新しいVector3型の変数を代入すると代入された値に
オブジェクトの座標が変更されます。
例:
transform.position = new Vector3(0, -1, 0);
上記の例ではX座標 => 0、Y座標 => -1、 Z座標 => 0の場所に移動します。
※positionでは「x」「y」「z」に直接値を代入することはできません。
必ずVector3型で値の代入を行わなければいけません。
positionとlocalPositionの違い
positionとlocalPositionの違いはワールド座標か親からの相対座標かになります。
相対座標の確認
相対座標とは特定の対象から見た座標のことです。
相対座標を確認を以下の内容で確認したいと思います。
①.Cubeオブジェクトを作成し、名前を「Parent」にして、座標を「0, 1, 0」にする
※Inspector上で変更して下さい。
②.Cubeオブジェクトを作成し、名前を「Child」にして、座標を「0, 0, 0」にする
※Inspector上で変更して下さい。
③.Material「ChildCubeMat」を作成し、色を赤に設定する
④.ChildCubeMatをChildに関連付ける
⑤.この時、Parentの座標が「0, 1, 0」
Childの座標が「0, 0, 0」に変更されたことを確認して下さい。
⑥.Hierarchy上のChildをParentにドラッグアンドドロップして
ParentとChildを親子関係になるようにする
⑦.Childの座標が「0, -1, 0」となっていることを確認する
⑧.AssetsでC#スクリプトを作成し、名前を「Cube」にする
親子関係が成立するまではParentが「0, 1, 0」、Childが「0, 0, 0」でしたが、
親子関係後にChildの座標は「0, -1, 0」となっています。
これはChildの座標「0, 0, 0」が親の座標「0, 1, 0」から見て
「0, -1, 0」の位置にあるからです。
これが「相対座標」です。
localPositionの変更
上の「Child」にスクリプトを関連付けしてください。
その後localPositionを「0, 0, 0」に変更します。
transform.localPosition = new Vector3(0, 0, 0);
localPositionは相対座標です。
Childの「0, 0, 0」は親の座標からみての「0, 0, 0」となりますので、
以下のような画面になると思います。
positionの変更
ポジションはワールド座標を基準に座標を変更します。
これは親の座標に関係なくワールド座標基準に変更できます。
Childに関連付けしたスクリプトのlocalPositionの変更を
positionに変更して下さい。
transform.position = new Vector3(0, 0, 0);
今度は位置が変わらずChildの座標は「0, -1, 0」のままだと思います。
親の座標「0, 1, 0」から見た子供の座標「0, -1, 0」はワールド座標だと
「0, 0, 0」となるので、実行前と後の内容は変わりません。
親子関係なしの場合
親子関係が無い場合はlocalPositionもpositionも
ワールド座標基準となるので、どちらを変更しても問題ありません。
Translate関数
Translate関数は引数に移動値を指定することで、指定した値だけオブジェクトを
移動させることができます。
Translateメソッド:
戻り値:
なし
引数1:
第一引数:
float x:x軸への移動値
第二引数:
float y:y軸への移動値
第三引数:
float z:z軸への移動値
第四引数:
Space relativeTo:
オブジェクトの向きに対して移動するか
ワールド座標を基準として移動するか
引数2:
第一引数:
Vector3:x、y、z軸への移動値
第二引数:
Space relativeTo:
オブジェクトの向きに対して移動するか
ワールド座標を基準として移動するか
(省略可:省略時はSpace.Self)
内容:
オブジェクトの座標に対して移動を行う。
Spaceを指定することで移動値への反映結果が変わる
Space.World:
ワールド座標を基準として移動値を加算する
Space.Self:
オブジェクトの向きを配慮して移動値を加算する
Space.WorldとSpace.Selfの違い
SelfとWorldの違いはオブジェクトの座標軸を基準にするか、
ワールドの座標を基準とするかです。
「Cube」オブジェクトを作成後、InspacetorのRotateのY軸を45に設定して
①と②の挙動を確認してみてください。
①.Space.Worldで移動
transform.Translate (0, 0, 0.01f, Space.World);
②.Space.Selft
transform.Translate (0, 0, 0.01f, Space.Self);
①ではブロックの向きに関係なくワールド座標軸のZ軸に移動しており、
実行中はPositionのZのみ加算されています。
②ではブロックの向きに向かって移動を行っているので、
実行中のPositionはZ以外の値も変更されます。
拡縮
オブジェクトの拡縮はlocalScaleの値を変更することで行うことができます。
移動や回転と異なり、lossyScaleで変更を行う事が出来ません。
localScale
localScaleに新しいVector3型の変数を代入すると代入された値に
オブジェクトの拡縮が変更されます。
例:
transform.localScale = new Vector3(2, 1, 1);
上記の例ではX軸サイズ => 2、Y軸サイズ => 1、 Z軸サイズ => 1になります。
※localScaleでは「x」「y」「z」に直接値を代入することはできません。
必ずVector3型で値の代入を行わなければいけません。
localScaleとlossyScaleの違い
localScaleとlossyScaleの違いは親の拡縮に相対しているか、
独立した拡縮の値を設定するかの違いです。
相対については「■移動」の項目で説明しているのそちらを確認して下さい。
localScaleは親に対して相対的な拡縮が行われています。
回転
オブジェクトの回転方法はいくつかありますが、
簡易的な方法としてはlocalEulerAnglesに値を代入するか、
Rotate関数を使用するかのどちらかになります。
localEulerAngles
localEulerAnglesに対してVector3を代入することで
X、Y、Zの各軸に対して回転角度設定が可能です。
例:
transform.localEulerAngles = new Vector3(0.0f, 45.0f, 0.0f);
上の例を記述して実行するとオブジェクトがY軸に対して45度傾きます。
※localEulerAnglesでは「x」「y」「z」に直接値を代入することはできません。
必ずVector3型で値の代入を行わなければいけません。
Rotate関数
Rotate関数は引数の各軸の角度の値の分だけ回転させることができる関数です。
Rotateメソッド:
戻り値:
なし
引数1:
第一引数:
float x:x軸への角度加算値
第二引数:
float y:y軸への角度加算値
第三引数:
float z:z軸への角度加算値
第四引数:
Space relativeTo:
オブジェクトの向きに対して回転するか
ワールド座標を基準として回転するか
(省略可:省略時はSpace.Self)
引数2:
第一引数:
Vector3:x、y、z軸への角度加算値
第二引数:
Space relativeTo:
オブジェクトの向きに対して回転するか
ワールド座標を基準として回転するか
(省略可:省略時はSpace.Self)
Translateと同様にRotateでもSpaceでオブジェクトの向きに対して回転するか
ワールドの回転軸を基準にして回転するかを決めることができます。
Space.WorldとSpace.Selfの違い
SelfとWorldの違いはオブジェクトの回転軸を基準にするか、
ワールドの回転軸を基準とするかです。
「Cube」オブジェクトを作成後、InspacetorのRotateのZ軸を45に設定して
①と②の挙動を確認してみてください。
①.Space.Worldで回転
transform.Rotate (0, 0.3f, 0, Space.World);
②.Space.Selfで回転
transform.Rotate (0, 0.3f, 0, Space.Self);
①ではブロックの向きに関係なくワールド座標軸のY軸に対して回転を行うので
ブロックの向きに関係なくY軸の回転を行います。
②ではブロックの向きに従って回転を行います。
回転の注意点
回転が難しくなるのは2つ以上の軸の値を変更した場合です。
1つの場合はSpaceについてもあまり意識せずに使用して問題ありません。