ScriptableObjectを使用したデータ管理

ScriptableObjecetを継承したデータクラスを実装

CharacterDataSet.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterDataSet : ScriptableObject
{
    public List<Param> DataList = new List<Param>();
}

[System.Serializable]
public class Param
{
    public string Name;
    public Sprite Image;
    public GameObject Model;
}

保存用フォルダ作成

Resources/ScriptableObjecet

ScriptableObjectをアセットとして保存するためのクラスを実装

CharacterDataGenerator.cs

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class CharacterDataGenerator
{
    [MenuItem("Assets/Create/CharacterData")]
    static void CreateCheracterData()
    {
        CharacterDataSet data = ScriptableObject.CreateInstance<CharacterDataSet>();
        string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Resources/ScriptableObject/CharacterDataSet.asset");
        AssetDatabase.CreateAsset(data, path);
        AssetDatabase.Refresh();
    }
}

UnityEditorスクリプトなのでEditorフォルダ以下に移動させる必要があります。

読み込み方法

CharacterManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CheracterManager : MonoBehaviour
{
    private CharacterDataSet _characterDataSet;

    private void Start()
    {
        _characterDataSet = Resources.Load<CharacterDataSet>("ScriptableObject/CharacterDataSet");
        Debug.Log(_characterDataSet.DataList.Count);
    }
}

Perspective Divide

ワールド座標から正規化デバイス座標への変換 (NDC)

NDC (Normalized Device Coordinates)

クリップ座標をwで割ると正規化デバイス座標になります。
視錐台の内容をクリップ空間の中に収め、スクリーン描画で使用します。

3Dから2Dへの座標変換の流れ

ローカル空間
ワールド座標変換
ワールド空間
ビュー座標変換
カメラ(ビュー)空間
プロジェクション変換
クリップ空間
NDC
正規化デバイス空間
スクリーン座標変換
スクリーン空間

注意

正規化によるクリップ空間(Z値を収める範囲)はプラットフォームによって異なります。

-1 <= x <= 1
-1 <= y <= 1
-1 <= z <= 1 (OpenGL)
0 <= z <= 1 (DirectX)

Unityは、ワールド空間では左手座標系、ビュー空間以降の変換ではOpenGLに準拠しています。

参考

座標変換
正規化デバイス座標
Essentials of Interactive Computer Graphics: Concepts and Implementation K. Sung, P. Shirley, S. Baer Chapter 14 Chapter 14: The Camera.