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:
Thanks for rating this page!
What kind of problem would you like to report?
Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at issuetracker.unity3d.com.
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information