前提,実現したいこと
Assetとして保存しているScriptableObjectから,
実際にデータを保持してゲーム内でのふるまいを実装したclassへの値の受け渡しについて悩んでいます.
Unity, C#ともに初心者です.
ScriptableObjectについて調べてみても,
データの受け渡しについて詳しく書かれたものは見つかりませんでした.
何か妙案あればアドバイスいただきたいです.
例えば,以下のようなScriptableObjectとその実態クラスがあります.
C#
1using System.Collections.Generic; 2using UnityEngine; 3 4public class Character { 5 private string name; 6 private int max_hp; 7 private int max_mp; 8 private int atk; 9 private int def; 10 . 11 . 12 . 13 // ここまで CharacterData の field と全く同じ 14 15 // ここから Character のみ持つ field 16 private int hp; 17 private int mp; 18 19 public void Damage(int damage) { 20 this.hp -= damage 21 } 22 public int Attack() { 23 int damage = this.atk; 24 return damage; 25 } 26 . 27 . 28} 29 30public class CharacterData : ScriptableObject { 31 public string name; 32 public int max_hp; 33 public int max_mp; 34 public int atk; 35 public int def; 36 . 37 . 38 . 39 40 public Dictionary<string,T> getFieldDict() { 41 // {{"name", "hogeman"}, {"max_hp", 10}, ....} 42 // のように{{field_name, value}, ...}を返す 43 return field_dict; 44 } 45}
このCharacterDataからCharacterにどのようにデータを渡すのが,
Unityの設計思想に合いつつ,スマートになるのか悩んでいます.
現在考えているのは以下です.
まずCharacterDataを読み込みます.
C#
1var path = "CharacterDataのAssetへのpath"; 2var data = Resources.Load(path) as CharacterData;
- Character classにDictonaryで値を渡す.
C#
1 public Character(Dictonary<string,T> status) { 2 // 辞書で受け取るコンストラクタ 3 // リフレクションを使って dictionary から field に 値を入れる処理 4 }
このようなコンストラクタを持った Character class を以下のようにインスタンス化
C#
1var character = new Character(data.getFieldDict());
- Character classにCharacterDataをそのまま渡す.
C#
1 public Character(CharacterData status) { 2 // CharacterDataをそのまま保持するのか, 3 // リフレクションを使って CharacterData field から Character fieldへ値を入れるのか 4 }
このようなコンストラクタを持った Character class を以下のようにインスタンス化
C#
1var character = new Character(data);
現在考えているのはこの2通りです.
スマートさでいうと2番だと思うのですが,
マスタデータをそのまま実態クラスが保持することは,
Unityの設計思想に合ってなさそうな気がしています.
これ以外のスマートで設計思想に合った方法や,
この方法はもっとこうできるでというアイデア,
皆様がいつもやっている,マスタデータから実態へのデータの受け渡しの方法など
ご教授ください.
また,次の前提でやっています.
- CharacterDataのfieldは増減する
(その度にCharacterのfieldは書き換える)
- CharacterDataのfieldはゲーム中には変動しない(させない)が,Characterのfieldは変動する
(バイキルトをかけるとatkが二倍になったりする)
- CharacterDataはEditor上でcsvから読み込んでAssetとして保存済み
- コメントアウトで実装が省かれている部分は動くようにできる
よろしくお願いします.
バージョン
- Unity 2020.3.13f1
- .NET 4.0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/08/06 08:21
2021/08/06 08:43
2021/08/06 09:09 編集
退会済みユーザー
2021/08/07 07:01
2021/08/07 16:43 編集
2021/08/07 16:39 編集