Unity がテンプレートから新しいシーンをインスタンス化する際にカスタムコードを実行するには、Scene Template Pipeline スクリプトを作成し、テンプレートに接続します。テンプレートから新しいシーンを作成するたびに、Unity はパイプラインスクリプトの新しいインスタンスも作成します。
スクリプトをテンプレートに接続するには、以下を行います。
SceneTemplateAsset.templatePipeline
メソッドを使用して、C# を使ってスクリプトをテンプレートに接続することもできます。
Scene Template Pipeline スクリプトは、ISceneTemplatePipeline
インターフェースか SceneTemplatePipelineAdapter
から派生する必要があります。例えば、 BeforeTemplateInstantiation
や AfterTemplateInstantiation
などの、反応させたいイベントを実装する必要があります。
例
using UnityEditor.SceneTemplate;
using UnityEngine;
using UnityEngine.SceneManagement;
public class DummySceneTemplatePipeline : ISceneTemplatePipeline
{
public void BeforeTemplateInstantiation(SceneTemplateAsset sceneTemplateAsset, bool isAdditive, string sceneName)
{
if (sceneTemplateAsset)
{
Debug.Log($"Before Template Pipeline {sceneTemplateAsset.name} isAdditive: {isAdditive} sceneName: {sceneName}");
}
}
public void AfterTemplateInstantiation(SceneTemplateAsset sceneTemplateAsset, Scene scene, bool isAdditive, string sceneName)
{
if (sceneTemplateAsset)
{
Debug.Log($"After Template Pipeline {sceneTemplateAsset.name} scene: {scene} isAdditive: {isAdditive} sceneName: {sceneName}");
}
}
}
クローン可能な依存関係を持つテンプレートから新しいシーンを作成すると、Unity はいくつかのファイル操作を行います。これらの操作のほとんどは、スクリプトでリッスンや反応ができる Unity イベントを発動させます。
インスタンス化の手順は以下の通りです。
Unity は、テンプレートアセットの ISceneTemplatePipeline.BeforeTemplateInstantiation
イベントを発動し、発動する ISceneTemplatePipeline
スクリプトにそのアセットを紐づけます。
Unity は、SceneTemplate.NewTemplateInstantiating
イベントを発動させます。
Unity は、テンプレートシーンのコピーである新しいシーンを作成します。
Unity は、新しいシーンと同じ名前のフォルダーを作成し、すべてのクローン可能な依存関係をそのフォルダーに複製します。
EditorSceneManager.sceneOpening
MonoBehavior.OnValidate
(これを実装しているすべてのゲームオブジェクトに対して)EditorSceneManager.sceneOpened
Unity は、クローン可能なすべてのアセットへの参照を再マップします。そのため、新しいシーンはクローンを指します。
Unity は、テンプレートアセットの ISceneTemplatePipeline.AfterTemplateInstantiation
を発動させ、そのアセットを ISceneTemplatePipeline
のスクリプトに紐づけます。
Unity は、SceneTemplate.NewTemplateInstantiated
イベントを発動させます。