版本:Unity 6 (6000.0)
语言:English
内置导入器
导入器一致性

脚本化导入器

脚本化导入器是 Unity 脚本 API 的一部分。您可以使用脚本化导入器在 C# 中编写自定义资源导入器,从而为 Unity 本身不支持的文件格式添加自己的支持。

您可以通过专门化抽象类 ScriptedImporter 并应用 ScriptedImporter 属性来创建自定义导入器。这将注册您的自定义导入器以处理一个或多个文件扩展名。当资源管道检测到与已注册文件扩展名匹配的文件为新文件或已更改文件时,Unity 会调用自定义导入器的 OnImportAsset 方法。

注意:脚本化导入器无法处理 Unity 已原生处理的文件扩展名。

示例

下面是一个简单的脚本化导入器示例:它将扩展名为“cube”的资源文件导入到一个带有立方体基本体作为主要资源和默认材质及颜色的 Unity 预制体一种资产类型,允许您存储一个完整的 GameObject,包括组件和属性。预制体充当模板,您可以从中在场景中创建新的对象实例。 更多信息
参见 术语表
中,并从资源文件中读取的值分配其位置。

using UnityEngine;
using UnityEditor.AssetImporters;
using System.IO;

[ScriptedImporter(1, "cube")]
public class CubeImporter : ScriptedImporter
{
    public float m_Scale = 1;

    public override void OnImportAsset(AssetImportContext ctx)
    {
        var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        var position = JsonUtility.FromJson<Vector3>(File.ReadAllText(ctx.assetPath));

        cube.transform.position = position;
        cube.transform.localScale = new Vector3(m_Scale, m_Scale, m_Scale);

        // 'cube' is a GameObject and will be automatically converted into a prefab
        // (Only the 'Main Asset' is eligible to become a Prefab.)
        ctx.AddObjectToAsset("main obj", cube);
        ctx.SetMainObject(cube);

        var material = new Material(Shader.Find("Standard"));
        material.color = Color.red;

        // Assets must be assigned a unique identifier string consistent across imports
        ctx.AddObjectToAsset("my Material", material);

        // Assets that are not passed into the context as import outputs must be destroyed
        var tempMesh = new Mesh();
        DestroyImmediate(tempMesh);
    }
}

注意:

  • 通过将 ScriptedImporter 属性放置在 CubeImporter 类上,将导入器注册到 Unity 的资源管道。
  • CubeImporter 类实现了抽象 ScriptedImporter 基类。
  • OnImportAsset 的 ctx 参数包含导入事件的输入和输出数据。
  • 每个导入事件都必须生成一次(且仅一次)对 SetMainAsset 的调用。
  • 每个导入事件可以根据需要生成多次对 AddSubAsset 的调用。
  • 有关更多详细信息,请参阅 脚本 API 文档

您还可以通过专门化 ScriptedImporterEditor 类并使用类属性 CustomEditor 进行装饰来实现自定义导入设置编辑器,以告知它用于哪种类型的导入器。

例如

using UnityEditor;
using UnityEditor.AssetImporters;
using UnityEditor.SceneManagement;
using UnityEngine;

[CustomEditor(typeof(CubeImporter))]
public class CubeImporterEditor: ScriptedImporterEditor
{
    public override void OnInspectorGUI()
    {
        var colorShift = new GUIContent("Color Shift");
        var prop = serializedObject.FindProperty("m_ColorShift");
        EditorGUILayout.PropertyField(prop, colorShift);
        base.ApplyRevertGUI();
    }
}

使用脚本化导入器

将脚本化导入器类添加到项目后,您可以像使用 Unity 支持的任何其他原生文件类型一样使用它。

  • 将受支持的文件拖放到资源目录层次结构中以导入。
  • 重新启动 Unity 编辑器会重新导入自上次更新以来已更改的任何文件。
  • 编辑磁盘上的资源文件并返回到 Unity 编辑器会触发重新导入。
  • 使用 资源游戏中或项目中可使用的任何媒体或数据。资源可能来自在 Unity 之外创建的文件,例如 3D 模型、音频文件或图像。您也可以在 Unity 中创建某些资源类型,例如动画控制器、音频混音器或渲染纹理。 更多信息
    参见 术语表
    > 导入新资源… 导入新资源。
  • 通过菜单显式触发重新导入:资源 > 重新导入
  • 单击资源以查看其在 检查器窗口 中的设置。要修改其设置,请在 检查器一个 Unity 窗口,显示有关当前选定的 GameObject、资源或项目设置的信息,允许您检查和编辑值。 更多信息
    参见 术语表
    窗口中编辑它们,然后单击 应用

The Inspector window of an Asset (An Alembic Girl) imported by the Scripted Importer
由脚本化导入器导入的资源(一个 Alembic 女孩)的检查器窗口

脚本化导入器的实际应用

  • Alembic:Alembic 导入器 插件在 Unity 之外创建的一组代码,可在 Unity 中创建功能。您可以在 Unity 中使用两种类型的插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和原生插件(特定于平台的原生代码库)。 更多信息
    参见 术语表
    已更新为使用脚本化导入器。有关更多信息,请访问 Unity github:AlembicImporter

  • USD:USD 导入器插件使用脚本化导入器。有关更多信息,请参阅 USD 导入器软件包文档

内置导入器
导入器一致性