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 イベントをトリガーします。
インスタンス化の手順は以下の通りです。
テンプレートアセットの ISceneTemplatePipeline.BeforeTemplateInstantiation イベントがトリガーされ、アセットはトリガーされた ISceneTemplatePipeline スクリプトにバインドされます。
SceneTemplate.NewTemplateInstantiating イベントがトリガーされます。
テンプレートシーンのコピーである新しいシーンが作成されます。
新しいシーンと同じ名前のフォルダーが作成され、クローン可能な依存関係はすべてそのフォルダーに複製されます。
EditorSceneManager.sceneOpeningMonoBehavior.OnValidate (実装するすべてのゲームオブジェクト上)EditorSceneManager.sceneOpenedクローン可能なすべてのアセットへの参照が再マップされ、新しいシーンがクローンをポイントするようになります。
テンプレートアセットの ISceneTemplatePipeline.AfterTemplateInstantiation がトリガーされ、アセットはトリガーされた ISceneTemplatePipeline スクリプトにバインドされます。
SceneTemplate.NewTemplateInstantiated イベントがトリガーされます。