トーフメモ

主にゲーム制作

3秒でわかる!「デリゲート」【UnityC#】

f:id:tofgame:20190428235503j:plain

デリゲートとは

メソッドへの参照 です!
クラスみたいに参照して使えます。

書き方

自分でデリゲートを定義するやり方と、.NET Frameworkクラスライブラリに定義されてるAction、Funcを使うやりかたがあります。

自分で定義

delegateという修飾子を使うことでデリゲートを作れます。

引数なし、戻り値なし

public delegate void TestDelegate1();

void Start(){
    TestDelegate1 td1=PrintA;
    td1();
}

public void PrintA () {
    Debug.Log("A");
}

引数あり、戻り値なし

public delegate void TestDelegate2<T>(string str);

void Start(){
    TestDelegate2<string> td2=Print;
    td2("B");
}

public void Print (string str) {
    Debug.Log(str);
}

引数なし、戻り値あり

public delegate string TestDelegate3();

void Start(){
    TestDelegate3 td3=ReturnCharacter;
    Debug.Log(td3());
}

public string ReturnCharacter() {
    return"C";
}

引数あり、戻り値あり

public delegate string TestDelegate4<T>(string str);

void Start(){
    TestDelegate4<string> td4=ReturnCharacter;
    Debug.Log(td4("D"));
}

public string ReturnCharacter(string str) {
    return str;
}

Action、Func

この二つを使うときは以下を忘れないようにしましょう。

using System;

Action

戻り値なしのデリゲートを定義できます。

void Start(){
    Action a1=PrintA;
    a1();

    Action<string> a2=Print;
    a2("B");
}

public void PrintA () {
    Debug.Log("A");
}

public void Print (string str) {
    Debug.Log(str);
}

Func

戻り値ありのデリゲートを定義できます。

void Start(){
    Func<string> f1=ReturnCharacter;
    Debug.Log(f1());

    Func<string,string> f2=ReturnCharacter;
    Debug.Log(f2("D"));
}

public string ReturnCharacter() {
    return"C";
}

public string ReturnCharacter(string str) {
    return str;
}

デリゲートの足し算

引数と戻り値が一致(または互換可能)、または戻り値引数なしデリゲート同士なら、足し算もできます。

void Start () {
    Action a1 = PrintA;
    Action a2 = PrintA;
    Action a3 = a1+a2;

    a3();
}

public void PrintA () {
    Debug.Log("A");
}