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
リストに追加し直す必要があります。