facebook twitter hatena line email

「Unity/Csharp/Action」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(コールバック記述方法)
 
(同じ利用者による、間の14版が非表示)
行9: 行9:
 
     Debug.Log("msg1:" + msg);
 
     Debug.Log("msg1:" + msg);
 
};
 
};
 +
 +
// 呼び出し
 +
OnMsg("hello");
 +
</pre>
 +
 +
===ラムダ式だとこうかける===
 +
<pre>
 +
System.Action<string> OnMsg = (msg) =>
 +
{
 +
    Debug.Log("msg1:" + msg);
 +
};
 +
 +
// 呼び出し
 
OnMsg("hello");
 
OnMsg("hello");
 
</pre>
 
</pre>
  
 
==Actionサンプル2(別クラス呼び出し)==
 
==Actionサンプル2(別クラス呼び出し)==
 +
<pre>
 +
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
 +
    }
 +
}
 +
</pre>
 +
 +
===Setup()の部分、ラムダ式の変数に分けると、こうかける===
 +
<pre>
 +
public class ActionScene : MonoBehaviour
 +
{
 +
    void Start()
 +
    {
 +
        System.Action callback = () =>
 +
        {
 +
            Debug.Log("callback");
 +
        };
 +
        var eventActionClass = new EventActionClass();
 +
        eventActionClass.Setup(
 +
            callback: callback);
 +
    }
 +
}
 +
</pre>
 +
 +
==Actionサンプル3(Actionを複数呼び出し)==
 
<pre>
 
<pre>
 
public class ActionScene : MonoBehaviour
 
public class ActionScene : MonoBehaviour
行30: 行83:
 
     }
 
     }
 
}
 
}
 
 
public class EventActionClass
 
public class EventActionClass
 
{
 
{
行42: 行94:
 
</pre>
 
</pre>
  
==Actionサンプル3引数で渡して戻す==
+
===Setup()の部分、ラムダ式の変数に分けると、こうかける===
 
<pre>
 
<pre>
 
public class ActionScene : MonoBehaviour
 
public class ActionScene : MonoBehaviour
行48: 行100:
 
     void Start()
 
     void Start()
 
     {
 
     {
         System.Action<string> event = (name) =>
+
        System.Action onAction = () =>
 +
        {
 +
            Debug.Log("callOnAction");
 +
        };
 +
        System.Action offAction = () =>
 +
        {
 +
            Debug.Log("callOffAction");
 +
        };
 +
        var eventActionClass = new EventActionClass();
 +
        eventActionClass.Setup(
 +
            callOnAction: onAction,
 +
            callOffAction: offAction);
 +
    }
 +
}
 +
</pre>
 +
 
 +
===Setup()の部分、ラムダ式で無名関数にすると、こうかける===
 +
<pre>
 +
public class ActionScene : MonoBehaviour
 +
{
 +
    void Start()
 +
    {
 +
        var eventActionClass = new EventActionClass();
 +
        eventActionClass.Setup(
 +
            callOnAction: () => {Debug.Log("callOnAction"); },
 +
            callOffAction: () => { Debug.Log("callOffAction"); });
 +
    }
 +
}
 +
</pre>
 +
 
 +
==Actionサンプル4、引数で渡して戻す==
 +
<pre>
 +
public class ActionScene : MonoBehaviour
 +
{
 +
    void Start()
 +
    {
 +
         System.Action<string> callback = (name) =>
 
         {
 
         {
 
             Debug.Log(name); // hogeが返ってくる
 
             Debug.Log(name); // hogeが返ってくる
 
         };
 
         };
         (new sampleLogic).Load(event);
+
         var sampleLogic = new SampleLogic();
 +
        sampleLogic.Load(callback);
 
     }
 
     }
 
}
 
}
 
public class SampleLogic
 
public class SampleLogic
 
{
 
{
     public void Load(System.Action<string> event)
+
     public void Load(System.Action<string> callback)
 
     {
 
     {
         event("hoge");
+
         callback("hoge");
 
     }
 
     }
 
}
 
}
 +
</pre>
 +
 +
==コールバック記述方法==
 +
たとえば、callbackのコールバックだとすると、戻る処理として、以下2つがあるが、
 +
<pre>
 +
callback();
 +
callback?.Invoke();
 +
</pre>
 +
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);
}