0
点赞
收藏
分享

微信扫一扫

自动化优化导入的纹理选项

楚木巽 2022-01-07 阅读 72

自动化优化导入的美术资源选项

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Text.RegularExpressions;
using System.IO;

public class RigModelAutoImport : AssetPostprocessor {

	//美术资源路径
	//资源路径可以增加和修改
	private static string modelRoot = "Assets/Model";
	private static string staticModelRoot = "Assets/Model/staticModel";
	private static string animationRoot = "Assets/Animation";

	//网格导入器, pre-process
	void OnPreprocessModel()
    {	
    	//获得importer实例
		ModelImporter mImporter = assetImporter as ModelImporter;

		//-----------------Model---------------------------
		//不要勾选Read/Write Enabled。我们使用特殊命名“_ReadWrite”无视这个规则,大家用目录来划分也可以
		mImporter.isReadable = mImporter.assetPath.Contains("_ReadWrite");

		//OptimizeMesh:顶点优化选项GPU性能可以得到提升
		mImporter.optimizeMesh = true;

		//其它不必要的数据导入关闭
		mImporter.importLights = false;
		mImporter.importCameras = false;


		//顶点包含Normals,不要Tangents。这只是一个例子,实际应用按照路径规划一下
		mImporter.importNormals = ModelImporterNormals.Import;
		mImporter.importTangents = ModelImporterTangents.None;

		//generateSecondaryUV第二套uv(光照UV)启用默认开启状态
		if (mImporter.assetPath.StartsWith(staticModelRoot))
		{
			//模型皆为静态时自动勾选静态
			//注意:模型静态勾选生成UV时间根据模型数据大小决定,开启此选项可能占用太多时间
			mImporter.generateSecondaryUV = true;
			mImporter.secondaryUVAngleDistortion = 8;
			mImporter.secondaryUVAreaDistortion = 15;
			mImporter.secondaryUVHardAngle = 88;
			mImporter.secondaryUVPackMargin = 4;
		}

		//关闭Material导入
		mImporter.importMaterials = false;
    }


	//网格和动画导入器, post-process
	void OnPostprocessModel(GameObject go) 
	{
		//获得importer实例
		ModelImporter mImporter = assetImporter as ModelImporter;

		//模型后处理部分
		if (mImporter.assetPath.StartsWith(modelRoot))
		{
			//自动去无用骨骼节点,例如后缀为"Nub"
			Transform[] transforms = go.GetComponentsInChildren<Transform> ();
			foreach(Transform t in transforms)
			{
				if(t.gameObject.name.EndsWith ("Nub"))
				{
					GameObject.DestroyImmediate (t.gameObject);
				}
			}
		}

		//动画后处理部分
		if (mImporter.assetPath.StartsWith(animationRoot))
		{
			List<AnimationClip> animationClipList = new List<AnimationClip>(AnimationUtility.GetAnimationClips(go));
			if (animationClipList.Count == 0) {
				AnimationClip[] objectList = UnityEngine.Object.FindObjectsOfType (typeof(AnimationClip)) as AnimationClip[];
				animationClipList.AddRange(objectList);
			}
			
			foreach (AnimationClip theAnimation in animationClipList)
			{
				try 
				{
					//如果文件命名没有包含_Scale,则去除scale曲线
                    if (!assetPath.Contains("_Scale"))
                    {
                        foreach (EditorCurveBinding theCurveBinding in AnimationUtility.GetCurveBindings(theAnimation))
                        {
                            string name = theCurveBinding.propertyName.ToLower();
                            if (name.Contains("scale"))
                            {
                                AnimationUtility.SetEditorCurve(theAnimation, theCurveBinding, null);
                            }
                        }
                    }

					//浮点数精度压缩为f4
					AnimationClipCurveData[] curves = null;
					curves = AnimationUtility.GetAllCurves(theAnimation);
		            Keyframe key;
		            Keyframe[] keyFrames;
		            for (int ii = 0; ii < curves.Length; ++ii)
		            {
		                AnimationClipCurveData curveDate = curves[ii];
		                if (curveDate.curve == null || curveDate.curve.keys == null)
		                {
		                    continue;
		                }
		                keyFrames = curveDate.curve.keys;
		                for (int i = 0; i < keyFrames.Length; i++)
		                {
		                    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;
						theAnimation.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve);
		            }
				}
				catch (System.Exception e)
				{
					Debug.LogError(string.Format("CompressAnimationClip Failed! animationPath : {0} error: {1}", assetPath, e));
				}
			}
		}
	}
}


代码参考:王亮 (钛核互动CTO、USparkle专栏作者)
API引用:Unity官方帮助文档

举报

相关推荐

0 条评论