Unityで使うデータをエクセルで管理しようとしてうまくいってない話(追記:解決済み)
こんにちは!
「仕様です。」(@shiyoumasayume)という名前でSNSをやっているゲームプランナーです。
普段は都内でコンシューマーゲームの開発をしており、ふわっとしたイメージを具体的なゲームデザインにおこす仕事なんかをやっています。
今日は、個人で開発中のゲームの実装中にどうしても行き詰まってしまったところをまとめます。
//現在進行系の助けを求める記事なので、力になってくれる方はコメントいただけると嬉しいです…。
【記事投稿後追記:】助言をいただいて問題解決できました!!
後で振りかえれるように記事は残しておき、解決方法を記事内に追記しておきます。
作っているもの
こちらの記事にある企画書のゲームを作っています!
やろうとしていること
今後の実装や量産を見据えて、フラグやテキストといったデータをExcelで管理したい。
こちらの記事を参考に開発環境の準備をしています。
できた気がすること、困っていること
Excelにテストデータを打ち込み、それをUnityに流し込むところまではできました。
ただ、流し込んだデータを別のスクリプトから参照して使用することができずに困っています…。
エクセルデータ(RadioTestText.xls)
RadioTestTextEntity.cs
エクセルデータの中でUnity側で変数として取得したい項目を書いています。
「Unity Excel Importer を作ってみた」にあったものを参考にしています。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable] // アトリビュートを付与
public class RadioTestTextEntity
{
public int id;
public string label;
public string type;
public string text;
}
(エクセルにあるatribute行は書いたはいいものの不用なので定義せず)
ExcelAssetスクリプト(RadioTestText.cs)
RadioTestTextEntity.csで取得した項目をListとしてまとめたScriptableObjectのクラスです。
こちらも「Unity Excel Importer を作ってみた」にあったものを参考にしています。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExcelAsset]
public class RadioTestText : ScriptableObject
{
public List<RadioTestTextEntity> TestTextSheet1; // Replace 'EntityType' to an actual type that is serializable.
}
ScriptableObjectの生成
画面右側のInspectorから、Excelデータの内容が流し込めていることを確認できました。
で、これを他のスクリプトから参照できればクリアなんですが…そこがうまくできていないわけです。
TestObject.cs
ScriptableObject「RadioTestText」の内容を参照してデバッグログに出力するだけのクラスです。
空のオブジェクトを配置し、そこにTestObject.csをアタッチしています。
SerializeFieldのフィールドm_radioTestTextにScriptableObjectをエディタ上からアタッチして、その内部のリストにアクセスしようとしているつもりです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestObject : MonoBehaviour
{
[SerializeField]
private RadioTestText m_radioTestText = null;
// Start is called before the first frame update
void Start()
{
Debug.Log(m_radioTestText.TestTextSheet1);
Debug.Log(m_radioTestText.TestTextSheet1[1]);
Debug.Log(m_radioTestText.TestTextSheet1[2]);
}
// Update is called once per frame
void Update()
{
}
}
TestObject(スクリプトアタッチ用に配置した空のオブジェクト)
見様見真似でなんとなくデバッグログを表示させてみましたが、なんだか思ってる答えと違う…。
たとえば、
この画像でいう、Element0の「Text」に入っている「これはシステムメッセージです。」というテキストを取得してデバッグログに表示させるにはどうすればよいのでしょう…。
そもそもListのデータの取り出し方がそもそも間違っている…?
/////////////////////////////////////
【投稿後追記:】Listのデータの取り出し方が間違っていました。
Debug.Log(m_radioTestText.TestTextSheet1[1]);
これだと不足で、
Debug.Log(m_radioTestText.TestTextSheet1[1].text);
というふうに具体的になんのデータを取りたいのかを書いてやることで目当ての情報を引っ張ってこれるようです。
助言をくれた方々、本当にありがとうございました…
/////////////////////////////////////
というわけで
すんごい初歩的な間違いを犯している可能性も大いにあるのでもう少し調べてみようと思いますが、これを見た方でなにかアドバイスしていただける方、お待ちしています…!
今回参考にさせていただいたページ
・エクセルのデータをUnityに流し込むやり方
・ScriptableObjectにアクセスする方法
・Listの内容にアクセスする方法
他にも色々な記事を書いています。
よろしければサポートお願いします!いただいたサポートをモチベーションにまた活動を続けていきます