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

回答編集履歴

6

文章の修正

2021/08/06 07:20

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -58,4 +58,4 @@
58
58
  また、ドキュメントのサンプルコードを見ると分かりますが MonoBehavior に相当するオブジェクトが ScriptableObject を保持しています。
59
59
  ( Spawner has SpawnManagerScriptableObject の形になっています)
60
60
 
61
- ドキュメントそう記載されているのですから、Unity の設計思想に合わないということはないかと思います。
61
+ ですから、ScriptableObject を保持することが Unity の設計思想に合わないということはないかと思います。

5

文章の修正

2021/08/06 07:19

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -1,4 +1,4 @@
1
- そもそも Scriptable Object を使う目的が何であるかに戻りましょうか。
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

文章の修正

2021/08/06 07:18

投稿

BluOxy
BluOxy

スコア2663

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

文章の修正

2021/08/06 07:15

投稿

BluOxy
BluOxy

スコア2663

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

コード修正

2021/08/06 07:07

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  1番の方法は getFieldDict で Dictionary を生成して、各 CharacterData のフィールドをそこに追加していると思いますが、その時点で下記ソースコードのように値に対してコピーをしていると思います。
9
9
  ```C#
10
- public Dictionary<string,T> getFieldDict() {
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

文章の修正

2021/08/06 07:05

投稿

BluOxy
BluOxy

スコア2663

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#