「Unity/Csharp/Action」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→Actionサンプル4、引数で渡して戻す) |
(→コールバック記述方法) |
||
行160: | 行160: | ||
</pre> | </pre> | ||
callback();は、callbackがnullだと、Exceptionが発生するが、callback?.Invoke();だと、nullでも動作するので、callback?.Invoke();のほうが良いかも | callback();は、callbackがnullだと、Exceptionが発生するが、callback?.Invoke();だと、nullでも動作するので、callback?.Invoke();のほうが良いかも | ||
+ | |||
+ | ==callbackの型が一致している引数の処理の省略形== | ||
+ | callbackの型が一致している引数の処理であれば、このようにかける。 | ||
+ | |||
+ | 省略 | ||
+ | MainExec(ResponseExec); | ||
+ | |||
+ | 省略前 | ||
+ | <pre> | ||
+ | MainExec((key, flag) => { | ||
+ | ResponseExec(key, flag); | ||
+ | }); | ||
+ | </pre> | ||
+ | |||
+ | それぞれの処理例 | ||
+ | <pre> | ||
+ | void MainExec(System.Action<string, bool> callback) | ||
+ | { | ||
+ | callback?.Invoke("test", true); | ||
+ | } | ||
+ | void ResponseExec(string key, bool flag) | ||
+ | { | ||
+ | Debug.Log("key=" + key + " flag=" + flag); | ||
+ | } | ||
+ | </pre> |
2025年8月13日 (水) 17:53時点における最新版
目次
Actionとは
関数を変数にできるもの
Actionサンプル1
System.Action<string> OnMsg = delegate (string msg) { }; OnMsg += (msg) => { Debug.Log("msg1:" + msg); }; // 呼び出し OnMsg("hello");
ラムダ式だとこうかける
System.Action<string> OnMsg = (msg) => { Debug.Log("msg1:" + msg); }; // 呼び出し OnMsg("hello");
Actionサンプル2(別クラス呼び出し)
public class ActionScene : MonoBehaviour { void Start() { var eventActionClass = new EventActionClass(); eventActionClass.Setup( callback: () => { Debug.Log("callback"); }); } } public class EventActionClass { public void Setup(System.Action callback) { callback(); // callback.Invoke(); でもOK } }
Setup()の部分、ラムダ式の変数に分けると、こうかける
public class ActionScene : MonoBehaviour { void Start() { System.Action callback = () => { Debug.Log("callback"); }; var eventActionClass = new EventActionClass(); eventActionClass.Setup( callback: callback); } }
Actionサンプル3(Actionを複数呼び出し)
public class ActionScene : MonoBehaviour { void Start() { var eventActionClass = new EventActionClass(); eventActionClass.Setup( callOnAction: () => { Debug.Log("callOnAction"); }, callOffAction: () => { Debug.Log("callOffAction"); }); } } public class EventActionClass { public void Setup(System.Action callOnAction, System.Action callOffAction) { callOnAction(); callOffAction(); } }
Setup()の部分、ラムダ式の変数に分けると、こうかける
public class ActionScene : MonoBehaviour { void Start() { System.Action onAction = () => { Debug.Log("callOnAction"); }; System.Action offAction = () => { Debug.Log("callOffAction"); }; var eventActionClass = new EventActionClass(); eventActionClass.Setup( callOnAction: onAction, callOffAction: offAction); } }
Setup()の部分、ラムダ式で無名関数にすると、こうかける
public class ActionScene : MonoBehaviour { void Start() { var eventActionClass = new EventActionClass(); eventActionClass.Setup( callOnAction: () => {Debug.Log("callOnAction"); }, callOffAction: () => { Debug.Log("callOffAction"); }); } }
Actionサンプル4、引数で渡して戻す
public class ActionScene : MonoBehaviour { void Start() { System.Action<string> callback = (name) => { Debug.Log(name); // hogeが返ってくる }; var sampleLogic = new SampleLogic(); sampleLogic.Load(callback); } } public class SampleLogic { public void Load(System.Action<string> callback) { callback("hoge"); } }
コールバック記述方法
たとえば、callbackのコールバックだとすると、戻る処理として、以下2つがあるが、
callback(); callback?.Invoke();
callback();は、callbackがnullだと、Exceptionが発生するが、callback?.Invoke();だと、nullでも動作するので、callback?.Invoke();のほうが良いかも
callbackの型が一致している引数の処理の省略形
callbackの型が一致している引数の処理であれば、このようにかける。
省略
MainExec(ResponseExec);
省略前
MainExec((key, flag) => { ResponseExec(key, flag); });
それぞれの処理例
void MainExec(System.Action<string, bool> callback) { callback?.Invoke("test", true); } void ResponseExec(string key, bool flag) { Debug.Log("key=" + key + " flag=" + flag); }