Scripted Importer 是 Unity Scripting API 的一部分。您可以使用 Scripted Importer 使用 C# 为 Unity 本身不支持的文件格式编写自定义资源导入器,从而添加支持。
您可以应通过专门定义抽象类 ScriptedImporter 并应用 ScriptedImporter 属性来创建自定义导入器。这样会注册您的自定义导入器以处理一个或多个文件扩展名。当资源管线检测到一个与注册的文件扩展名匹配的文件为新文件或已更改的文件时,Unity 会调用自定义导入器的 OnImportAsset
方法。
注意:Scripted Importer 无法处理已由 Unity 本身处理的文件扩展名。
下面是 Scripted Importer 的一个简单示例:它使用立方体图元作为主资源,将扩展名为 “cube” 的资源文件导入一个 Unity 预制件,并从资源文件中读取默认材质和颜色并指定其位置:
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' 是一个游戏对象,会自动转换为预制件
//(只有 'Main Asset' 才能成为预制件。)
ctx.AddObjectToAsset("main obj", cube);
ctx.SetMainObject(cube);
var material = new Material(Shader.Find("Standard"));
material.color = Color.red;
// 资源必须为资源分配一个唯一标识符字符串,且在所有导入之间保持一致
ctx.AddObjectToAsset("my Material", material);
// 必须销毁未作为导入输出传入上下文的资源
var tempMesh = new Mesh();
DestroyImmediate(tempMesh);
}
}
注意:
ScriptedImporter
attribute on the CubeImporter class.ScriptedImporter
基类。OnImportAsset
的 ctx 参数包含导入事件的输入和输出数据。SetMainAsset
的一次(且仅一次)调用。AddSubAsset
的任意次调用。您还可以实现自定义的 Import Settings Editor,为此需要专门定义 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();
}
}
将 Scripted Importer 类添加到项目后,可以像使用 Unity 支持的任何其他本机文件类型一样使用它:
__Alembic__:Alembic Importer 插件已更新为使用 Scripted Importer。有关更多信息,请访问 Unity github:AlembicImporter。
__USD__:USD Importer 插件已更新为使用 Scripted Importer。 有关更多信息,请访问 Unity github:USDForUnity。