Scripted Importer 是 Unity Scripting API 的一部分。使用Scripted Importer在C# 中编写自定义资源导入器,用于Unity本身不支持的文件格式。
Create a custom importer by specializing the abstract class ScriptedImporter and applying the ScriptedImporter attribute. This registers your custom importer to handle one or more file extensions. When a file matching the registered file extensions is detected by the Asset pipeline as being new or changed, Unity invokes the method OnImportAsset
of your custom importer.
注意:Scripted Importer 无法处理已由 Unity 本身处理的文件扩展名。
注意:限制
这是 Scripted Importer 功能的实验性版本,因此仅限于可以使用 Unity Scripting API 创建的资源。这不是此功能在实现或设计方面的限制,而是对其实际使用施加了限制。
下面是 Scripted Importer 的一个简单示例:它使用立方体图元作为主资源,将扩展名为“cube”的资源文件导入 Unity 预制件,并采用了从资源文件中获取的默认材质颜色:
using System.IO;
using System.Text;
using UnityEditor.Experimental.AssetImporters;
using UnityEngine;
[ScriptedImporter(1, "cube")]
public class CubeImporter : ScriptedImporter
{
[SerializeField]
float m_ColorShift = 0f;
public override void OnImportAsset(AssetImportContext ctx)
{
// Main asset
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
ctx.SetMainAsset("MainAsset", cube);
// Material as sub-asset
string text = File.ReadAllText(ctx.assetPath, Encoding.UTF8);
var channels = text.Split(',');
var color = new Color(float.Parse(channels[0]) + m_ColorShift,
float.Parse(channels[1]) + m_ColorShift,
float.Parse(channels[2]) + m_ColorShift);
var material = new Material(Shader.Find("Standard")) { color = color };
cube.GetComponent<Renderer>().material = material;
ctx.AddSubAsset("Material", material);
}
}
注意:
ScriptedImporter
属性。ScriptedImporter
基类。OnImportAsset
的 ctx 参数包含导入事件的输入和输出数据。SetMainAsset
的一次(且仅一次)调用。AddSubAsset
的任意次调用。您还可以实现自定义的导入设置编辑器 (Import Settings Editor),为此需要专门定义 ScriptedImporterEditor 类,并使用 CustomEditor
类属性对其进行修饰以告知其用于哪种类型的导入器。
例如:
using UnityEditor;
using UnityEditor.Experimental.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。