LoginSignup
0
0

Unity New UI Widgets 2/3 ScriptableObjectからデータを取得しGUIのテーブルに表示する

Last updated at Posted at 2023-08-05

概要

今回は、ScriptableObjectを作成して、前回作成したテーブルUIに反映するように実装します。
以下画像は実装後の結果です。

image.png

開発環境

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を作成

プロジェクト上でsoを追加します。
image.png

データ入力時の様子
GeneralDetailsを記録。

image.png

オブジェクトにアタッチ

GeneralDataの引数にsoを設定

image.png

YearManagerオブジェクトを作成

例として1800年に設定しています。
image.png

参考

ランペルールデータ

Scriptable Object

Github コミット分(privateなので見れません)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0