スクリプト

■概要

UnityではCubeやSphereなどのオブジェクトを開発者の意図通りに
動かすためにスクリプトと呼ばれる機能が用意されています。
	
●スクリプトの内容
	スクリプトはC#かJavascriptのどちらかで書くことができ、
	内容はクラスを使用したプログラムです。
	ただ、Unityがゲームで使用すると思われる機能(インプットや衝突判定)を
	関数として提供してくれていますので開発者はオブジェクトの
	挙動のみに集中してプログラムを行えます。

●スクリプトの作り方
	スクリプトを作るためにはProjectウィンドウのAssets項目で作成するか
	各オブジェクトのInspectorにて追加することができます。

	・Assets項目から作成
		Assets項目で右クリック => Create => C# Script or Javascript

	・Inspectorから作成
		Inspector => AddComponent => New Script => Languageで言語選択

●スクリプトの使い方
	スクリプトはオブジェクトに関連付けることで効果を発揮するものですので、
	作成したスクリプトはオブジェクトに関連付ける必要があります。

	・関連付けの手順
		①.関連付けたいオブジェクトをクリック

		②.Inspectorが設定したいオブジェクトになっていることを確認

		③.AddComponentをクリック

		④.Scriptsの項目から関連付けたいスクリプトを選択

■スクリプト構成(C#)

●スクリプトエディタ
	スクリプトの修正を行うために以下のエディタが用意されており、
	このエディタを使用して処理を実装していきます。

		・MonoDevelop
		・VisualStudio
		※上記以外のメモ帳や秀丸などのテキストエディタでも編集は可能です。

	・エディタによる修正方法
		Assets項目にあるスクリプトファイルをダブルクリックすることで
		関連付けされているエディタを使用してファイルが開きます。

●スクリプトの構成
	C#のスクリプトの作成直後の内容は以下形になります。
	※画面の内容はMonoDevelop版です。
	unity_0023

	①.ソリューションウィンドウ
		開いたスクリプトのUnityプロジェクトの
		ファイル構成リストです。

	②.クラス名
		クラス名はスクリプトファイルがそのまま使用されます。

	③.MonoBehaviourクラス
		すべてのスクリプトから派生する基底クラスです。
		このクラスにStartやUpdate関数が定義されており、
		継承先のスクリプトクラスでオーバーライドしています。

		unity_0027

	④.Start関数
		MonoBehaviourで定義されているオーバーライド関数の1つで、
		スクリプトが起動されてUpdate関数が呼び出される前に
		一度だけ呼び出される関数です。
		初期化などの処理はここに記述する。

	⑤.Update関数
		MonoBehaviourで定義されているオーバーライド関数の1つで、
		毎フレーム実行される関数です。
		ここにオブジェクトの挙動に関する処理を記述します。

■スクリプト実装(メンバ変数)

●メンバ変数宣言
	C#のメンバ変数の作成はクラスの中で行い、
	アクセス指定子はJavaのように一つ一つのメンバ毎に指定します。
	もし、指定がなければprivateとして扱われます。
	以下はint型のm_Hpというメンバ変数をPlayerクラスに宣言しています。
		
	例:
		public class Player: MonoBehaviour 
		{
			public int m_Hp;

			// Use this for initialization
			void Start () {
			
			}
			// Update is called once per frame
			void Update () {
			
			}
		}

●メンバ変数の宣言がオブジェクトに与える影響
	アクセス指定子のpublic、private、protectedは
	C#もJavaやC++と同じ効果を発揮します。
	しかし、UnityのC#においてpublicは関連付けしているオブジェクトに
	多大な影響を与えます。
	それはInspectorの項目にpublicの変数が表示されることです。
	これによってUnity上で調整が可能となります。

	unity_0024

	public指定することによってカプセル化を行いづらくなりますが、
	Unityはゲーム製作を効率よく行うことを第一としていますので、
	調整するためのパラメータはpublic指定にして調整を行えるようにして下さい。

●Start関数とpublicのメンバ変数の設定の注意点
	Start関数は初期化を行う関数と上で書いていますが、
	ここでpublic指定のメンバ変数の初期化を行うと
	Instector指定の情報が上書きされてしまうので注意して下さい。

	例:
		Unityで300を設定し、Start関数で100を設定した場合、
		実行時はStart関数の100が使用されています。

		Unityでの設定:
			unity_0025

		実装コード:
			public class Player: MonoBehaviour {

				public int m_Hp;

				// Use this for initialization
				void Start () {
					m_Hp = 100;
				}
				// Update is called once per frame
				void Update () {
				
				}
			}

		実行時の設定
			unity_0026

■スクリプト実装(メンバ関数)

メンバ関数はクラス内に定義します。
定義の際基本的な形は以下のようになっています。
メンバ関数もアクセス指定子がなければprivateとして扱われます。
	
C#のメンバ関数の基本形:
	
	アクセス指定子 戻り値の型 関数名(引数)
	{
		return 戻り値;
	}

具体例:
	public class Player: MonoBehaviour 
	{
		public int m_Hp;

		// Use this for initialization
		void Start () {
			m_Hp = 100;
		}

		// Update is called once per frame
		void Update () {
			if (IsGameOver () == true) 
			{
				Debug.Log ("GameOver");
			}
		}

		// GameOverチェック
		public bool IsGameOver()
		{
			if (m_Hp <= 0) 
			{
				return true;
			}
			return false;
		}
	}

■オブジェクトを動かす

スクリプトを使ってオブジェクトを動かしてみたいと思います。
仕様は以下のとおりです。

	仕様:
		キー入力「↑」:オブジェクトに対して+Y方向に加算する
		キー入力「↓」:オブジェクトに対して-Y方向に加算する
		キー入力「←」:オブジェクトに対して-X方向に加算する
		キー入力「→」:オブジェクトに対して+X方向に加算する
	
	実装コード:
		public class Player: MonoBehaviour {

			public float m_Speed = 0.0f; // 移動速度

			// Use this for initialization
			void Start () {
			
			}
			// Update is called once per frame
			void Update () {
				// ①Vector3構造体の宣言
				Vector3 add_pos = Vector3.zero;

				// ②移動処理
				if (Input.GetKey(KeyCode.UpArrow) == true)
				{
					add_pos.y = m_Speed;
				} else if (Input.GetKey(KeyCode.DownArrow) == true) {
					add_pos.y = -m_Speed;
				}

				if (Input.GetKey(KeyCode.LeftArrow) == true) 
				{
					add_pos.x = -m_Speed;
				} else if (Input.GetKey(KeyCode.RightArrow) == true) {
					add_pos.x = m_Speed;
				}

				// ③フレーム調整
				add_pos *= Time.deltaTime;

				// ④座標変更
				this.transform.localPosition += add_pos;
			}
		}

		①.Vector3構造体の宣言
			Vector3構造体はメンバ変数にfloat型の「x、y、z」を持っています。
			3Dの座標軸を変数としたい場合に使用される構造体です。

		②.移動処理
			移動処理では上下、左右で入力情報を取得し、
			その情報に伴った処理を行っています。

			入力情報の取得方法:
				入力情報の取得にはInputクラスを使用します。
				キーボードの入力情報は簡単に取得できるようになっており、
				コントローラーでも設定を行えば使用できます。

			キーボード入力取得関数:
				GetKey(KeyCode key):
					KeyCodeのキーが押されているかどうかを返す
						押されている:true
						押されていない:false

				GetKeyUp(KeyCode key):
					KeyCodeのキーを離した瞬間かどうかを返す
						離した瞬間:true
						離していない:false

				GetKeyDown(KeyCode key):
					KeyCodeのキーを押した瞬間かどうかを返す
						押した瞬間:true
						押していない:false

		③.フレーム間調整
			Unityの数値変動は「1フレームにどれほど動くか」ではなく
			「1秒間にどれほど動くか」で考えます。
			今回m_Speedに「5」を設定したとすると、
			矢印を1秒押し続けたらxyのどちらかの軸に対して座標が「5」移動します。
			この性質を実行するためのに使用するのが「Time.deltaTime」です。
			この値を移動値などに掛け合わせることで1回のUpdateでの変動値が
			求められます。

			Time.deltaTime:
				前のフレームと今のフレームの時間の差分を返します(単位は秒)。
				
				Time.deltaTimeが使用される理由:
					UnityはFPSの設定はPCのリフレッシュレートに
					任せており、リフレッシュレートはPCごとに
					異なっているので1秒単位でどれほど動いたかを
					調整するためにTime.deltaTimeを使用しています。

				リフレッシュレート:
					1秒間に何回画面を書き直すかを表す
					30なら1秒間に30回、120なら1秒間に120回
					画面を書き直している

		④.座標変更
			オブジェクトを移動させる方法はいくつかありますが、
			今回はシンプルにオブジェクトの座標に対し移動値を加算しています。

			local***:
				オブジェクトのメンバである座標(position)、拡縮率(scale)、
				回転角度(rotation)にはlocalという名前がついていますが、
				これは親から見た座標や拡縮率ということです。
				親子関係がない場合はこの値がそのままワールド座標として
				使用されます。