How to Develop a Game
ScriptedImporter
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

在Unity中,ScriptedImporter是一个非常强大的特性,它允许开发者自定义资源的导入流程。与默认的资源导入器(如图片、模型、音频等)不同,ScriptedImporter使开发者可以创建自己的资源类型,并通过代码控制它们在Unity中的导入方式

这个功能对于:

非常有用

ScriptedImporter概述

ScriptedImporter是Unity提供的一个可扩展导入器基类,可以通过继承它来实现一个支持自定义文件格式的资源导入器,所有继承自ScriptedImporter的类都能在Unity导入资源时自动调用对应的逻辑

使用方法

  1. 创建一个自定义类继承ScriptedImporter
  2. 使用[ScriptedImporter(version, extension)]注册扩展名
  3. 重写OnImportAsset方法。处理文件内容
  4. 使用AssetImporterContext注册生成的对象(如ScriptableObject)
  5. .youformat文件放入Assets文件夹,Unity自动导入

实例:导入.myjson格式为ScriptableObject

假设有一个JSON文件,路径Assets/Data/monster.myjson

{
    "name": "Goblin",
    "hp": 100,
    "atk": 25
}

创建数据容器类

using UnityEngine;

[CreateAssetMenu(fileName = "MonsterData", menuName = "MyGame/Monster")]
public class MonsterData : ScriptableObject
{
    public string monsterName;
    public int hp;
    public int atk;
}

创建Importer类

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

[ScriptedImporter(1, "myjson")] // 绑定导入器与文件扩展名
public class MonsterImporter : ScriptableImporter
{
    public override void OnImporterAsset(AssetImportContext ctx)
    {
        string json = File.ReadAllText(ctx.assetPath);
        MonsterRawData raw = JsonUtility.FromJson<MonsterRawData>(json);

        MonsterData asset = ScriptableObject.CreateInstance<MonsterData>();
        asset.monsterName = raw.name;
        asset.hp = raw.hp;
        asset.atk = raw.atk;

        ctx.AddObjectToAsset("main", asset); // 向资源系统注册导入出的子对象
        ctx.SetMainObject(asset);  // 设置主资源对象(Inspector中默认显示的对象)
    }

    [System.Serializable]
    class MonsterRawData
    {
        public stirng name;
        public int hp;
        public int atk;
    }
}

使用
monster.myjson拖到Assets/Data/文件夹时,Unity会:

ScriptedImporter的高级应用

  1. 多文件合成一个资源 将.animdef和多个.frame.png合成为一个动画资源

  2. 可视化工具生成文件 + 自定义Importer自动解析 例如配合Excel -> JSON -> ScriptableObject -> 自动进入Unity的流程

  3. 热更新资源标记

  4. 支持.byte, .txt, .xml, .cvs, .bin等任意格式

调试