Scripted Importers are part of the Unity Scripting API. Use Scripted Importers to write custom Asset importers in C# for file formats not natively supported by 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.
Note: Scripted Importers cannot handle a file extension that is already natively handled by Unity.
Note: Limitation
This is an experimental release of the Scripted Importer feature and as such is limited to assets that can be created using the Unity Scripting API. This is not a limitation of the implementation or design of the this feature, but does impose limits on its real-world use.
Below is a simple example as Scripted Importer: It imports asset files with the extension “cube” into a Unity Prefab with a cube primitive as the main Asset and a default material with a color fetched from the Asset file:
using UnityEditor.Experimental.AssetImporters;
[ScriptedImporter(1, "cube")]
public class CubeImporter : ScriptedImporter
{
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);
}
}
Note:
ScriptedImporter
attribute on the CubeImporter class.ScriptedImporter
base class.OnImportAsset
’s ctx argument contains both input and output data for the import event.SetMainAsset
.AddSubAsset
as necessary.You may also implement a custom Import Settings Editor by specializing ScriptedImporterEditor class and decorating it with the class attribute CustomEditor
to tell it what type of importer it is used for.
For example:
using UnityEditor.Experimental.AssetImporters;
[CustomEditor(typeof(CubeImporter))]
public class CubeImporterEditor: ScriptedImporterEditor
{
public override void OnInspectorGUI()
{
var prop = serializedObject.FindProperty("m_ColorShift");
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField("Color Shift");
EditorGUILayout.PropertyField(prop ));
EditorGUILayout.EndHorizontal();
// Important: call this at end!
base.ApplyRevertGUI();
}
}
Once you have added a scripted importer class to a project, you may use it just like any other native file type supported by Unity:
Alembic: The Alembic importer plug-in has been updated to use a Scripted Importer. For more information, visit Unity github: AlembicImporter.
USD: The USD importer plug-in has been updated to use a Scripted Importer. For more information, please visit Unity github:: USDForUnity.
New feature in 2017.1 NewIn20171
2017–07–27 Page amended with no editorial review
Did you find this page useful? Please give it a rating: