Actionで処理を委譲する（デリゲート）


構成
InputManager（委譲先）
ActionTest01（委譲元・動作処理の想定）
ActionTest02（委譲元・音声処理の想定）

![スクリーンショット 2017-10-24 16.44.24.png](https://qiita-image-store.s3.amazonaws.com/0/136286/97f8c278-6591-2c56-4d64-7751ed35f8c4.png "スクリーンショット 2017-10-24 16.44.24.png")


## 委譲先

条件分岐を行い、アクションメソッドを実行する。
処理の詳細な内容は委譲元に記述する。

```cs:InputManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; // Actionに必要

// -------------------------------------------
// 委譲先 アクションメソッドを実行する
// -------------------------------------------

public class InputManager : MonoBehaviour {

	public event Action Idle;
	public event Action Attack01;
	public event Action Attack02;

	void Update () {
		if (Input.GetKeyDown (KeyCode.Space) && Idle != null) {
			Idle ();
		}
		if (Input.GetKeyDown (KeyCode.F1) && Attack01 != null) {
			Attack01 ();
		}
		if (Input.GetKeyDown (KeyCode.F2) && Attack02 != null) {
			Attack02 ();
		}
	}
}
```


## 委譲元

アクションメソッドの登録・削除のみを行い、処理の実行は`InputManager`に委譲する。
ゲームオブジェクトがアクティブになったらアクションメソッドを登録、
ゲームオブジェクトが非アクティブになったらアクションメソッドを削除。

`ActionTest01`ゲームオブジェクトにアタッチする
動作周りの処理を想定

```cs:ActionTest1.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// -------------------------------------------
// 委譲元 アクションメソッドの登録・削除（実行はしない）
// -------------------------------------------

public class ActionTest1 : MonoBehaviour {

	private InputManager inputManager;

	void Awake() {
		// scriptの参照
		GameObject inputManagerObj = GameObject.Find("InputManager");
		if (inputManagerObj != null) {
			inputManager = inputManagerObj.GetComponent<InputManager> ();
		}
		if (inputManager == null) {
			Debug.Log ("Cannot find 'InputManager' script");
		}
	}

	void OnEnable() {
		// アクションメソッドの登録
		inputManager.Idle += Idle;
		inputManager.Attack01 += Run;
		inputManager.Attack01 += Punch;
		inputManager.Attack02 += Jump;
		inputManager.Attack02 += Kick;
	}

	void OnDisable() {
		// アクションメソッドの削除
		inputManager.Idle -= Idle;
		inputManager.Attack01 -= Run;
		inputManager.Attack01 -= Punch;
		inputManager.Attack02 -= Jump;
		inputManager.Attack02 -= Kick;
	}

	void Idle() {
		Debug.Log ("[ActionTest1] Idle...");
	}
	void Run() {
		Debug.Log ("[ActionTest1] Run...");
	}
	void Jump() {
		Debug.Log ("[ActionTest1] Jump...");
	}
	void Kick() {
		Debug.Log ("[ActionTest1] Kick...");
	}
	void Punch() {
		Debug.Log ("[ActionTest1] Punch...");
	}

}
```

`ActionTest02`ゲームオブジェクトにアタッチする
サウンド周りの処理を想定

```cs:ActionTest2.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// -------------------------------------------
// 委譲元 アクションメソッドの登録・削除（実行はしない）
// -------------------------------------------

public class ActionTest2 : MonoBehaviour {

	private InputManager inputManager;

	void Awake() {
		// scriptの参照
		GameObject inputManagerObj = GameObject.Find("InputManager");
		if (inputManagerObj != null) {
			inputManager = inputManagerObj.GetComponent<InputManager> ();
		}
		if (inputManager == null) {
			Debug.Log ("Cannot find 'InputManager' script");
		}
	}

	void OnEnable() {
		// アクションメソッドの登録
		inputManager.Idle += Talk;
		inputManager.Attack01 += PunchSound;
		inputManager.Attack02 += KickSound;
	}

	void OnDisable() {
		// アクションメソッドの削除
		inputManager.Idle -= Talk;
		inputManager.Attack01 -= PunchSound;
		inputManager.Attack02 -= KickSound;
	}

	void Talk() {
		Debug.Log ("[ActionTest2] Talk...");
	}
	void KickSound() {
		Debug.Log ("[ActionTest2] KickSound...");
	}
	void PunchSound() {
		Debug.Log ("[ActionTest2] PunchSound...");
	}

}
```

> 参考
[【C#】eventとdelegateの違い](http://baba-s.hatenablog.com/entry/2014/01/24/124321)
[デリゲートとは【C#】](http://kan-kikuchi.hatenablog.com/entry/Delegate)