Unity/Csharp/Action
提供: 初心者エンジニアの簡易メモ
目次
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);
}
