LoginSignup
noutarins
@noutarins (nou tarins)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Assetの動的削除のやり方

Q&AClosed

解決したいこと

現在簡単なゲームを作っているのですが、装備アイテムの管理で、
(1)Assetの動的削除
(2)その他の有用なアイテム管理方法
のうちどちらかを発見しなくてはならなくなりました。

まず前提として、私はアイテムを現在ScriptableObjectで管理しています。
やり方としては、Asstesファイルの中に装備アイテムの基本データ(名前、レア度、各種初期値など)を格納したScriptableObjectを作成し、データベースとして同じくScriptableObjectであるItemDataBase内のListに格納しています。
そして、プレイヤーが実際にアイテムを獲得するときは、データベースに登録されてあるアイテムから対応するものをDeepCopyでコピーして別のScriptableObjectとして、今度は所持アイテムとして同じくScriptableObjectであるItemBox内のListに格納しています。
つまり、Asstes内には、基本データとなるScriptableObjectと、それを基にした実際に持っているアイテムのScriptableObjectが存在することになります。

ここで、所持アイテムを売却や処分によって消去したい場合、プレイヤーから見えなくする(ItemBox内のListからRemoveする)だけではなく、Unity内から、つまりAsstes内から削除したいのです。

上記のような場合どのようにすれば、Assetの動的削除を行えるのでしょうか、もしくは、何かほかのいいアイテムの管理の仕方はありますでしょうか?

このコードで新しく獲得する武器のアセットを作っています

	public WeponDate CreateWeponAsset(int objectNumber)
	{
		
		WeponDate asset = ScriptableObject.CreateInstance<WeponDate>();
		string itemName = GetWeponByNumber(objectNumber).GetItemName();
		int havingCount = GetWeponByNumber(objectNumber).GetGotCount() + 1;
		GetWeponByNumber(objectNumber).SetGotCount(havingCount);
		
		EditorUtility.SetDirty(GetWeponByNumber(objectNumber));
	
		AssetDatabase.CreateAsset(asset, "Assets/HavingWepon/"+itemName+havingCount+".asset");
		
		AssetDatabase.SaveAssets();
		

	
		return asset;
	}

このコードで上で作ったアセットに基本データからデータをコピーしています。

	public void WeponGetCount(int objectnumber)
	{
		
		WeponDate GotWepons = CreateWeponAsset(objectnumber);
		GotWepons.WeponDateDeepCopy(GetWeponByNumber(objectnumber));
		equipBox.GetWeponBox().Add(GotWepons);
		
		EditorUtility.SetDirty(equipBox);
		EditorUtility.SetDirty(GotWepons);
		AssetDatabase.SaveAssets();
		

	}

よろしくお願いします。

0

1Answer

ScriptableObject はアセットなので変更できません。従ってデータベースとして使うということが発想として誤りです。
とりあえず一歩目としては、その「データベース」を JSON にシリアライズして PlayerPrefs またはファイルに保存することを考えたらよいと思います。

1Like

Comments

  1. 「データベース」に対する理解が足りてないと思いますよ。マスターデータとは何か、とか。それに挙げているページでは削除なんてしてないですよね。それはできないからですが。

Your answer might help someone💌