🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

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

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

Q&A

解決済

1回答

6658閲覧

キャラクターのデータ管理がわかりません

Raumu

総合スコア3

Unity

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

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

0グッド

1クリップ

投稿2020/12/06 15:49

プログラミング初心者です。
ゲームを作っていますが、キャラクターのデータ管理について超初歩的なことがわからずで悩んでいます。

ゲームキャラクターの基礎データをScriptebleObjectにより作成しました。
このScriptebleObjectの情報を持つ同じキャラクターが10体いたとして、そのうち数人を育てる(LVUP)させる場合
そのステータス管理をどうしたらよいかわかりません。

このScriptebleObjectの値を上書きしようと初めは考えましたが、それではこのステータスを継承しているすべてのキャラのステータスが変わってしまいますしScriptebleObjectはデータ保存性が良くないので不変の情報を入れるのがいいと記事で見たことがあります。

次に考えたのがキャラクターのクラスを作ってLISTで10体分配列を作り、ScriptebleObjectのすべてのデータをクラスに読み込んでおき、育てていくキャラクターの配列だけステータスを適時書き直す。

このような方法で可能ではないか?と現在考えておりますが、やり方もわかりません。

いろいろな方法で管理する方法があるとは存じますが、私の考えた方向性は合ってますでしょうか?
もっとこうした方がいいよ!ってやり方があればご教授お願いできませんでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

ScriptableObjectを使うのであれば、キャラクターごとに作成した方がいいかと思われます。
データを格納するためのScriptableObjectをプログラムし、複製してキャラクターごとに。
といった感じですね。
例えば、ScriptableObjectにnameという変数を記述したとします。
そのScriptableObjectを複製し、キャラクターの名前をそれぞれ入力してキャラクターに適応する、といった感じです。
そうすればキャラクターごとにデータ(ScriptableObject)を持つことになるので管理しやすいと思います。
もし、何言ってるのか分からなければScriptableObjectの使い方を詳しく調べた方が良いかと思われます。

ただ、私の場合はクラス・コンストラクタを使うと思います。
こちらを参考にしてみてください。
[Unityで学ぶC#] 9 クラス

投稿2020/12/06 16:05

PinoMatcha

総合スコア368

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

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

Raumu

2020/12/07 02:07

わかりやすい回答ありがとうございます。 わからないのが、ドラクエの様に 勇者 戦士 魔法使い等1体しか存在しないキャラがいる場合 それぞれに対しScriptableObjectを作成すればよいでしょうが、 ソシャゲーのように 戦士A 戦士Bというデータベースがあって ガチャで戦士Aを何体も持っているような状態のとき戦士Aの基礎データベースはScriptableObjectに持たせておいて、ガチャで戦士AをGETする度に戦士AのデータベースであるScriptableObjectを複製させて新規に当てはめるということでしょうか? Instantiate( Resources.Load() )等でアセットのコピーを作って当てはめるなどの考え方で合っていますでしょうか?
PinoMatcha

2020/12/07 02:27

そうですね。 同じキャラが複数存在する場合は、データベースを別で作っておくといいかもしれませんね。 キャラクターの情報を格納できるScriptableObjectを複製し、データベースから初期値をロード・上書きしScriptableObjectをキャラクターに適応すればそれなりの管理しやすさがあると思います。
Raumu

2020/12/07 08:01

非常にわかりやすいお答えありがとうございます。先が見えてきました!! ScriptableObjectは基礎データ管理としては優秀で、Save機能は無いとの記事をよく見かけますが、 いまScriptableObjectのデータをスクリプトで書き換えた際、シーンを移動しても、ゲームを再起動しても書き換えられた情報は残っていました。 一見これをSaveDataとして管理できそうに思えますが、なぜScriptableObjectがSaveに不向きなのでしょうか??
hogefugapiyo

2020/12/07 08:13

Unity Editor上では反映が上書きできます。ビルドした実機環境などだと上書きができません。
PinoMatcha

2020/12/07 10:12 編集

hogefugapiyoさんの言う通りです。 ScriptableObjectはEditor上で扱うのに向いていますが、実機に書き出すと直接使えません。
Raumu

2020/12/08 02:49

現象を確認しました! 本当にわかりやすい解説ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問