void OnGUI() { EditorGUILayout.LabelField("输入需要导出的Prefab"); targetGo = (GameObject)EditorGUILayout.ObjectField(targetGo, typeof(GameObject), true); EditorGUILayout.LabelField("选择导出时使用的shader"); shader = (Shader)EditorGUILayout.ObjectField(shader, typeof(Shader), true); EditorGUILayout.LabelField("输入保存路径"); subPath = EditorGUILayout.TextField(subPath); if (GUILayout.Button("Bake")) { if (null == baker) { baker = new AnimMapBaker(); } baker.SetAnimData(targetGo); List <AnimBakedData> bakedDataList = baker.Bake(); for (int i = 0; i < bakedDataList.Count; ++i) { AnimBakedData bakedData = bakedDataList [i]; SavePrefab(bakedData); } } }
Texture2D SaveTexture(AnimBakedData data) { Texture2D animMap = new Texture2D(data.animMapWidth, data.animMapHeight, TextureFormat.RGBAHalf, false); animMap.LoadRawTextureData(data.rawBytesData); SaveObject(animMap, data.name, ".asset"); return(animMap); }
public List <AnimBakedData> Bake() { if (!hasSetData) { return(null); } List <AnimBakedData> bakedDataList = new List <AnimBakedData> (); foreach (AnimationState state in animation) { AnimBakedData bakedData = BakeSingleAnimClip(state); bakedDataList.Add(bakedData); } return(bakedDataList); }
void SavePrefab(AnimBakedData data) { Material mat = SaveMaterial(data); if (null == mat) { return; } GameObject go = new GameObject(); go.AddComponent <MeshRenderer> ().sharedMaterial = mat; go.AddComponent <MeshFilter> ().sharedMesh = targetGo.GetComponentInChildren <SkinnedMeshRenderer> ().sharedMesh; string folderPath = GetFolderPath(); PrefabUtility.CreatePrefab(Path.Combine(folderPath, data.name + ".prefab").Replace("\\", "/"), go); }
Material SaveMaterial(AnimBakedData data) { if (shader == null) { EditorUtility.DisplayDialog("error", "请设定使用的shader", "OK"); return(null); } SkinnedMeshRenderer skinMeshRender = targetGo.GetComponentInChildren <SkinnedMeshRenderer> (); if (skinMeshRender == null) { EditorUtility.DisplayDialog("error", "targetGo中没有找到SkinnedMeshRenderer", "OK"); return(null); } Texture2D animMap = SaveTexture(data); Material mat = new Material(shader); mat.SetTexture("_MainTex", skinMeshRender.sharedMaterial.mainTexture); mat.SetTexture("_AnimMap", animMap); mat.SetFloat("_AnimLen", data.animLen); SaveObject(mat, data.name, ".mat"); return(mat); }