teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記

2021/11/09 23:01

投稿

YAmaGNZ
YAmaGNZ

スコア10654

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

変更

2021/11/09 23:01

投稿

YAmaGNZ
YAmaGNZ

スコア10654

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(_State);
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 value)
82
+ public void PropertyChangedHandler((PCB_LM_StateMgr.LearningMode oldvalue, PCB_LM_StateMgr.LearningMode newvalue) values)
77
83
  {
78
- textbox.text=$"{value}";
84
+ textbox.text = $"{values.oldvalue}→{values.newvalue}";
79
85
  }
80
86
 
81
87
  }

1

追記

2021/11/09 22:46

投稿

YAmaGNZ
YAmaGNZ

スコア10654

answer CHANGED
@@ -17,7 +17,7 @@
17
17
  Allways_Hide = 2,
18
18
  }
19
19
 
20
- [SerializeField] private UnityEvent<LearningMode> OnPropertyChanged = new UnityEvent<LearningMode>();
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
  ![イメージ説明](c7f6a2c8221808fe4646c016781afd86.png)
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
+ みたいな感じでスクリプトでリスナーを追加することもできます。