概要
今回は、ScriptableObjectを作成して、前回作成したテーブルUIに反映するように実装します。
以下画像は実装後の結果です。
開発環境
OS:Windows10
Unity:2020.3.42f(LTS)
IDE:Rider
NewUIWidget:1.15.10f1
手順
スクリプトを作成
クラス概要
新規作成するクラス | 説明 |
---|---|
SO_GeneralList | Scriptable Object |
GeneralDetail | 各将軍の情報を定義するクラス |
GeneralData | SO_GeneralListからデータを読み込むクラス |
YearManager | 現在の年(西暦)。GeneralDetailのBirthYearと差を取って将軍の年齢を計算します。シングルトン |
SingletonMonobehaviour | シングルトンのクラス |
SO_GeneralList
so_SO_GeneralList.cs
using System.Collections;
using System.Collections.Generic;
using Develop._01GeneralListGUI;
using UnityEngine;
[CreateAssetMenu(fileName="so_GeneralList", menuName = "Scriptable Objects/General/General List")]
public class SO_GeneralList : ScriptableObject
{
[SerializeField]
public List<GeneralDetail> generalDetails;
}
GeneralDetails
GeneralDetails.cs
using UnityEngine;
namespace Develop._01GeneralListGUI
{
[System.Serializable]
public class GeneralDetail
{
public int generalCode;
public string name;
public int birthYear;
public int deathYear;
// 各能力値 4(最高評価)~1(最低評価)の5段階評価
// A=4 B=3 C=2 D=1 とする
public int politics; // 政治力
public int economy; // 経済力
public int supply; // 補給力
public int building; // 建築力
public int command; // 指揮力
public int infantry; // 歩兵
public int cavalry; // 騎兵
public int canonartillery; // 砲兵
}
}
YearManager
YearManager.cs
public class YearManager : SingletonMonobehaviour<YearManager>
{
public int CurrentYear
{
get => currentYear;
set => currentYear = value;
}
[SerializeField] private int currentYear;
}
GeneralData
GeneralData.cs
using UIWidgets.Custom.GeneralUINS;
using UIWidgets.Examples;
using UnityEngine;
using UnityEngine.Serialization;
namespace Develop._01GeneralListGUI
{
public class GeneralData : MonoBehaviour
{
[SerializeField]
[FormerlySerializedAs("steamSpyView")]
protected ListViewGeneralUI _listViewGeneralUI;
[SerializeField]
SO_GeneralList _soGeneralList;
void Start()
{
- GeneralUI sampleGeneralUI = new GeneralUI("ナポレオン",27,"B","C","B","A","A","A","C","A");
- _listViewGeneralUI.DataSource.Add(sampleGeneralUI);
+ foreach (var generalDetail in _soGeneralList.generalDetails)
+ {
+ GeneralUI newItem = new GeneralUI(generalDetail.name, Age(generalDetail.birthYear),
+ ToAbility(generalDetail.politics), ToAbility(generalDetail.economy),
+ ToAbility(generalDetail.supply), ToAbility(generalDetail.building),
+ ToAbility(generalDetail.command), ToAbility(generalDetail.infantry),
+ ToAbility(generalDetail.cavalry), ToAbility(generalDetail.canonartillery));
+ _listViewGeneralUI.DataSource.Add(newItem);
+ }
}
+ int Age(int birthYear)
+ {
+ return YearManager.Instance.CurrentYear - birthYear + 1;
+ }
+ private string ToAbility(int ability)
+ {
+ if (ability == 1)
+ {
+ return "D";
+ }
+ else if (ability == 2)
+ {
+ return "C";
+ }
+ else if (ability == 3)
+ {
+ return "B";
+ }
+ else if (ability == 4)
+ {
+ return "A";
+ }
+
+ return "error";
+ }
+ }
}
SingletonMonobehaviour
SingletonMonobehaviour.cs
using UnityEngine;
namespace Develop._01GeneralListGUI
{
public abstract class SingletonMonobehaviour<T> : MonoBehaviour where T:MonoBehaviour
{
private static T instance;
public static T Instance
{
get
{
return instance;
}
}
protected virtual void Awake()
{
if (instance == null)
{
instance = this as T;
}
else
{
Destroy(gameObject);
}
}
}
}
SO_Objectを作成
データ入力時の様子
GeneralDetailsを記録。
オブジェクトにアタッチ
GeneralDataの引数にsoを設定
YearManagerオブジェクトを作成
参考
ランペルールデータ
Scriptable Object
Github コミット分(privateなので見れません)