回答編集履歴

5

修正

2020/10/02 13:00

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  2のエラーが発生する場合が問題なので、
14
14
 
15
- typeofを使ってクラス名を判別してTestData2ではない場合はコンバートしてしまえば良いかと思います。
15
+ `typeof`を使クラス名を判別してTestData2ではない場合はコンバートしてしまえば良いかと思います。
16
16
 
17
17
 
18
18
 

4

修正

2020/10/02 12:59

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -10,7 +10,9 @@
10
10
 
11
11
 
12
12
 
13
+ 2のエラーが発生する場合が問題なので、
14
+
13
- typeofクラス名を判別してTestData2ではない場合はコンバートしてしまえば良いす。
15
+ typeofを使ってクラス名を判別してTestData2ではない場合はコンバートしてしまえば良いかと思います。
14
16
 
15
17
 
16
18
 

3

修正

2020/10/02 12:58

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -10,113 +10,11 @@
10
10
 
11
11
 
12
12
 
13
- 問題となる2のエラーが発生する場合はtry-catch使用してコンバートしてしまえば良いはないでしょうか
13
+ typeofでクラス名判別してTestData2ではない場合はコンバートしてしまえば良いで
14
14
 
15
15
 
16
16
 
17
17
  テストコードにすると下記の様になります。
18
-
19
-
20
-
21
- ```C#
22
-
23
- using UnityEngine;
24
-
25
-
26
-
27
- public class ScriptableCast : MonoBehaviour
28
-
29
- {
30
-
31
- [SerializeField]
32
-
33
- TestData testData;
34
-
35
-
36
-
37
- [SerializeField]
38
-
39
- TestData2 testData2;
40
-
41
-
42
-
43
- private void Start()
44
-
45
- {
46
-
47
- Cast( testData );
48
-
49
- Cast( testData2 );
50
-
51
- }
52
-
53
-
54
-
55
- void Cast( object o )
56
-
57
- {
58
-
59
- TestData2 t2 = ScriptableObject.CreateInstance<TestData2>();
60
-
61
-
62
-
63
- try
64
-
65
- {
66
-
67
- t2 = (TestData2) o;
68
-
69
- }
70
-
71
- catch
72
-
73
- {
74
-
75
- Convert( ( TestData ) o, ref t2 );
76
-
77
- }
78
-
79
-
80
-
81
- Debug.Log( t2.mMaxHp );
82
-
83
- Debug.Log( t2.mAttack );
84
-
85
- Debug.Log( t2.mDefense );
86
-
87
- Debug.Log( t2.mSpeed );
88
-
89
- }
90
-
91
-
92
-
93
- void Convert( TestData t, ref TestData2 t2 )
94
-
95
- {
96
-
97
- t2.mMaxHp = t.mMaxHp;
98
-
99
- t2.mAttack = t.mAttack;
100
-
101
- t2.mDefense = t.mDefense;
102
-
103
- t2.mSpeed = 0;
104
-
105
- }
106
-
107
- }
108
-
109
- ```
110
-
111
-
112
-
113
- TestData,TestData2のどちらが渡されてきてもTestData2として表示出来る筈です。
114
-
115
-
116
-
117
- **・追記**
118
-
119
- 上のでも動くのですがエラーで分岐はスマートではない上に今後の拡張性も悪いのでtypeofでクラスを判別した方が良いです。
120
18
 
121
19
 
122
20
 
@@ -209,3 +107,7 @@
209
107
  }
210
108
 
211
109
  ```
110
+
111
+
112
+
113
+ TestData,TestData2のどちらが渡されてきてもTestData2として表示出来る筈です。

2

追記

2020/10/02 12:57

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -111,3 +111,101 @@
111
111
 
112
112
 
113
113
  TestData,TestData2のどちらが渡されてきてもTestData2として表示出来る筈です。
114
+
115
+
116
+
117
+ **・追記**
118
+
119
+ 上のでも動くのですがエラーで分岐はスマートではない上に今後の拡張性も悪いのでtypeofでクラスを判別した方が良いです。
120
+
121
+
122
+
123
+ ```C#
124
+
125
+ using UnityEngine;
126
+
127
+
128
+
129
+ public class ScriptableCast : MonoBehaviour
130
+
131
+ {
132
+
133
+ [SerializeField]
134
+
135
+ TestData testData;
136
+
137
+
138
+
139
+ [SerializeField]
140
+
141
+ TestData2 testData2;
142
+
143
+
144
+
145
+ private void Start()
146
+
147
+ {
148
+
149
+ Cast( testData );
150
+
151
+ Cast( testData2 );
152
+
153
+ }
154
+
155
+
156
+
157
+ void Cast( object o )
158
+
159
+ {
160
+
161
+ TestData2 t2 = ScriptableObject.CreateInstance<TestData2>();
162
+
163
+
164
+
165
+ if( typeof( TestData2 ) == o.GetType() )
166
+
167
+ {
168
+
169
+ t2 = (TestData2) o;
170
+
171
+ }
172
+
173
+ else
174
+
175
+ {
176
+
177
+ Convert( ( TestData ) o, ref t2 );
178
+
179
+ }
180
+
181
+
182
+
183
+ Debug.Log( t2.mMaxHp );
184
+
185
+ Debug.Log( t2.mAttack );
186
+
187
+ Debug.Log( t2.mDefense );
188
+
189
+ Debug.Log( t2.mSpeed );
190
+
191
+ }
192
+
193
+
194
+
195
+ void Convert( TestData t, ref TestData2 t2 )
196
+
197
+ {
198
+
199
+ t2.mMaxHp = t.mMaxHp;
200
+
201
+ t2.mAttack = t.mAttack;
202
+
203
+ t2.mDefense = t.mDefense;
204
+
205
+ t2.mSpeed = 0;
206
+
207
+ }
208
+
209
+ }
210
+
211
+ ```

1

修正

2020/10/02 12:55

投稿

Hawn
Hawn

スコア1222

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- 2のエラーが発生する場合try-catchを使用してコンバートしてしまえば良いのではないでしょうか。
13
+ 問題となる2のエラーが発生する場合try-catchを使用してコンバートしてしまえば良いのではないでしょうか。
14
14
 
15
15
 
16
16