質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

3441閲覧

UnityでDictionaryを使って関数を呼び出す方法

UDON3

総合スコア80

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/08/16 04:00

現状

Unityで閉じるボタンを実装しているのですが、文字列を変更するだけで実行する処理を変えられるようにしたいです。

実現したいこと

スクリプトA 外部から呼べる関数がある
スクリプトB 外部から呼べる関数がある
スクリプトC 文字列で指定することで、スクリプトA,Bのどちらの関数を呼ぶか選択できる。
というようにしたいです。
これを実現するためにDictionaryを使うのではないかと思うのですが、関数を代入する変数などは見たことがないです。
どのようにすると可能になるのでしょうか。
###バージョン
Unity2018.2.2f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

必要性があるかどうかはともかく、そのままの実装例を

csharp

1public class Program 2{ 3 public static void Main() 4 { 5 var dicAct = new Dictionary<string, Action<int>>(); 6 dicAct.Add("a", WriteInt); 7 dicAct["a"](2); 8 } 9 private static void WriteInt(int i) => Console.WriteLine(i.ToString()); 10}

投稿2018/08/16 05:16

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UDON3

2018/08/16 13:21

無事にできました。Actionは見たことがなかったので、参考になりました。
guest

0

この辺りが参考になりますかね?

SendMessage
Invoke
文字列で指定したメソッドを呼び出すには?

投稿2018/08/16 04:52

HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UDON3

2018/08/16 13:22

クラスの枠組みを超えるとInvorkeがイマイチうまく動きませんでした。 同じクラス内で呼ぶときにはシンプルでいいと思ったので使おうと思いました。
guest

0

####最初に
内容を解釈しづらいのですが、
閉じるボタンを押したときにスクリプトCが動く…というイメージでしょうか?

他に解釈ができなかったので、一応上のイメージ前提で回答します

####気になるところ

スクリプトA,Bのどちらの関数を呼ぶか選択

結局、何かの値を元に分岐がしたいということですよね。
別に文字列に限らずとも良いかと思います。

関数を代入する変数などは見たことがない

C#の言語仕様の一つに、デリゲートという機能があります。
簡単に言うと、関数を入れる入れ物(変数)を用意できます。

####コード例

C#

1delegate void SomeDelegate(); 2 3//閉じるボタンの処理? 4void ScriptC(string s){ 5 SomeDelegate script; 6 if(s == "スクリプトA"){ 7 new SomeDelegate(ScriptA); 8 } 9 else{ 10 new SomeDelegate(ScriptB); 11 } 12 13 //ここで入れ物の中が持っているメソッド(ScriptAまたはScriptB)が実行される 14 script(); 15} 16 17void ScriptA() 18{ 19 //スクリプトA 20} 21 22void ScriptB() 23{ 24 //スクリプトB 25}

####最後に
ScriptAとScriptB間で、どう処理が変わるのかが疑問に感じます。
内容によっては、文字列で処理を切り替えるのは適切ではない可能性があります。

投稿2018/08/16 04:16

編集2018/08/16 04:19
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2018/08/16 04:26 編集

あ…今更ですが、Dictionaryは別に使わなくて良いんじゃない?と思います。 Dictionaryを使うなら、キー(TKey)を一意のstring、値(TValue)をAction型などのデリゲートにしたり しないとメソッドをDictionary保持できないからです。 よっぽど処理が分岐するならばDictionaryを使ってよいかもしれませんが、 今回は必要性を感じないので、いらないと思います
UDON3

2018/08/16 13:29

今回は、要素数がいくつになるかわからないため、Dictionaryを使ったのもありますし、ソースコードがコンパクトに収まるようにDictionaryを使うことにしました。if文のほうが高速なのかもしれませんが、今回は実験的に試してみることにしようとおもいます。この書き方も今後の参考にしようと思います、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問