前提・実現したいこと
現在、ドロップリストにEnumを登録し、ドロップリストからEnumの値を選択して変更できるようにしました。
これを、例えばEnum1からEnum2に変更されたときのみに通知を出し、Enumが定義されているスクリプトを直接参照せずに
通知を受け取った側でなんらかの処理を実行する仕組みを作りたいと考えています。
色々調べてみて一件だけやりたいことに近いことをしている記事はあったのですが、delegateとeventの使い方が
よくわからず困っています。どのようにすれば通知の発行、受け取りを行えますでしょうか?
該当のソースコード
cs
1using System; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using TMPro; 6 7public class PCB_LM_StateMgr : MonoBehaviour 8{ 9 public enum LearningMode 10 { 11 Show_Only_MouseOver = 0, 12 Allways_Show = 1, 13 Allways_Hide = 2, 14 } 15 16 public static LearningMode _State = LearningMode.Show_Only_MouseOver; 17 public delegate void EnumPropertyChangedDelegate(object sender, Enum newValue); 18 public event EnumPropertyChangedDelegate EnumPropertyChanged; 19 public LearningMode EnumProperty 20 { 21 get{return _State;} 22 23 set 24 { 25 if(value != _State) 26 { 27 _State = value; 28 EnumPropertyChanged?.Invoke(this, _State); 29 } 30 } 31 } 32 33 private TMP_Dropdown DropdownList; 34 35 void Start() 36 { 37 DropdownList = GetComponent<TMP_Dropdown>(); 38 39 string[] StateName = new string[] {"マウスオーバー時のみ表示","常に表示","常に非表示"}; 40 41 //Stringの配列をリストに変換 42 List<string> names = new List<string>(StateName); 43 44 DropdownList.ClearOptions(); 45 //DropDownの要素にリストを追加 46 DropdownList.AddOptions(names); 47 } 48 49 public void Change_PCBox_State() //DropdownList の OnValueChange に登録する 50 { 51 _State = (LearningMode)DropdownList.value; 52 } 53}
目的としている動作がよくわかりませんが、以下のeventについて説明してあるページは参考になりますか?
https://dobon.net/vb/dotnet/vb2cs/event.html
アドバイスありがとうございます。
記事の方拝見させていただきましたが、難しいですね...
目的としてる動作は、ドロップリストから値を変更、変更時に変更された値をイベントとして発行し、受け取り側が発行された値に基づいた処理を実行する。という流れを目指しています。
DropdownListで値が変更された時にChange_PCBox_Stateが呼ばれるんですかね?
それであればEnumPropertyのsetterを介さずに_Stateへ代入するとイベントが発生しないのでは?
>DropdownListで値が変更された時にChange_PCBox_Stateが呼ばれるんですかね?
はい、その通りです。現状は見ての通り_Stateに変更された値を代入して別スクリプトで_Stateを取得しています。
EnumPropertyなどは質問文中の記事を参考に見よう見まねで実装したため、具体的な使い方が分からないという状態です。_StateをEnumPropertyに変更したとして、別スクリプトからEnumPropertyを参照してどのようにすればよろしいでしょうか?
Unityに関しては私も詳しくないのでさっと検索しただけですが
「UnityAction」や「UnityEvent」について検索してみるといいかと思います。
回答2件
あなたの回答
tips
プレビュー