ScriptedImporter


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

这个功能对于:pp

  • 自定义数据格式(例如:JSON、YAML、XML、CSV、自定义二进制格式)
  • 外部工具导出的数据(如Tiled、Spine、自定义关卡编辑器)
  • 自定义配置文件(技能表、怪物表、剧情脚本等)

非常有用

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会:

  • 自动调用MonsterImporter
  • 解析JSON
  • 创建一个MonsterData的ScriptableObject
  • 自动将其加入资源系统,并显示在面板中

ScriptedImporter的高级应用

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

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

  3. 热更新资源标记

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

调试

  • 导入失败时:

    • 控制台中会显示OnImportAsset报错信息
    • 确保.yourformat文件的格式正确
  • 强制重新导入资源:

    • 右键 -> Reimport
  • 更新文件后自动刷新

    • Unity会检测文件变动,自动重新导入