using UnityEditor;
using UnityEngine;
namespace FL.Editor
{
///
/// 模型资源属性预设
///
public partial class FLAssetPostprocessor : AssetPostprocessor
{
private void OnPreprocessModel()
{
if (!assetPath.StartsWith(ResRelative))
return;
var modelImporter = (ModelImporter)assetImporter;
modelImporter.isReadable = assetPath.ToLower().Contains(Readable);
//顶点优化选项,开启后顶点将被重新排序,GPU性能可以得到提升
modelImporter.optimizeMeshVertices = true;
//合并相同位置的顶点
modelImporter.weldVertices = true;
//优化骨骼节点
modelImporter.optimizeGameObjects = true;
// 混合形状,人物模型看情况开启,开启的话使用SkinnedMeshRenderer代替MeshRenderer
modelImporter.importBlendShapes = false;
// 可见性
//modelImporter.importVisibility = false;
// 导入相机
modelImporter.importCameras = false;
// 光照
modelImporter.importLights = false;
//材质球
//临时注释
//modelImporter.materialImportMode = ModelImporterMaterialImportMode.None;
modelImporter.keepQuads = false;
modelImporter.meshCompression = ModelImporterMeshCompression.Medium;
modelImporter.meshOptimizationFlags = MeshOptimizationFlags.Everything;
modelImporter.importAnimation = assetPath.Contains("@");
modelImporter.animationCompression = ModelImporterAnimationCompression.Optimal;
modelImporter.animationType = ModelImporterAnimationType.Generic;
modelImporter.skinWeights = ModelImporterSkinWeights.Custom;
modelImporter.maxBonesPerVertex = 2;
//网格缓冲区大小,默认为Auto,根据Mesh Size自动选择16或者32位Buff
//modelImporter.indexFormat = ModelImporterIndexFormat.Auto;
//法线,先全部关闭,后期看美术是否需要使用Mesh 的法线再开启
//modelImporter.importNormals = ModelImporterNormals.None;
//切线
modelImporter.importTangents = ModelImporterTangents.None;
//uv交换,使用lightmap时需要开启
modelImporter.swapUVChannels = false;
modelImporter.generateSecondaryUV = false;
}
private void OnPostprocessModel(GameObject model)
{
var modelImporter = (ModelImporter)assetImporter;
var isAnimation = assetPath.Contains("@");
//动画后处理部分
if (isAnimation)
{
//var animationClipList = new List(AnimationUtility.GetAnimationClips(model));
//if (animationClipList.Count == 0)
//{
// var objectList = UnityEngine.Object.FindObjectsOfType (typeof(AnimationClip)) as AnimationClip[];
// animationClipList.AddRange(objectList);
//}
//foreach (var clip in animationClipList)
//{
// try
// {
// //AnimationUtils.CompressAnimationClip(clip);
// //var curves = AnimationUtility.GetAllCurves(clip);
// ////浮点数精度压缩为f4
// //foreach (var curveDate in curves)
// //{
// // if (curveDate.curve?.keys == null)
// // continue;
// // var keyFrames = curveDate.curve.keys;
// // for (var i = 0; i < keyFrames.Length; i++)
// // {
// // var key = keyFrames[i];
// // key.value = float.Parse(key.value.ToString("f4"));
// // key.inTangent = float.Parse(key.inTangent.ToString("f4"));
// // key.outTangent = float.Parse(key.outTangent.ToString("f4"));
// // keyFrames[i] = key;
// // }
// // curveDate.curve.keys = keyFrames;
// // clip.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve);
// //}
// }
// catch (System.Exception e)
// {
// Debug.LogError($"CompressAnimationClip Failed !!! animationPath : {assetPath} error: {e}");
// }
//}
}
else
{
var renderers = model.transform.GetComponentsInChildren();
foreach (var renderer in renderers)
{
if (renderer == null || renderer.sharedMaterial == null)
continue;
if (renderer.sharedMaterial.name != model.name)
{
Debug.LogWarning("材质名和模型名不匹配!" + model.name);
}
}
}
}
}
}