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

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

詳細はこちら
RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

C#

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

Unity

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

Q&A

解決済

3回答

1967閲覧

UnityProject内でのデータ管理

MOTOMUR

総合スコア195

RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

C#

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

Unity

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

0グッド

0クリップ

投稿2019/10/20 07:44

はじめまして。

自己紹介

UnityでRPGゲームを作成してみたい!と思い立ち、UnityもC#もかなり薄い知識でプログラミングを始めたところ。
という者でございます。

質問するに至った経緯

くだけて説明します。
①JavascriptでSNSサイトの基礎部分のようなものを作成したことがあるからデータ管理もできるし、ある程度土台があるし、余裕だろと思い始める。
②ネットに転がっているチュートリアルのようなものを
あちらこちらと触って、しょぼいながらもゲームスタートから戦闘までの流れを作った。
➂これから
「よし!RPG作りの醍醐味(ゲームバランス調整しながらにやける)を味わえるぞ」とにやにやしながら、スクリプトをいじいじしていたところで
落とし穴に気が付きました。

「あれ?scriptをGameObjectに貼ったらいろいろできるけど、ステータスとかキャラデータとかUnityProject上でどう共有するんだ?」

正直Unityの知識はひよこちゃんなのでそもそも質問の言葉の選択を間違えているかもしてませんが、
とりあえず自分の言葉でいうと、

「Unityプロジェクトでステータスとかを格納するScriptを作りたい!」
「格納しているScriptからデータを引っ張り出したい!」
「将来的には格納しているScriptのデータをFirebaseとかで管理したい!」

という欲望を達成したい!
(でもやり方がわからない(どっちかっていうと調べ方も不明!))

という現状が経緯でございます!

混乱の原因

「Javascriptはそもそも母体のファイルからいろいろなファイルを呼び出して、データはstateで管理して。」みたいな言語でしたので(自分にとっては)、データ管理で迷うことはなかったのです。
しかし、Unityの「こいつはこう動かしたいんだよ~」ってポコポコ貼ってく感覚でプログラミング作業してると、「あれ?全体のデータの管理はどうなった??」ってとたんに気づく感覚が自分には理解不能でした(;'∀')

結論

以上説明の通りの意味で、データ管理がわかりません。
もしかするとかなり頭の悪い質問かもしれませんが、お付き合いいただけると幸いでございます。
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

  • レベル経験値テーブル
  • 敵キャラクタステータステーブル
  • 自キャラクタステータステーブル
  • シナリオテーブル
  • メッセージテーブル

のようなデータの管理方式という事であれば、JSONデータやバイナリデータなどをResourcesフォルダに配置して、FileIOでアクセスするような方式とかいろいろありますが、恐らくScriptableObjectが要望にかなうものではないかと。

投稿2019/10/20 09:16

vo3

総合スコア321

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

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

MOTOMUR

2019/10/20 11:44

