回答編集履歴
6
文章の修正
answer
CHANGED
@@ -58,4 +58,4 @@
|
|
58
58
|
また、ドキュメントのサンプルコードを見ると分かりますが MonoBehavior に相当するオブジェクトが ScriptableObject を保持しています。
|
59
59
|
( Spawner has SpawnManagerScriptableObject の形になっています)
|
60
60
|
|
61
|
-
|
61
|
+
ですから、ScriptableObject を保持することが Unity の設計思想に合わないということはないかと思います。
|
5
文章の修正
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
そもそも
|
1
|
+
そもそも ScriptableObject を使う目的が何であるかに戻りましょうか。
|
2
2
|
[ScriptableObject](https://docs.unity3d.com/ja/2018.4/Manual/class-ScriptableObject.html) には下記のような記載があります。
|
3
3
|
|
4
4
|
> 値に対し複数のコピーを避けることによってプロジェクトのメモリ消費を削減すること
|
@@ -53,7 +53,7 @@
|
|
53
53
|
|
54
54
|
### 結論
|
55
55
|
|
56
|
-
以上を考慮すると2番を使うのが
|
56
|
+
以上を考慮すると2番を使うのが理に適っていて、ソースコードもシンプルになり良いことしかないと思います。
|
57
57
|
|
58
58
|
また、ドキュメントのサンプルコードを見ると分かりますが MonoBehavior に相当するオブジェクトが ScriptableObject を保持しています。
|
59
59
|
( Spawner has SpawnManagerScriptableObject の形になっています)
|
4
文章の修正
answer
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
これでは値のコピーによるメモリ消費が発生しているため、ScriptableObject の目的が果たされていません。
|
24
24
|
|
25
|
-
2番の方法はオブジェクトを渡しているため値ではなく status の参照のみをコピーを渡しています。
|
25
|
+
2番の方法はオブジェクトを渡しているため値ではなく status の参照(status が持つ値に割り当てられているメモリのアドレス情報)のみをコピーを渡しています。
|
26
26
|
|
27
27
|
```C#
|
28
28
|
private readonly CharacterData _status;
|
3
文章の修正
answer
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
上記が活かされているか否かをベースに考えてみましょう。
|
7
7
|
|
8
8
|
1番の方法は getFieldDict で Dictionary を生成して、各 CharacterData のフィールドをそこに追加していると思いますが、その時点で下記ソースコードのように値に対してコピーをしていると思います。
|
9
|
+
|
9
10
|
```C#
|
10
11
|
public Dictionary<string,T> getFieldDict() {
|
11
12
|
var field_dict = new Dictionary<string,T>();
|
@@ -19,6 +20,7 @@
|
|
19
20
|
}
|
20
21
|
```
|
21
22
|
|
23
|
+
これでは値のコピーによるメモリ消費が発生しているため、ScriptableObject の目的が果たされていません。
|
22
24
|
|
23
25
|
2番の方法はオブジェクトを渡しているため値ではなく status の参照のみをコピーを渡しています。
|
24
26
|
|
@@ -29,8 +31,9 @@
|
|
29
31
|
}
|
30
32
|
```
|
31
33
|
|
34
|
+
これは値のコピーを行っていないので、ScriptObject の目的に沿っています。
|
32
35
|
|
33
|
-
また、2番の方法の派生として下記のような書き方も考えつくかとは思いますが、これも値のコピーが行われ
|
36
|
+
また、2番の方法の派生として下記のような書き方も考えつくかとは思いますが、これも値のコピーが行われます。
|
34
37
|
|
35
38
|
```C#
|
36
39
|
public Character(CharacterData status) {
|
2
コード修正
answer
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
1番の方法は getFieldDict で Dictionary を生成して、各 CharacterData のフィールドをそこに追加していると思いますが、その時点で下記ソースコードのように値に対してコピーをしていると思います。
|
9
9
|
```C#
|
10
|
-
|
10
|
+
public Dictionary<string,T> getFieldDict() {
|
11
11
|
var field_dict = new Dictionary<string,T>();
|
12
12
|
field_dict.Add("name", name);
|
13
13
|
// ここで値のコピーが行われている
|
@@ -16,7 +16,7 @@
|
|
16
16
|
field_dict.Add("atk", atk);
|
17
17
|
field_dict.Add("def", def);
|
18
18
|
return field_dict;
|
19
|
-
|
19
|
+
}
|
20
20
|
```
|
21
21
|
|
22
22
|
|
1
文章の修正
answer
CHANGED
@@ -5,8 +5,21 @@
|
|
5
5
|
|
6
6
|
上記が活かされているか否かをベースに考えてみましょう。
|
7
7
|
|
8
|
-
1番の方法は getFieldDict で Dictionary を生成して、各 CharacterData のフィールドをそこに追加していると思いますが、
|
8
|
+
1番の方法は getFieldDict で Dictionary を生成して、各 CharacterData のフィールドをそこに追加していると思いますが、その時点で下記ソースコードのように値に対してコピーをしていると思います。
|
9
|
+
```C#
|
10
|
+
public Dictionary<string,T> getFieldDict() {
|
11
|
+
var field_dict = new Dictionary<string,T>();
|
12
|
+
field_dict.Add("name", name);
|
13
|
+
// ここで値のコピーが行われている
|
14
|
+
field_dict.Add("max_hp ", max_hp );
|
15
|
+
field_dict.Add("max_mp ", max_mp );
|
16
|
+
field_dict.Add("atk", atk);
|
17
|
+
field_dict.Add("def", def);
|
18
|
+
return field_dict;
|
19
|
+
}
|
20
|
+
```
|
9
21
|
|
22
|
+
|
10
23
|
2番の方法はオブジェクトを渡しているため値ではなく status の参照のみをコピーを渡しています。
|
11
24
|
|
12
25
|
```C#
|