回答編集履歴
3
追記
answer
CHANGED
@@ -100,4 +100,20 @@
|
|
100
100
|
var script = drop.GetComponent<PCB_LM_StateMgr>();
|
101
101
|
script.OnPropertyChanged.AddListener(PropertyChangedHandler);
|
102
102
|
```
|
103
|
-
みたいな感じでスクリプトでリスナーを追加することもできます。
|
103
|
+
みたいな感じでスクリプトでリスナーを追加することもできます。
|
104
|
+
|
105
|
+
|
106
|
+
今回はイベントリスナーの引数としてタプルを使いましたが、下記のようなイベント情報格納用のクラスを用意して受け渡すほうがいいかもしれません。
|
107
|
+
```C#
|
108
|
+
public class PropertyChangedEventArgs
|
109
|
+
{
|
110
|
+
public LearningMode oldvalue { get; }
|
111
|
+
public LearningMode newvalue { get; }
|
112
|
+
|
113
|
+
public PropertyChangedEventArgs(LearningMode oldvalue, LearningMode newvalue)
|
114
|
+
{
|
115
|
+
this.oldvalue = oldvalue;
|
116
|
+
this.newvalue = newvalue;
|
117
|
+
}
|
118
|
+
}
|
119
|
+
```
|
2
変更
answer
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
UnityEventを使ってやってみました。
|
2
|
+
(11/10 古い値、新しい値を渡していなかったのでソース変更)
|
2
3
|
|
4
|
+
|
3
5
|
Dropdownにアタッチしたスクリプト
|
4
6
|
```C#
|
5
7
|
using System.Collections;
|
@@ -17,8 +19,9 @@
|
|
17
19
|
Allways_Hide = 2,
|
18
20
|
}
|
19
21
|
|
20
|
-
[SerializeField] public UnityEvent<LearningMode> OnPropertyChanged = new UnityEvent<LearningMode>();
|
22
|
+
[SerializeField] public UnityEvent<(LearningMode oldvalue, LearningMode newvalue)> OnPropertyChanged = new UnityEvent<(LearningMode oldvalue, LearningMode newvalue)>();
|
21
23
|
|
24
|
+
|
22
25
|
public static LearningMode _State = LearningMode.Show_Only_MouseOver;
|
23
26
|
public LearningMode EnumProperty
|
24
27
|
{
|
@@ -28,8 +31,11 @@
|
|
28
31
|
{
|
29
32
|
if(value != _State)
|
30
33
|
{
|
34
|
+
var oldvalue = _State;
|
35
|
+
var newvalue = value;
|
36
|
+
|
31
37
|
_State = value;
|
32
|
-
OnPropertyChanged.Invoke(
|
38
|
+
OnPropertyChanged.Invoke((oldvalue, newvalue));
|
33
39
|
}
|
34
40
|
}
|
35
41
|
}
|
@@ -73,9 +79,9 @@
|
|
73
79
|
textbox = GetComponent<Text>();
|
74
80
|
}
|
75
81
|
|
76
|
-
public void PropertyChangedHandler(PCB_LM_StateMgr.LearningMode
|
82
|
+
public void PropertyChangedHandler((PCB_LM_StateMgr.LearningMode oldvalue, PCB_LM_StateMgr.LearningMode newvalue) values)
|
77
83
|
{
|
78
|
-
textbox.text=$"{
|
84
|
+
textbox.text = $"{values.oldvalue}→{values.newvalue}";
|
79
85
|
}
|
80
86
|
|
81
87
|
}
|
1
追記
answer
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
Allways_Hide = 2,
|
18
18
|
}
|
19
19
|
|
20
|
-
[SerializeField]
|
20
|
+
[SerializeField] public UnityEvent<LearningMode> OnPropertyChanged = new UnityEvent<LearningMode>();
|
21
21
|
|
22
22
|
public static LearningMode _State = LearningMode.Show_Only_MouseOver;
|
23
23
|
public LearningMode EnumProperty
|
@@ -85,4 +85,13 @@
|
|
85
85
|

|
86
86
|
こんな感じでインスペクタでプロパティが変化したときに実行するメソッドを設定
|
87
87
|
|
88
|
-
これでプロパティが変化したときにOnPropertyChangedが発生し、そのイベントでTextが変化します。
|
88
|
+
これでプロパティが変化したときにOnPropertyChangedが発生し、そのイベントでTextが変化します。
|
89
|
+
|
90
|
+
|
91
|
+
インスペクタ上での設定ではなく
|
92
|
+
```C#
|
93
|
+
var drop = GameObject.Find("TestDropdown");
|
94
|
+
var script = drop.GetComponent<PCB_LM_StateMgr>();
|
95
|
+
script.OnPropertyChanged.AddListener(PropertyChangedHandler);
|
96
|
+
```
|
97
|
+
みたいな感じでスクリプトでリスナーを追加することもできます。
|