ラムダ式ってなんだ in Unity

こんにちは、カキレモンです。日記チャレンジをしています。
といっても日記に書くようなイベントが毎日あるとは限らないので、しばらくは既知のことを書いて時間を稼ぎたいと思います。

今日は表題の通りUnity(C#)でラムダ式を使うお話です。主に、「聞いたことはあるがよくわからない。御託はいいから使い方を教えてくれ」という人向けです。しかしここから結構悠長に前置きを書いていく予定なので、本当に早くラムダ式の話を読みたい人はStep.2まで飛ばしてください。

さて本題ですが。

Unityを使っていると(使っていなくても)「ラムダ式」という言葉を聞くことがあります。あるいは「無名関数」とか「匿名メソッド」みたいに名乗っているときもあります。(これらはしばしば混同されていますし、詳細な区別は割愛します。)

いずれにしろ、やたら大層な名前ですね。これだけでもうお腹いっぱいになりそうです。

でも書き方はとてもシンプルで、使いようによっては小回りを利かせられる便利な代物です。というか、ラムダ式を使いこなすとまるでプログラミングが上手になったような錯覚を手軽に得られるのでコスパがいいです。

というわけで、ここからはUnity上での具体的なケースを見ていきましょう。今回は「ボタンを押したらDebug.Logを使ってHello Worldを出力する」というシチュエーションを想定してやっていきます。ラムダ式のメリットを主張したいので、まずはラムダ式を使わない方法から。

Step.0 

最も初歩的な指南本にはおそらく、Buttonのインスペクター上で直接メソッドを選んで設定する次のような方法が載っています。

例えばこういう関数を作って、インスペクター上でやけに豊富な選択肢の中から設定しましょう。

public void SayHello()
{
   Debug.Log("Hello World.");
}

スクリーンショット 2021-03-14 190830 (2)

ある意味直感的ではありますが、最大のデメリットは超絶めんどくさいことです。やってられるか。

はい

Step.1

​スクリプト上でButtonを参照すれば、次のように書くと(インスペクター上で手動で設定する代わりに)シーン開始時にクリック時のイベントを設定できます。Step.0に比べて煩雑さは少し減っていますね。

private void Start()
{
   button.onClick.AddListener(SayHello);
}

ただ気になるのは、いちいち関数に名前をつけて定義しなければいけないということです。

もしボタンの種類がもっとたくさんあって、それぞれ別々の処理をしないといけないとしたら?
各ボタンごとにいちいち名前を用意しなきゃいけないんですか?

やっぱりこの方法はあまり現実的ではないです。そもそも元の例だって、単にDebug.Logするだけなのに別の関数を定義するのはコスパが悪いですね。

Step.2

さてラムダ式です。単刀直入に、Step.1はこう書けます。

private void Start() 
{
    button.onClick.AddListener(() => Debug.Log("Hello World."));
}

SayHelloとかいう取ってつけたような名前の関数は晴れてお役御免となりました。よかったね。

代わりになんだか異形のものが現れてしまいました。これは、かつてSayHelloだったものです。以下の図を見ていただきましょう。

画像2

たぶんそういうことです。ちなみに「=>」は矢印を表しているみたいです。

これでボタンのクリック処理を量産することができます。
ちなみに複数行の処理を書くときはラムダ式の右辺を中括弧{}で囲みます。

button1.onClick.AddListener(() => Debug.Log("Hello World."));
button2.onClick.AddListener(() => Debug.Log("Goodbye World."));
button3.onClick.AddListener(() => transform.Translate(new Vector3(1, 0, 0)));

//複数行の処理
button4.onClick.AddListener(() =>
{
     GameObject player = GameObject.Find("Player");
     Destroy(player);
});

長くなってきたのでそろそろ終わりにします。ちゃんと知りたい方は検索するか、とりあえず書いてみてUnityに聞いてみましょう。

おわりに

日記…………とは…………????

日記とか生まれてこの方書いたことがないのでわかりません。次はもう少し日記っぽく書けるようにがんばります。

あとnoteのコード表示きらい。gistを使うといいのかな。

それでは、(願わくば、)また。


この記事が気に入ったらサポートをしてみませんか?