コンポーネント取得

■GetComponent関数

GameObjectに格納しているコンポーネントはスクリプトで取得して
変更を加えることが可能です。
コンポーネントの取得には「GetComponent関数」を使用します。

	unity_0075

関数使用:
	関数名:
		GetComponent
	
	戻り値:
		成功:
			指定したコンポーネント
	
		失敗:
			NULL
	引数:
		なし
	
	型指定:
		GetComponentで取得したいデータ型
	
	内容:
		GetComponentで指定したデータ型を取得する
	
	書式例:
		GetComponent<データ型>()
		
	具体例:
		// MeshRendererコンポーネントの取得
		MeshRenderer mesh = GetComponent<MeshRenderer>();

使用例:
	①.Cubeを作成
		Hierarchyに「Cube」を作成する

	②.スクリプト作成
		C#スクリプトを追加し、「MatChange」と名前をつける
	
	③.関連付けする
		②で作成したスクリプトを①で作成したオブジェクトに関連付けする

	④.処理実装
		以下のソースをUpdate関数内に追加する

			// ゲームオブジェクトに格納されているMeshRendererを取得
			MeshRenderer mesh = GetComponent<MeshRenderer>();

			// MeshRendererのメンバであるマテリアルの色を変更
			if (Input.GetKeyDown (KeyCode.Z) == true) {
				mesh.materials[0].color = Color.blue;
			} else if (Input.GetKeyDown (KeyCode.X) == true) {
				mesh.materials[0].color = Color.red;
			}
			
	⑤.実行
		実行したらZを押したらCubeが青色にXを押したら青色に変更されます。

		unity_0076

■スクリプト取得

スクリプトもコンポーネントの1つなので、GetComponentで取得可能です。
スクリプトで定義しているクラスを取得可能なデータ型として取得することができます。

使用例:
	①.Timer作成
		Hierarchy => UI => Textを選択し、「Timer」と名前をつける
	
	②.Timerスクリプトを作成
		C#スクリプトを追加し、「Timer」と名前をつける
		※座標は全て0にする
	
	③.処理実装
		Timerスクリプトに以下のコードを実装する

		サンプルコード:
			using UnityEngine;
			using System.Collections;
			using System;
			using UnityEngine.UI;

			public class Timer : MonoBehaviour {
				public float m_Time;	// タイマー
				private Text m_Text;	// テキスト

				// Use this for initialization
				void Start () {
					// Textクラスをコンポーネントとして取得
					m_Text = GetComponent<Text>();
				}
					
				// Update is called once per frame
				void Update () {
					// 時間減少
					m_Time -= Time.deltaTime;
					// テキスト内容変更
					m_Text.text = "Time:" + Math.Round(m_Time, 2);
				}

				// 終了チェック
				public bool IsEnd()
				{
					return m_Time <= 0.0f ? true : false;
				}
			}

	④.スクリプトの関連付け
		②で作成したスクリプトを①で作成したオブジェクトに関連付けする

	⑤.時間設定
		InspectorのTimer(script)にTime項目が追加されているので5と設定する
		unity_0070
	
	⑥.終了画面用オブジェクト作成
		Hierarchy => UI => Imageを選択し、「End」と名前をつける
		
	⑦.画像追加
		以下のリンクから画像をダウンロードし、Unityに追加する
			
		終わり画像

	⑧.Imageに設定する
		⑥で作成したオブジェクトに⑦で追加した画像を設定し、
		PosX => 0、 PosY => 0、PosZ => 0、
		Width => 200、Height => 200に設定する
	
	⑨.GameController作成
		HierarchyからCreateEmptyを選択し、「GameController」と名前をつける
	
	⑩.GameControllerスクリプトを作成
		C#スクリプトを追加し、「GameController」と名前をつける
		
	⑪.処理実装
		GameControllerスクリプトに以下のコードを実装する

		サンプルコード:
		public class GameController : MonoBehaviour {
			public GameObject m_Timer;
			public GameObject m_EndImage;

			// Use this for initialization
			void Start () {
				m_EndImage.SetActive (false);
			}
				
			// Update is called once per frame
			void Update () {
				if (m_Timer.GetComponent<Timer> ().IsEnd () == true &&
					m_EndImage.activeSelf == false) 
				{
					m_EndImage.SetActive (true);
				}
			}
		}

	⑫.スクリプトの関連づけ
		⑨で作成したオブジェクトに⑩で作成したスクリプトを関連付けする
	
	⑬.オブジェクト設定
		⑨のオブジェクトの項目にTimerとEndImageが追加されているので
		Timerには①で作成したオブジェクトをEndImageには
		⑥で作成したオブジェクトを関連付けする
		unity_0071
	
	⑭.実行
		実行するとテキストの数値が段々減っていき、0になると画像が描画されます。
		unity_0077

	上記のようにゲームオブジェクトから別のゲームオブジェクトを扱う場合に
	GetComponentが使用されます。

	補足:
		SetActive関数:
			関数名:
				SetActive
	
			戻り値:
				なし
		
			引数:
				bool フラグ:
					true:
						動作再開
					false:
						動作停止
		
			内容:
				オブジェクトの動作の再開、停止設定を行う
				停止中はUpdateや描画が行われない

		activeSelf:
			関数名:
				activeSelf
	
			戻り値:
				アクティブ状態
					true:
						動作中
					false:
						停止中
			引数:
				なし
				
			内容:
				オブジェクトのアクティブ状態を返すゲッター

