导入资源自动识别分类
Odin绘制分类设置
public class ToolsSettings : GlobalConfig<ToolsSettings>
{
//动画资源自动分类处理 fbx animationClip Avatar 自动分类,所有资源自动处理型配置
[LabelWidth(30)]
[BoxGroup("AnimClip")]
[HorizontalGroup("AnimClip/AnimationClip")]
[FolderPath]
public string Anim;
[LabelWidth(30)]
[BoxGroup("AnimClip")]
[HorizontalGroup("AnimClip/AnimationClip", width: 80)]
public string Mark;
[LabelWidth(75)]
[FolderPath]
[BoxGroup("AnimationClip")]
[LabelText("AvatarPath")]
public string Avatarfolder;
[LabelWidth(50)]
[FolderPath]
[BoxGroup("Fbx")]
[LabelText("FBXPath")]
public string FBXfolder;
}
以Animation的分类为例,在Odin中设置动画资源的标记为@,非@的则是fbx模型
设置Avatar 存放位置,
设置AnimClip存放位置,
设置Fbx资源存放位置,
Odin绘制设置完毕,开始写具体代码
根据unity的手册,可以知道,核心API是AssetPostprocessor,继承AssetPostprocessor,当unity资源导入之后,就会调用一系列方法。比如OnPreprocessModel,OnPostprocessModel,具体可以看手册给的示例
https://docs.unity3d.com/ScriptReference/AssetPostprocessor.html
动画资源分离参考代码:
using System.IO;
using UnityEditor;
using UnityEngine;
public class AnimationSpreat : AssetPostprocessor
{
private void OnPreprocessModel()
{
if (assetPath.Contains(ToolsSettings.Instance.Mark))
{
ModelImporter modelImporter = assetImporter as ModelImporter;
modelImporter.materialImportMode = ModelImporterMaterialImportMode.None;
//动画禁止材质导入
modelImporter.materialImportMode = ModelImporterMaterialImportMode.None;
//设置为Humannoid
modelImporter.animationType = ModelImporterAnimationType.Human;
//创建Avata
modelImporter.avatarSetup = ModelImporterAvatarSetup.CreateFromThisModel;
}
}
private void OnPostprocessModel(GameObject g)
{
string name = g.name;
Debug.Log("动画资源分离" + assetPath + " ");
EditorApplication.delayCall += () =>
{
if (assetPath.Contains(ToolsSettings.Instance.Mark))
{
//copy 动画
var assets = AssetDatabase.LoadAllAssetRepresentationsAtPath(assetPath);
//copy Avata
foreach (var obj in assets)
{
Debug.Log("FBX中的资源" + obj.name);
if (obj is AnimationClip)
{
var newClip = UnityEngine.Object.Instantiate(obj);
AssetDatabase.CreateAsset(newClip, ToolsSettings.Instance.Anim + "/" + name + ".anim");
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
if (obj is Avatar)
{
var newAvatar = UnityEngine.Object.Instantiate(obj);
AssetDatabase.CreateAsset(newAvatar, ToolsSettings.Instance.Avatarfolder + "/" + name + ".asset");
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
//move fbx
if (assetPath != ToolsSettings.Instance.FBXfolder)
{
Debug.Log("移动资源" + assetPath);
string path = Path.GetFileName(assetPath);
AssetDatabase.MoveAsset(assetPath, ToolsSettings.Instance.FBXfolder + "/" + path);
}
}
else
{
Debug.Log("导入模型,创建控制器" + assetPath);
}
};
}
}
其实动画资源 只需要拷贝出Clip即可,剩下的都可以删除,FBX与avata 只要模型