回答ありがとうございます! まさに、欲しいものに近いです( ;∀;) 最高です! しかし、多量のデータを扱うには不向きなのですね。 もしも、ScriptableObjectを採用する場合、 少し疑問が生まれました。 【質問一つ目】 これはかなり初歩的な質問かと思いますが、貼っていただいたリンク先のこちらのコードで using System.Collections.Generic; using UnityEngine; public class EnemyStatusData : ScriptableObject { public List<EnemyStatus> EnemyStatusList = new List<EnemyStatus>(); } [System.Serializable] public class EnemyStatus{ public string Name = "なまえ"; public int HP = 100, SP = 50, Atk = 5, Def = 15, Spd = 99, Exp = 58; public bool IsBoss = false; } とありますが、 これは、 ①ScriptableObjectを継承した保存能力のあるEnemyStatasDataを作成して、 ②下で作ったEnemyStatusのクラスを継承したEnemyStatusListを作成した。 という理解なのですが、あってますでしょうか? ここで、敵の情報を多数用意する場合は、管理が難しくなってくると思うのですが、 [MenuItem("Create/EnemyStatusData/EnemyStatusList")] このコードで敵ステータスリストのメニューは作成して参照できるのでしょうか( ;∀;) それとも作ったオブジェクトはEnemyStatasDataだから中身のListはメニューじゃ見れないのでしょうか((+_+)) (正直な話、敵のステータスは固定なのでどうでもいいですが、味方キャラのステータスが追加される時を考えるとネスト一つ深いところまで見えると助かるなぁと思っての質問でした。) 【質問2つ目】 ScriptableObjectは一時的(ゲーム終了まで保持)とありますが、 これを永続に保存したい場合は別途記録させるJSONファイルを用意して書き込むのがいいんですかね? ScriptableObject的にもっとスマートな解決方法あるのでしょうか? (;^_^A 【質問3つめ】 ScriptableObjectをロードしていくとメモリを使って重たくなってしまうとのことですが、 ロードしたScriptableObjectを解除する方法もあるのですかね。 (ググれば出るのであれば「ググれ!」で結構です( ;∀;)) 長々と質問失礼いたしました。 回答いただけると泣いて喜びます(*´Д`)
MOTOMUR

2019/10/20 11:59 編集

【追記】 一つ質問を失念しておりました!! ScriptableObjectは保管場所を作る(終了まで生きてるメモリ的な)スクリプトっていう認識でよろしいでしょうか(><)?? それと、これはかなり初歩的な質問かもしれませんが、 public class EnemyStatusData : ScriptableObject { public List<EnemyStatus> EnemyStatusList = new List<EnemyStatus>(); } この辺のコードはどこのScriptで起動すればいいんですかね? 起動時に行く画面にくっつけてあるScriptの void Start(){ ここに書き込めばうまくいきますかね( ;∀;) }
vo3

2019/10/20 12:22

質問1 > ①ScriptableObjectを継承した保存能力のあるEnemyStatasDataを作成して、 > ②下で作ったEnemyStatusのクラスを継承したEnemyStatusListを作成した。 合っています。 [MenuItem("Create/EnemyStatusData/EnemyStatusList")] これはメニューを拡張して Create() を呼ばせる事ができるように宣言しているものです。 このページでは Create() 内でデータを設定していますが、必ずしも必要はないです。 むしろ重要なのは【ファイル書き出し】で、このスクリプトのデータが扱えるファイル(EnemyStatusData.asset)を作って保存することです。 保存したScriptableObjectのファイル(EnemyStatusData.asset)はInspectorで操作できます。 つまり、ソース上で変更ではなく、Editor上で変更ができます。 変更したらもちろん保存もできます。ただし、「Play中でなければ」です。 なお、ここではEnemyStatusData.assetのファイル一つになっていますが、このファイルをそのまま複製して別データを保存することもできます。 質問2 > ScriptableObjectは一時的(ゲーム終了まで保持) 違います。 保存したファイルそのものが永続データになります。 ScriptableObjectはそのファイルのデータフォーマットを定義しているものです。 一時的と書かれているのは「Play」を実行中の編集です。 質問3 > ScriptableObjectをロードしていくとメモリを使って重たくなってしまう この方が述べられているのは、一つのファイルにすべてをため込んでいると、例えば「このマップではこのデータしか使わない」のがわかっているのに、「全マップのデータをロードしないといけない」という状況を指しているのだと思います。 とりあえずメモリの解放に関してはこちらを参照してみるとよいかと。 http://tsubakit1.hateblo.jp/entry/2016/10/02/232723 質問4 > ScriptableObjectは保管場所を作る(終了まで生きてるメモリ的な)スクリプトっていう認識でよろしいでしょうか ファイルフォーマット定義+データファイルそのものです。 単なるJSONやバイナリとの違いは、Unityが提供するScriptファイルなので、[SerializeField]などでPrefabやシーンに参照で持たせることもできます。 もしくは、シングルトンで管理させるといったこともできます。 GameObjectのシングルトン化を以下のようにすると、Inspectorから操作もできます。 https://qiita.com/Teach/items/c146c7939db7acbd7eee もちろん、GameObjectではなく単純なデータホルダーとしてClassのシングルトンもできます。 なお、シングルトンは便利だからと言ってやみくもに採用するときっと訳が分からなくなるので、用法容量は正しくお使いください。 こんな感じでいかがでしょうか?
vo3

2019/10/20 12:25

public class EnemyStatusData : ScriptableObject { public List<EnemyStatus> EnemyStatusList = new List<EnemyStatus>(); } C#の文法になります。 これ自体はこのEnemyStatusDataをインスタンス化した時点で実行されます。 なお、publicなプロパティは暗黙のSerializeFieldで、ListはSerializableなので、Inspectorでデータを追加して保存した後も、そのまま保持されます。
vo3

2019/10/21 14:54

あ...firebaseのことは完全に見逃してました。 この方法はオフラインデータ想定です。 もちろん、ScriptableObjectと組み合わせてできないわけではないですが、sakura_hanaさんのおっしゃる通り仕組みをまず理解されるのがよいと思います。
MOTOMUR

2019/10/22 05:10

丁寧な回答感謝です! public class EnemyStatusData : ScriptableObject { public List<EnemyStatus> EnemyStatusList = new List<EnemyStatus>(); } この質問の意図ですが、表現力不足で質問内容を誤解させてしまいました(*´Д`) 私の理解では、 ScriptableObjectを継承したクラスを宣言したい場合、 どこかのScriptコード上に上記のコードを書き、 最初のシーン(例えばゲーム開始画面)等で、先ほど宣言したScriptをGameObjectに紐づけて実行する。 という流れを経て上述でいうところのEnemyStatasDataがUnityProject内に作成されるという認識でした。 クラスを宣言したことによってEnemyStatasDataファイルが作成される?というような感覚でした。 それを踏まえたうえで、どこで「ScriptableObjectを継承したクラスを宣言する」コードをUnityに読ませればいいのか?という疑問になった次第です。 どのタイミングでEnemyStatasDataは存在しているのでしょうか? EnemyStatusData.assetを作成してから? ScriptableObjectを継承したクラスを宣言してから? 申し訳ございませんが回答お願いします。
MOTOMUR

2019/10/22 05:11

firebaseの件は了解です!もう少し勉強してみます。
vo3

2019/10/22 11:23

> どのタイミングでEnemyStatasDataは存在しているのでしょうか? > EnemyStatusData.assetを作成してから? EnemyStatusData.asset はEnemyStatasDataのシリアライズデータですので、Prefabと同じようなものです。 完全な無から作成の場合は、最初のURLの先にある EnemyStatusData enemyStatusData = ScriptableObject.CreateInstance<EnemyStatusData>(); の CreateInstance 実行から存在します。 ただ、これは無からなので、内部の EnemyStatusList は空リストだけになります。 本当に新規の時ぐらいで使ってください。 作った EnemyStatusData.asset をゲーム上で利用するには、Assets/Resourcesフォルダにそのファイルを配置してください。 通常のゲーム上でアクセスできるのはここだけになります。(厳密には違いますが) Unityは一部フォルダ名に特殊な規約があります。そのうちの一つがResourcesという名前のフォルダです。 http://tsubakit1.hateblo.jp/entry/20131028/1382965930 例えば Assets/Resources/EnemyStatusData.asset で作成した場合、 var data = Resources.Load<EnemyStatusData>("Assets/Resources/EnemyStatusData"); でメモリにロードされます。 または、先述した通りスクリプトのプロパティで参照設定もできますので、例えば class DataHolder : MonoBehaviour { public EnemyStatusData Data; } のようなスクリプトを作り、シーンのどこかのGameObjectに割り付け、参照を設定してやればシーンロード時に利用可能になります。 この場合はResources以下である必要はないです。 上記のホルダーもちょっと変えて class DataHolder : MonoBehaviour { public EnemyStatusData Data; public void Load() { Data = Resources.Load<EnemyStatusData>("Assets/Resources/EnemyStatusData"); } } のように読み込ませるなどにするのを自分はやります。 # 上記はあくまで簡易に作っただけですので、実際はもっと違います とりあえず、リソース系のロードに関してはこちらとか。 https://qiita.com/k7a/items/df6dd8ea66cbc5a1e21d
MOTOMUR

2020/06/07 13:31

月日を開けてBA失礼いたします。Unityからは距離を置いていましたが、最近復活しました。ScriptableObjectをゲーム作成に取り掛かる前に知ることができて助かりました。ありがとうございます。
guest

0

ScriptableObjectと外部データサーバー(Firebase等)は使用方法が結構違います。

ローカルで完璧に動くようにしてからサーバーサイドへ、だと二度手間になる可能性があるので
「ScriptableObjectの概要を知る→外部データサーバー連携の概要を知る→実際の仕様や開発手順をどうするか考える」
という流れがいいかなと思います。
(「開発中の手間」と「リリース後に修正・バージョンアップする時はどうするか」が焦点となるかと思います)

ちなみにScriptableObjectの発展系で「Excelで管理」「Googleスプレッドシートで管理」(各シートのデータを自動でScriptableObject化)、
Firebase等外部データベースを使う前のモックとして「SQliteで管理」という方法もあるので、
学習が進んだら見てみるといいと思います。

投稿2019/10/21 02:15

sakura_hana

総合スコア11427

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

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

MOTOMUR

2019/10/22 05:12

回答ありがとうございます。そのあたりの記事を読み漁って勉強してみようと思います!
guest

0

小規模でしたらPlayerPrefsが使えますよ!

https://docs.unity3d.com/ja/current/ScriptReference/PlayerPrefs.html

投稿2019/10/20 08:23

madone99

総合スコア1857

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

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

MOTOMUR

2019/10/20 11:04

回答ありがとうございます。 PlayerPrefsの存在は認識しておりました。 もしかすると大規模になるかもしれないので、使用するかは検討中です。 こちらを使用する場合ですが、 自分が作成したScriptからPlayerPrefsのKeyに格納しているデータを取ってきたり、Keyに格納したりできるという認識でよろしいでしょうか! その場合はHoge[Key]に値を代入してHogeちゃんが値を保持してるっていう感じですかね??? そのHogeちゃんはどこにいるんですかね( ;∀;) UserPrefsのファイルの中・・・・?
madone99

2019/10/20 11:17

はい、仰る通りですね。 データはplatformによってxmlやplistなんかで保持されています。
MOTOMUR

2019/10/20 11:45

なるほど、では追加していくと、Hogeファイルがどんどん肥大化していってしまうのですね( ;∀;) ご回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問