移動、拡縮、回転

■移動

Unityのゲームのオブジェクトの移動方法はいくつかありますが、
簡単な方法ではTransformクラスのメンバのposition、localPositionの変更、
Translate関数の使用で行うことができます。

●localPosition
	localPositionに新しいVector3型の変数を代入すると代入された値に
	オブジェクトの座標が変更されます。

	例:
		transfrom.localPosition = new Vector3(0, 1, 0);

	上記の例ではX座標 => 0、Y座標 => 1、 Z座標 => 0の場所に移動します。
	※localPositionでは「x」「y」「z」に直接値を代入することはできません。
	 必ずVector3型で値の代入を行わなければいけません。

●position
	positionに新しいVector3型の変数を代入すると代入された値に
	オブジェクトの座標が変更されます。

	例:
		transfrom.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」の位置にあるからです。
		これが相対座標です。
			
		unity_0028

	・localPositionの変更
		上の「Child」にスクリプトを関連付けしてlocalPositionを
		「0, 0, 0」に変更してみて下さい。

			transform.localPosition = new Vector3(0, 0, 0);

		localPositionは相対座標ですので、Childの「0, 0, 0」は
		親の座標からみての「0, 0, 0」となりますので、
		以下のような画面になると思います。

		unity_0029

	・positionの変更
		ポジションはワールド座標を基準に座標を変更します。
		これは親の座標に関係なくワールド座標基準に変更できます。
		Childに関連付けしたスクリプトのlocalPositionの変更を
		positionに変更して下さい。

			transform.position = new Vector3(0, 0, 0);

		今度は位置が変わらずChildの座標は「0, -1, 0」のままだと思います。
		親の座標「0, 1, 0」から見た子供の座標「0, -1, 0」はワールド座標だと
		「0, 0, 0」となるので、実行前と後の内容は変わりません。

		unity_0030

	・親子関係なしの場合
		親子関係が無い場合は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以外の値も変更されます。

■拡縮

オブジェクトの拡縮はlossyScaleまたはlocalScaleの値を
変更することで行うことができます。
	
●localScale
	localScaleに新しいVector3型の変数を代入すると代入された値に
	オブジェクトの拡縮が変更されます。

	例:
		transform.localScale = new Vector3(2, 1, 1);

	上記の例ではX軸サイズ => 2、Y軸サイズ => 1、 Z軸サイズ => 1になります。
	※localScaleでは「x」「y」「z」に直接値を代入することはできません。
	 必ずVector3型で値の代入を行わなければいけません。

●lossyScale
	lossyScaleに新しいVector3型の変数を代入すると代入された値に
	オブジェクトの拡縮が変更されます。

	例:
		transform.lossyScale = new Vector3(1, 2, 1);

	上記の例ではX軸サイズ => 1、Y軸サイズ => 2、 Z軸サイズ => 1になります。
	※localScaleでは「x」「y」「z」に直接値を代入することはできません。
	 必ずVector3型で値の代入を行わなければいけません。

●localScaleとlossyScaleの違い
	localScaleとlossyScaleの違いは親の拡縮に相対しているか、
	独立した拡縮の値を設定するかの違いです。
	相対については「■移動」の項目で説明しているのそちらを確認して下さい。
	localScaleは親に対して相対的な拡縮が行われ、
	lossyScaleが親子関係を無視して独立した拡縮を行います。

■回転

オブジェクトの回転方法はいくつかありますが、
簡易的な方法としては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についてもあまり意識せずに使用して問題ありません。