This document is about: QUANTUM 3
SWITCH TO

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
}
#if QUANTUM_UNITY の使用

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の例です。

User-Defined Assembly Definition.

これでVisualsScriptableObjectUIScriptableObjectが、MyAssemblyDefinitionアセットに含まれるようになります。

Assembly DefinitionをQuantum.simulationに追加

Assets/Photon/Quantum/Simulation内には、Quantum.Simulationという名前のAssemblyDefinitionAssetが存在します。先ほど作成したAssemblyDefinitionAssetを使用できるようにするには、Quantum.SimulationAssembly Definition Referencesリストに追加する必要があります。以下の画像は、自作のAssemblyDefinitionAssetUnity.TextMeshProAssemblyDefinitionAssetを追加する方法を示していて、これによってAssetObjectから独自スクリプトとTextMeshProが参照できるようになります。

User-Defined Assembly Definition.

QUANTUM_UNITYによるラップ

前述の通り、ビューで使用されるフィールドは、Unityの一部であるかどうかにかかわらず、#if QUANTUM_UNITYブロックで囲む必要があります。以下は、Quantum.Simulationに自作クラスとTextMeshProAssemblyDefinitionAssetを追加した際の例です。

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
}

上記の例で、自作のUIScriptableObjectTextMeshProAssemblyDefinitionAssetが適切にセットアップされていない場合は、型や名前空間が見つからないエラーが発生し、コンパイルに失敗します。繰り返しになりますが、#if QUANTUM_UNITYでラップしたフィールドは、シミュレーションでは使用できず、ビューでのみ使用できます。

Photon Quantumのアップデート

Photon Quantumのバージョンを更新する際に、Quantum.Simulationも更新される可能性があることに注意してください。AssemblyDefiontionAssetの参照が外れている場合は、Assembly Definition Referencesリストに追加し直す必要があります。

Back to top