zoukankan      html  css  js  c++  java
  • 不可能的工作:在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] == "
    ")
                    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
  • 相关阅读:
    练习12
    练习11
    练习10(图片题)
    练习9(第九章习题)
    练习8(图片题)
    练习5
    练习4
    对象的赋值与比较
    静态方法
    静态变量
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/8311344.html
Copyright © 2011-2022 走看看