三角端。

Δ-sphere管理人三角区也による絵日記/ゲーム開発日記。コメントは右側のweb拍手からどぞー。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

急に

やっぱりRPGを作りたいよね
RPG作りたいなーとか思いつつ Unityで色々探ってます。
ツクールでいうところのデータベースっぽいものを作ることはできました。

パーティキャラクターのデータ管理です。
戦闘シーンとかを最初に作ってみよう→
HUD必要だよね→
HUDに表示するデータをどうしよう
じゃあとりあえずパーティメンバーのデータ構造から作りますか。

要求仕様として「ゲームを開始してから各メンバーの各値は保持される」というのがあります。
パーティから外れてもそのデータは生かしておかないといけません。
なのでゲーム中どこかに保存しておく必要がありますが、
Unityのゲームオブジェクトにそのデータを持たせると、シーンを作るたびにゲームオブジェクトを設置しないといけない上に、
他スクリプトからのアクセスが面倒です。

そこでスクリプトからのみアクセスできる管理用シングルトンを作りました。
ついでにシングルトンをクラス化しておきました。
public class Singleton<T> where T:Singleton<T>,new(){
	static T sInstance;

	public static T Instance{
		get {
			if(sInstance == null) {
				sInstance = new T();
			}
			return sInstance;
		}
	}
}
public class PlayerStatics :Singleton<PlayerStatics>{
    List<HeroInstance> Heros;
};
これでスクリプトのどこからでもPlayerStatics.Instanceでアクセスで切るようになりました。
あ、HeroInstanceってのはHeroDataを参照するオブジェクトです。
HeroDataはレベル曲線とかの不変データでHeroInstanceは現在の経験値とかの可変データを持っています。

そんで、肝心のパーティメンバーのデータ構造です。
ぐぐってみるとScriptableObjectが便利だということで使ってみることにします。
public class HeroData : ScriptableObject {
	[Range(0,999)]
	public int Attack = 100;

    [MenuItem("Assets/Create/CreateHeroData")]
    public static void CreateAsset()
    {
        HeroData item = ScriptableObject.CreateInstance < HeroData > ();

        //アセットを保存するパス
        string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Data/Resources/Heros/" + typeof(HeroData) + ".asset");

        AssetDatabase.CreateAsset(item, path);
        AssetDatabase.SaveAssets();
		AssetDatabase.Refresh();

        EditorUtility.FocusProjectWindow();
        Selection.activeObject = item;
    }
}
おお、確かにインスペクタで簡単にメンバーデータを編集できるようになりました。
HeroDataを追加していけばどんどん主人公データを増やしていけます

・・・が、要求仕様の「ゲームを開始してから各メンバーの各値は保持される」をクリアしないといけないので作ったHeroDataはPlayerStatics のHerosに追加しないといけません

ScriptableObjectはインスペクタで中身を編集できて便利だけど、 スクリプトからのアクセスには、Resourcesに入れて文字列でないとアクセスできないようでした。
新しいHeroDataを作成するたびにそれをResources.LoadしてHerosにAddするのも面倒です。

なんかいい方法ないかな、と色々みてたらResources.LoadAllなんて便利なものがあるじゃないですか。
PlayerStaticsを初期化する場所に次のコードを書いたらうまくできました。
    HeroData[] heros = Resources.LoadAll<HeroData>();
	foreach(HeroData hero in heros) {
		Heros.Add(new HeroInstance(hero));
	}
これでHeroDataを追加したら全自動で管理クラスPlayerStaticsに追加されるようになりました。
便利便利。
スポンサーサイト

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。