こうしたら良いんじゃないかという、短い回答でもいただけると嬉しいです。
実現したいこと
現在Unityでローグライクゲームを作っています。
まず、ゲーム本編の戦闘などが行われるメインシーンと、そのメインシーン外で、プレイヤーの強化アイテムなどを買えるショップシーンがあります。
基本的な処理の流れとして、
①ゲーム起動時に初期ステータスを読み込む
②所有する強化アイテムによって強化されたステータス(以下、ショップステータス)を記録・表示する
③メインシーンでレベルアップなどにより強化されたステータスを記録・適応する
④メインシーンが終了したらショップステータス戻す。
ということをやりたいと思っています。
現状、
①については、入れ子構造のScriptable Object(GameStatus)によって初期ステータスを設定しています。
今のところ、ショップおよびレベルアップでの強化は実装しておらず、仮の実装として、上で挙げたスクリプタブルオブジェクトをアタッチして、メインシーンの処理だけを実装しています。
また、Scriptable Objectはマスターデータとして変化させたくないです。
発生している問題・分からないこと
そこで、始めは
スクリプタブルオブジェクトに含まれるデータを全てクラスにコピーして、そのコピーされたデータを書き換え、そのコピーされたデータを変更するようにしようと思いました。
しかし、それではScriptable Objectを使う必要はないし、何よりデータ管理がものすごく面倒になってしまいそうでした。試したら実際にそうでした。
何か他にいい方法はないものでしょうか。
ちなみに、今は、スクリプタブルオブジェクトをコピーして...というくだりを作成する前の状態に戻してあります。
該当のソースコード
参考として、GameStatus.csとそこに格納されるもののひとつであるBulletData.csを貼り付けました。
GameStatus.cs
csharp
1using System; 2using System.Collections.Generic; 3using UnityEngine; 4 5[CreateAssetMenu] 6public class GameStatus : ScriptableObject 7{ 8 [Header("!! Input Default Status !!")] 9 [Space] 10 11 public List<PlayerData> playerDatas = null; 12 13 public List<EnemyData> enemyDatas = null; 14 15 [Space] 16 public int bulletIndex; 17 public List<BulletData> bulletDatas = null; 18 19 public int NWayCount; 20 [NonSerialized] public int NwayCount; 21 22 public float SpreadAngle; 23 [Space] 24 25 public List<DefenceData> defenceDatas = null; 26 27 public List<ReinforceData> reinforceDatas = null; 28} 29
BulletData.cs
csharp
1using System.Collections; 2using System.Collections.Generic; 3using UnityEditor.Purchasing; 4using UnityEngine; 5 6[CreateAssetMenu] 7public class BulletData : ScriptableObject 8{ 9 public GameObject bulletObject; 10 11 [Header("Common")] 12 public BulletType bulletType; 13 14 public BulletSide bulletSide; 15 16 public float bulletScale; 17 18 public float bulletSpeed = 5; 19 20 public float bulletATK = 1; 21 22 public float fireRate = 5; 23 24 public bool isHoming = false; 25 public float homingPower = 10f; 26 public float homingDuration = 5f; 27 28 public int bulletPenetratCount = 0; 29 30 [Space] 31 [Header("Explosive")] 32 public float explodeATK; 33 public float explodeRange; 34 [Tooltip("この距離まで近づくと爆発")] 35 public float explodeDistance; 36 public float explodeSpeed; 37 38 [Space] 39 [Header("Laser")] 40 public float damageRate; 41} 42 43public enum BulletType 44{ 45 Normal, 46 Explosive, 47 Laser 48} 49 50public enum BulletSide 51{ 52 Friendly, 53 Hostile 54} 55
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
「Unity データ管理 ローグライク」、「unity アイテム強化 -学習」などとググってみましたが、ショップでの強化とメインのゲームでの強化を行っている例はほとんど見つかりませんでした。
chatGPT(o1, o3-mini-high, GPT4)に諸々聞いたのですが、
有効なアドバイスは得られませんでした。
補足
Unity 2022.3.15f1
