陈巧倩

Unity中文版-Create Gameplay Scenes Customizing new scene creation(自翻译)

· 93 words · 1 minutes to read
Categories: Unity
Tags: Document

翻译Unity中文版的初衷是因为官方提供的中文版存在缺陷,而且翻译的不全。现在基于Unity2023.2版本对官方文档进行翻译。

自定义新场景创建 🔗

要在Unity从模板实例化新的场景时运行自定义代码,请创建一个场景模板管道脚本,并将其连接到模板。每次从模板创建新场景时,Unity还会创建管道脚本的新实例。

要将脚本连接到模板:

  1. 检查模板以编辑其属性。
  2. 场景模板管道属性设置为指向您的场景模板管道脚本。

您还可以使用SceneTemplateAsset.templatePipeline方法通过C#将脚本连接到模板。

场景模板管道脚本必须派生自[ISceneTemplatePipeline]接口或[SceneTemplatePipelineAdapter]。它应该实现您要对其进行反应的事件;例如,下面的代码中的BeforeTemplateInstantiationAfterTemplateInstantiation

示例:

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中的事件,您可以在脚本中监听并做出反应。

实例化顺序如下所示:

  1. 单击“新场景”对话框中的“创建”按钮。Unity调用以下内容:
    • 场景模板资产。
    • 模板场景。这是与模板相关联的Unity场景。
    • 新场景。这是模板场景的新实例。
  2. Unity触发模板资产的ISceneTemplatePipeline.BeforeTemplateInstantiation事件,并将资产绑定到触发它的ISceneTemplatePipeline脚本。
  3. Unity触发SceneTemplate.NewTemplateInstantiating事件。
  4. Unity创建一个与模板场景相同的新场景副本。
  5. Unity创建一个与新场景同名的文件夹,并将所有可克隆的依赖项复制到该文件夹中。
  6. Unity在内存中打开新场景,并触发以下事件:
    • EditorSceneManager.sceneOpening
    • MonoBehavior.OnValidate(对所有实现此事件的GameObject)
    • EditorSceneManager.sceneOpened
  7. Unity重新映射对所有克隆资产的引用,以便新场景指向克隆资源。
  8. Unity保存新场景,并触发以下事件:
    • EditorSceneManager.sceneSaving
    • EditorSceneManager.sceneSaved
  9. Unity触发模板资产的ISceneTemplatePipeline.AfterTemplateInstantiation事件,并将资产绑定到触发它的ISceneTemplatePipeline脚本。
  10. Unity触发SceneTemplate.NewTemplateInstantiated事件。

结论 🔗

搬砖愉快!