回答編集履歴

3

追記

2021/11/09 23:01

投稿

YAmaGNZ
YAmaGNZ

スコア10489

test CHANGED
@@ -203,3 +203,35 @@
203
203
  ```
204
204
 
205
205
  みたいな感じでスクリプトでリスナーを追加することもできます。
206
+
207
+
208
+
209
+
210
+
211
+ 今回はイベントリスナーの引数としてタプルを使いましたが、下記のようなイベント情報格納用のクラスを用意して受け渡すほうがいいかもしれません。
212
+
213
+ ```C#
214
+
215
+ public class PropertyChangedEventArgs
216
+
217
+ {
218
+
219
+ public LearningMode oldvalue { get; }
220
+
221
+ public LearningMode newvalue { get; }
222
+
223
+
224
+
225
+ public PropertyChangedEventArgs(LearningMode oldvalue, LearningMode newvalue)
226
+
227
+ {
228
+
229
+ this.oldvalue = oldvalue;
230
+
231
+ this.newvalue = newvalue;
232
+
233
+ }
234
+
235
+ }
236
+
237
+ ```

2

変更

2021/11/09 23:01

投稿

YAmaGNZ
YAmaGNZ

スコア10489

test CHANGED
@@ -1,5 +1,9 @@
1
1
  UnityEventを使ってやってみました。
2
2
 
3
+ (11/10 古い値、新しい値を渡していなかったのでソース変更)
4
+
5
+
6
+
3
7
 
4
8
 
5
9
  Dropdownにアタッチしたスクリプト
@@ -36,7 +40,9 @@
36
40
 
37
41
 
38
42
 
39
- [SerializeField] public UnityEvent<LearningMode> OnPropertyChanged = new UnityEvent<LearningMode>();
43
+ [SerializeField] public UnityEvent<(LearningMode oldvalue, LearningMode newvalue)> OnPropertyChanged = new UnityEvent<(LearningMode oldvalue, LearningMode newvalue)>();
44
+
45
+
40
46
 
41
47
 
42
48
 
@@ -58,9 +64,15 @@
58
64
 
59
65
  {
60
66
 
67
+ var oldvalue = _State;
68
+
69
+ var newvalue = value;
70
+
71
+
72
+
61
73
  _State = value;
62
74
 
63
- OnPropertyChanged.Invoke(_State);
75
+ OnPropertyChanged.Invoke((oldvalue, newvalue));
64
76
 
65
77
  }
66
78
 
@@ -148,11 +160,11 @@
148
160
 
149
161
 
150
162
 
151
- public void PropertyChangedHandler(PCB_LM_StateMgr.LearningMode value)
163
+ public void PropertyChangedHandler((PCB_LM_StateMgr.LearningMode oldvalue, PCB_LM_StateMgr.LearningMode newvalue) values)
152
-
164
+
153
- {
165
+ {
154
-
166
+
155
- textbox.text=$"{value}";
167
+ textbox.text = $"{values.oldvalue}→{values.newvalue}";
156
168
 
157
169
  }
158
170
 

1

追記

2021/11/09 22:46

投稿

YAmaGNZ
YAmaGNZ

スコア10489

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- [SerializeField] private UnityEvent<LearningMode> OnPropertyChanged = new UnityEvent<LearningMode>();
39
+ [SerializeField] public UnityEvent<LearningMode> OnPropertyChanged = new UnityEvent<LearningMode>();
40
40
 
41
41
 
42
42
 
@@ -173,3 +173,21 @@
173
173
 
174
174
 
175
175
  これでプロパティが変化したときにOnPropertyChangedが発生し、そのイベントでTextが変化します。
176
+
177
+
178
+
179
+
180
+
181
+ インスペクタ上での設定ではなく
182
+
183
+ ```C#
184
+
185
+ var drop = GameObject.Find("TestDropdown");
186
+
187
+ var script = drop.GetComponent<PCB_LM_StateMgr>();
188
+
189
+ script.OnPropertyChanged.AddListener(PropertyChangedHandler);
190
+
191
+ ```
192
+
193
+ みたいな感じでスクリプトでリスナーを追加することもできます。