質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2775閲覧

Unity×FlatBuffersでモンスターデータを保存したい

KirisimaCreate

総合スコア44

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/03/26 18:43

編集2017/03/27 02:32

###前提・実現したいこと
Unityでガチャガチャのようなものを制作しているのですが、ガチャから出てきたモンスターのデータをローカルに保存してゲーム内で利用できればと思いflatbuffesを使用してみましたがうまく動かず苦戦しています。
モンスター一体だけなら保存して読み込みも行えたのですが、ガチャから出てきたモンスターのデータを追加する処理がよくわかりません。

###ソースコード
チュートリアルなどを参考にして下記のようなコードを書いてみたのですがうまくいきません。

//スキーマ定義 table Monster { name:string; detail:string; //・・・ } table MonsterList { Entity:[Monster]; } root_type MonsterList

C#

1 private void SaveMonster() 2 { 3 FlatBufferBuilder fbb = new FlatBufferBuilder(1024); 4 5 ByteBuffer bb = fbb.DataBuffer; 6 MonsterList monsterList = MonsterList.GetRootAsMonsterList(bb); 7 8 StringOffset monsterName = fbb.CreateString("ランダムで取得したモンスター名"); 9 StringOffset monsterDetail = fbb.CreateString("詳細情報"); 10 var monsters = new Offset<Monster>[monsterList.EntityLength + 1]; 11 monsters[monsterList.EntityLength] = MonsterList.CreateMonster(fbb, monsterName, monsterDatail); 12 var monstersData = Monster.CreateMonster(fbb, monsters); 13 14 MonsterList.StartDataList(fbb); 15 MonsterList.AddEntity(fbb, monstersData); 16 17 var offset = MonsterList.EndMonsterList(fbb); 18 MonsterList.FinishMonsterListBuffer(fbb, offset); 19 20 string path = Path.Combine(Application.persistentDataPath, "MonsterData.bytes"); 21 using (MemoryStream ms = new MemoryStream 22 (fbb.DataBuffer.Data, fbb.DataBuffer.Position, fbb.Offset)) { 23 File.WriteAllBytes(filePath, ms.ToArray()); 24 Debug.Log("SAVED !"); 25 } 26 }

C#

1 private void LoadMonster() 2 { 3 string path = Path.Combine(Application.persistentDataPath, "MonsterData.bytes"); 4 ByteBuffer buffer = new ByteBuffer(File.ReadAllBytes(path)); 5 MonsterList monsterList = GetRootAsMonsterList(buffer); 6 7 for(int i = 0; i < monsterList.EntityLength; i++) 8 { 9 Debug.Log(monsterList.Entity(i).value.name); 10 } 11 }

何度実行しても上書き(?)されてしまって一体分のデータしか取れません。
どうすればデータを上書きせずに追加できるのでしょうか?
ご教示ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

※UnityもFlatBuffersも使ったことが無いので当て推量にはなりますが。
できることは以下の3つかな…

#1.File.WriteAllBytesでは追記できない
MSDN見てください。
新しいファイルを作成しとなっています。
この関数を使って同じパスに保存すると既存のデータは毎回消えてしまいます。

注意点としては、別の関数を使用して追記可能にしたからといってFlatBuffersがそれに対応してくれるかどうかは分からないことです。
このあたりはまた別途調査が必要です。

StartDataList関数とFinishMonsterListBuffer(ちょっと関数名不一致過ぎません?)関数があることからたぶん単純に追記はできないとは思いますが。
工夫すれば少ないファイル操作でモンスターを追加できるようになります。
※余談ですが、リストの末端を表す終わりはEndです。Finishは動作に対して使います。リスト保存操作の仕上げという意味ならFinishで良いですが、単にリストの終了をマークする何かを表しているならEndの方が良い気はします。

#2.過去に作成したデータをロードし、新しい個体を追加して保存しなおす
一番簡単な解決方法だと思います。
データを別でロードして持って置けるなら更に良いです。

a.過去に作ったファイルをロードしてMonsterList配列を持っておく
b.MonsterList配列に新しいEntityを追加する
c.全データを保存しなおす

ただモンスターが成長したりするなら、これで個体データを毎回書き換えるのはしんどそうですけどね。

#3.モンスター毎に違うファイルにする
モンスターを個別に更新できる利点を保ちつつ、簡単な方法となるとコレになります。
2は全データを同じファイルに保存していますが、この方法の場合は複数のファイルに分けます。

a.単体のモンスターファイル毎にファイルパスを分ける
ファイル名に番号でもつけて一括で管理しましょう。
対象のファイル名から始まるデータが全てのモンスターデータになります。
これらを全部走査すればモンスターの一覧を得ることもできます。

b.リストでモンスターを管理するモンスターインデックスファイルを作る
こちらの作成は任意ですが、あるファイルに何のデータが含まれているのか保存するファイルを作りましょう。
これによって1つのファイルを見れば、他のファイルを全部開かなくてもよくなります。

1,2,3すべての要件が満たせる形になると一番良いと思いますね。

投稿2017/03/27 01:56

編集2017/03/27 02:06
haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KirisimaCreate

2017/03/27 02:34

回答ありがとうございます。 StartDataListやFinishMonsterListBufferは自動生成される関数ですのでなんとも・・・。 色んな解決法を提示していただいてありがとうございます
haru666

2017/03/27 02:55

なるほど、であれば関数名は意味としては良さそうですね。 総仕上げとしてのFinishという意味のようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問