[備忘録]Unity で始める C# その5 　ステージの壁作成

**作業中に気づいたこと**
・ゲーム上で物体とボタンを**同時に存在させる**場合は、混在しないように**配置するキャンバスを２つに分けて**作業するとよい。
・**Duplicateで複製**。同じようなOBを作るときに重宝する。
・**CaqnvasCPの[Canvas]で[Order in Layer]を１**にしておくと、**他のOBより常に手前に表示**させることが出来る。
・ヒエラルキーでOBを→クリック、UI、Panelを選択してできたパネルは、**初期段階でストレッチになっており、自動的に親キャンバスと同じ大きさ**。
・パネルが重なっているのをずらすときは、[Left][Right]の値をずらすが、ストレッチのときは通常と少し違う移動の仕方をする必要がある。左端は正の値、右端は負の値を使って動かす。
・パネルを変える仕組み→パネル１～４を作って、それの親を動かす。メインカメラの位置は移動しないので、相対的に場面が切り替わるように見える。
・**操作できない画像→操作できる画像の順に配置していくと簡単**。画像は[UI]→[Image]で[Source Image]からインポート。初期状態は100*100なので、Set Natuve Sizeで元の画像のサイズ似合わせて調整する。
・[Color]ダイアログで編集できる値のうち、一番下にある[A]は**不透明度**を表す。255が最大で透明でない（単色）。
・わかりやすくなるように、**定数**を定義してあげる。前→public const int WALL_FRONT = 1; //前 などのように。**const(コンスト)は初期化後に他の値を代入できなくする。文字通り定数となる。定数は変数名と区別がつきやすいように大文字で書くのが習わし。**。

```:使用例
//定数定義：壁方向  数字では人間にわかりづらいのでわかり易い名前の定数を定義する。
	public const int WALL_FRONT = 1; //前
	public const int WALL_RIGHT = 2; //右
	public const int WALL_BACK  = 3; //後
	public const int WALL_LEFT  = 4; //左

	public GameObject panelwalls; //壁全体

	private int wallNo;  //現在の向いている方向

	// Use this for initialization
	void Start () {
		wallNo = WALL_FRONT;  //スタートでは前を向く
		
	}
```
この定数を記録するために、wallNoというメンバー変数を宣言して、ゲーム開始時に正面の値を代入している。

```
public GameObject panelwalls; //壁全体

```
**UnityではMonoBehaviourを継承したクラスでパブリックなメンバー変数（パウリック変数）を宣言すると、インスペクターに設定項目（プロパティ）として表示され、エディタ上で編集できるようになる。**

これでプログラム側ではメンバー変数panelWallsを通してGOのPanellWallsを操作することができる。エディタ上で対象のGOを変更できるというメリットが有る。

```:全体像
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour {

	//定数定義：壁方向  数字では人間にわかりづらいのでわかり易い名前の定数を定義する。
	public const int WALL_FRONT = 1; //前
	public const int WALL_RIGHT = 2; //右
	public const int WALL_BACK  = 3; //後
	public const int WALL_LEFT  = 4; //左

	public GameObject panelWalls; //壁全体

	private int wallNo;  //現在の向いている方向

	// Use this for initialization
	void Start () {
		wallNo = WALL_FRONT;  //スタートでは前を向く
		
	}
	


		//右ボタンを押した
	public void PushButtonRight(){
		wallNo++; //方向を１つ右に　int a= 5; int b = ++a; //aもbも6になる。
			//左の１つ右は前
		if(wallNo>WALL_LEFT){
			wallNo=WALL_FRONT;
			}
		DisplayWall(); //壁画面表示
		}

		//左ボタンを押した
	public void PushLeftButton(){
		wallNo--; //方向を１つ左に　int a= 5; int b = ++a; //aもbも6になる。
			//前の１つ左は後ろ
		if(wallNo<WALL_FRONT){
			wallNo=WALL_LEFT;
			}
		DisplayWall(); //壁画面表示
		}
	

		//向いている方向の壁を表示
	

	void DisplayWall(){
		switch (wallNo) {
		case WALL_FRONT:
			panelWalls.transform.localPosition = new Vector3 (0.0f, 0.0f, 0.0f);
			break;
		case WALL_RIGHT:
			panelWalls.transform.localPosition = new Vector3 (-1000.0f, 0.0f, 0.0f);
			break;
		case WALL_BACK:
			panelWalls.transform.localPosition = new Vector3 (-2000.0f, 0.0f, 0.0f);
			break;
		case WALL_LEFT:
			panelWalls.transform.localPosition = new Vector3 (-3000.0f, 0.0f, 0.0f);
			break;
		}
	}

		
	}

```

**transform.localPostionの説明**
	
親の Transform オブジェクトから見た相対的な位置

Transform に親がいない場合は、値は Transform.position と同じになります。

ワールド位置を計算するときに、親の Transform のワールドの回転とスケールが、ローカルの位置に適用されることに注意してください。 この意味は Transform.position が常に 1 unit である場合は 1 unit であり続け、Transform.localPosition の 1 unit はすべての祖先のスケールを得た上での値となります。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        transform.localPosition = new Vector3(0, 0, 0);
        print(transform.localPosition.y);
    }