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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/571955d2-8423-ed4c-1792-6b89c3c06275.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
```diff_c_sharp: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

```diff_c_sharp: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

```diff_c_sharp:YearManager.cs
public class YearManager : SingletonMonobehaviour<YearManager>
{
    public int CurrentYear
    {
        get => currentYear;
        set => currentYear = value;
    }

    [SerializeField] private int currentYear;
    
}
```


### GeneralData

```diff_c_sharp: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
```diff_c_sharp: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/7d6a27a8-a6f5-7c4b-ddc2-ea0ae1733f49.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4677604a-299a-12a8-00f2-863de3632228.png)

## オブジェクトにアタッチ

### GeneralDataの引数にsoを設定 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/12e64add-dbf7-37af-e333-b7950f06c2fe.png)


### YearManagerオブジェクトを作成
例として1800年に設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/7ab05445-9295-240c-c3c3-7f577b36f336.png)


# 参考

# ランペルールデータ

http://hima.que.ne.jp/nobu/bushou/lempereur.cgi?up1=0&keys2%2C3=&sort=&print=25


# Scriptable Object

https://qiita.com/RYA234/items/f9bf6320af23996be9d1

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



https://github.com/RYA234/unity-hdrp/commit/d76eb4545eeff1482184889d2de91b34e06e0338