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.