>> >> >> Reference << << << <<<<<<Ref>>>>>>
>> >> >> Indexer << << << <<<<<<Idx>>>>>>
Matched: 0

Tags

    Categories

      Types

        Top Results

          ScriptedImporter
          M: 2025-06-01 - ljf12825

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

          这个功能对于:

          • 自定义数据格式(例如: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会检测文件变动,自动重新导入