■子供のコンポーネント取得

コンポーネントは子供のコンポーネントの取得も可能です。
取得関数はGetComponentInChildren、またはGetComponentsInChildrenを使用します。

GetComponentInChildren関数仕様:
	関数名:
		GetComponentInChildren

	戻り値:
		成功:
			取得したコンポーネント
		失敗:
			null
	
	引数:
		なし
	
	型指定:
		取得したいコンポーネントのデータ型
	
	内容:
		引数で指定したコンポーネントを自分も含めて検索して取得する
		この検索結果は最初にヒットしたコンポーネントを返す
		※「自分も」と記述している通り、関数を呼び出しているGameObjectも
		 含めて検索を行うのでその点については注意が必要

	書式例:
		GetComponentInChildren<データ型>()
	
	具体例:
		MeshRenderer mesh = GetComponentInChildren<MeshRenderer>();

GetComponentsInChildren関数仕様:
	関数名:
		GetComponentsInChildren
	
	戻り値:
		成功:
			取得したコンポーネントの配列
		失敗:
			null

	型指定:
		取得したいコンポーネントのデータ型
	
	内容:
		引数で指定したコンポーネントを自分、子供、孫を含め検索して取得する
		検索でヒットしたコンポーネントは配列に格納されて全て返される
		
	書式:
		GetComponentsInChildren<データ型>()
	
	具体例:
		MeshRenderer[] mesh_array = GetComponentsInChildren<MeshRenderer>();

使用例:
	①.親オブジェクトの作成
		HierarchyからCreateEmptyを選択し、名前を「Parent」とつける
	
	②.Cube作成
		HierarchyにCubeを作成し、座標を「0, 0, 0」とする
	
	③.Sphere作成
		HierarchyにSphereを作成し、座標を「0, -1, 0」とする
	
	④.親子関係の作成
		①で作成したオブジェクトに②と③のオブジェクトをD&Dして
		親子関係を作成する
		unity_0072
		
	⑤.MatsChangeスクリプトを作成
		C#スクリプトを追加し、「MatsChange」と名前をつける
		
	⑥.処理実装:
		MatsChangeスクリプトに以下のコードを実装する

		サンプルコード:
			public class MatsChange : MonoBehaviour {

				// Use this for initialization
				void Start () {
					// MeshRendererをまとめて取得
					MeshRenderer[] mesh_array = 
						GetComponentsInChildren<MeshRenderer> ();

					foreach (MeshRenderer mesh in mesh_array)
					{
						if (mesh != null) {
							mesh.materials [0].color = Color.cyan;
						}
					}
					
				}
					
				// Update is called once per frame
				void Update () {
				}
			}

	⑦.スクリプトの関連付け
		⑤で作成したスクリプトを①で作成した「Parent」に関連付ける
	
	⑧.実行
		処理を実行してCubeとSphereの色がシアン色になったら成功
		unity_0073