Unity内のアセット拡張
概要
Quantumアセットは、シミュレーションに関連しないUnityの型(UI用の色、テキスト、アイコンなど)を拡張できます。
一例としてCharacterSpecアセットを見てみましょう。
C#
public class CharacterSpec : AssetObject
{
public FP MaxEnergy;
public FP MaxHealth;
#if QUANTUM_UNITY
[Header("Unity")]
public Sprite Icon;
public Color Color;
public string DisplayName;
#endif
}
Unityの型のフィールドは、ビュー(Unity)からのみ取得し、シミュレーション(Quantum)からは絶対に取得しないでください。これを誤って取得しないようにするために、Unityの参照(音声・アイコンなど)を#if QUANTUM_UNITYブロックで囲むことがベストプラクティスになります。
実行時のアクセス
実行時に追加フィールドにアクセスするには、QuantumUnityDB.GetGlobalAssetメソッドのオーバーロードを使用します。
C#
CharacterSpec characterSpec = QuantumUnityDB.GetGlobalAsset(assetRef);
Debug.Log(characterSpec.DisplayName);
または、QuantumUnityDB.TryGetGlobalAssetを使用できます。
C#
if (QuantumUnityDB.TryGetGlobalAsset(assetPath, out CharacterSpec characterSpec)) {
Debug.Log(characterSpec.DisplayName);
}
どちらのアプローチでも、適切なメソッドを使用してアセットがQuantumのAssetDBにロードされます。詳細はResourcesとAddressablesをご覧ください。
エディター内のアクセス
Unityエディター内でパスを使用してアセットをロードするには、UnityEditor.AssetDatabase.LoadAssetAtPath<T>()メソッドを使用します。
C#
CharacterSpecAsset characterSpecAsset = UnityEditor.AssetDatabase.LoadAssetAtPath<CharacterSpecAsset>(path);
Debug.Log(characterSpecAsset.DisplayName);
また、QuantumUnityDB.GetGlobalAssetEditorInstance/QuantumUnityDB.TryGetGlobalAssetEditorInstanceメソッドを使用してアセットをロードすることもできます。
C#
CharacterSpec characterSpec = QuantumUnityDB.GetGlobalAssetEditorInstance<CharacterSpec>(guid);
Debug.Log(characterSpec.DisplayName);
スコープの拡張
標準のAssetObjectは、ビューで使用するフィールドにはUnityの型のみを使用できます。Unityの一部ではないクラスや型に拡張する必要がある場合は、いくつかの追加手順が必要です。
Assembly Definitionの作成
まず、Unityの一部ではない型を参照するには、AssemblyDefinitionAsset(または.asmdef)を作成する必要があります。これはAssets -> Create -> Scripting -> Assembly Definitionから作成可能で、同じフォルダー以下のスクリプトがAssemblyDefinitionAssetに含まれるようになります。AssemblyDefinitionAssetの詳細はUnityの公式ドキュメントをご覧ください。
以下はAssemblyDefinitionAssetの例です。
これでVisualsScriptableObjectとUIScriptableObjectが、MyAssemblyDefinitionアセットに含まれるようになります。
Assembly DefinitionをQuantum.simulationに追加
Assets/Photon/Quantum/Simulation内には、Quantum.Simulationという名前のAssemblyDefinitionAssetが存在します。先ほど作成したAssemblyDefinitionAssetを使用できるようにするには、Quantum.SimulationのAssembly Definition Referencesリストに追加する必要があります。以下の画像は、自作のAssemblyDefinitionAssetとUnity.TextMeshProのAssemblyDefinitionAssetを追加する方法を示していて、これによってAssetObjectから独自スクリプトとTextMeshProが参照できるようになります。
QUANTUM_UNITYによるラップ
前述の通り、ビューで使用されるフィールドは、Unityの一部であるかどうかにかかわらず、#if QUANTUM_UNITYブロックで囲む必要があります。以下は、Quantum.Simulationに自作クラスとTextMeshProのAssemblyDefinitionAssetを追加した際の例です。
C#
public class CharacterSpec : AssetObject
{
public FP MaxEnergy;
public FP MaxHealth;
#if QUANTUM_UNITY
[Header("Unity")]
public Sprite Icon;
public Color Color;
public string DisplayName;
public TMPro.TMP_StyleSheet StyleSheet;
public UIScriptableObject UIVisualData;
#endif
}
上記の例で、自作のUIScriptableObjectとTextMeshProのAssemblyDefinitionAssetが適切にセットアップされていない場合は、型や名前空間が見つからないエラーが発生し、コンパイルに失敗します。繰り返しになりますが、#if QUANTUM_UNITYでラップしたフィールドは、シミュレーションでは使用できず、ビューでのみ使用できます。
Photon Quantumのバージョンを更新する際に、Quantum.Simulationも更新される可能性があることに注意してください。AssemblyDefiontionAssetの参照が外れている場合は、Assembly Definition Referencesリストに追加し直す必要があります。