不可能的工作:在FBX模型导入脚本中生成模型的预置体

#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;

public class AnimImport : AssetPostprocessor
{
    StringBuilder sb = new StringBuilder();

    //fbx动画导入前的处理,对动画集进行分段设置,划分为各个子集
    void OnPreprocessAnimation()
    {
        var fpath = Path.GetDirectoryName(assetImporter.assetPath) + "/times.txt";
        if (!File.Exists(fpath))
        {
            //EditorUtility.DisplayDialog("缺少时间配置文件", assetImporter.assetPath + "的动画分段文件time.txt不存在,动画子集无法划分", "ok");
            return;
        }

        var sr = new StreamReader(File.OpenRead(fpath), Encoding.ASCII);
        var longStr = sr.ReadToEnd();
        var dats = longStr.Split('\"');
        var anims = new List<ModelImporterClipAnimation>();
       
        for (var i = 0; i < dats.Length; ++i)
        {
            if (dats[i] == "" || dats[i] == "\r\n")
                continue;
            var anim = new ModelImporterClipAnimation();
            var subdat = dats[i].Split(' ');
            anim.name = subdat[0];
            anim.firstFrame = float.Parse(subdat[1].TrimEnd('f'));
            anim.lastFrame = float.Parse(subdat[2].TrimEnd('f'));
            anims.Add(anim);
        }

        var modelImporter = assetImporter as ModelImporter;
        modelImporter.clipAnimations = anims.ToArray();

   }

    void OnPreprocessModel()
    {
        var modelImporter = assetImporter as ModelImporter;
        modelImporter.globalScale = 0.6f;
        modelImporter.importMaterials = true;
        modelImporter.materialName = ModelImporterMaterialName.BasedOnTextureName;
    }

    void OnPostprocessModel(GameObject go)
    {
        var modelImporter = assetImporter as ModelImporter;

        //1,找到Materials文件夹下所有的材质文件,替换它的shader
        var dir = Path.GetDirectoryName(modelImporter.assetPath) + "/Materials";
        var files = Directory.GetFiles(dir, "*.mat");
        foreach (var fs in files)
        {
            var mat = AssetDatabase.LoadAssetAtPath(fs.Replace('\\', '/'), typeof(Material)) as Material;
            mat.shader = Shader.Find("Qx/Unity/Mobile/Mobile-Diffuse");
        }

        AssetDatabase.SaveAssets();

        //2,创建prefab到assets/res/prefabs/char/下
        //经试验,查找文档,发现在此方法(OnPostprocessModel)中创建prefab是不可能的,其它方法更不可能
        //方式一,这种方式加载出来的fbx是空的
        //var fbx = AssetDatabase.LoadAssetAtPath(assetImporter.assetPath, typeof(GameObject)) as GameObject;
        //方式二,这种方式虽然能成功创建预置体,但创建出的预置体上mesh引用为空(原因见U3D文档)
        //var fbx = go;
        //PrefabUtility.CreatePrefab(Path.GetDirectoryName(modelImporter.assetPath) + "/testfbx.prefab", go);

    }

}
#endif

 

posted @ 2018-01-18 17:21  时空观察者9号  阅读(652)  评论(0编辑  收藏  举报