private static int BakeClip(GameObject go, SkinnedMeshRenderer skin, List <AnimClipData> clips, AnimTextureManifest manifest, List <int> yList, Dictionary <int, AnimClipData> states) { var index = 0; foreach (AnimClipData data in clips) { //tex var y = yList[index]; var width = skin.sharedMesh.vertexCount; var frameCount = (int)(data.clip.length * data.clip.frameRate); Texture2D posTex = null; Texture2D normalTex = null; Texture2D tangentTex = null; AnimTextureUtils.BakeMeshToTexture(skin, go, data.clip, out posTex, out normalTex, out tangentTex); manifest.posTex.SetPixels(0, y, posTex.width, posTex.height, posTex.GetPixels()); manifest.normalTex.SetPixels(0, y, normalTex.width, normalTex.height, normalTex.GetPixels()); manifest.tangentTex.SetPixels(0, y, tangentTex.width, tangentTex.height, tangentTex.GetPixels()); Object.DestroyImmediate(posTex); Object.DestroyImmediate(normalTex); Object.DestroyImmediate(tangentTex); manifest.animInfos.Add(new AnimTextureClipInfo(data.clip.name, y, yList[index + 1]) { isLoop = data.clip.isLooping, length = data.clip.length, frameRate = data.clip.frameRate, speed = data.speed }); index++; } foreach (var state in states) { int i = 0; for (; i < clips.Count; i++) { if (state.Value.clip.name == clips[i].clip.name) { break; } } manifest.stateInfos.Add(new StateInfo(state.Key, i)); } return(index); }
/** * [MenuItem("AnimTexture/BakeAnimToTexture")] * static void BakeOneByOne() * { * var objs = Selection.GetFiltered<Object>(SelectionMode.DeepAssets); * * var q = from obj in objs * let go = obj as GameObject * where go * select go; * * foreach (var item in q) * { * var newInst = Object.Instantiate(item); * newInst.name = item.name; * * Bake(newInst); * Object.DestroyImmediate(newInst); * } * Debug.Log("Bake done."); * Selection.activeObject = AssetDatabase.LoadAssetAtPath($"Assets/{DEFAULT_TEX_DIR}", typeof(Object)); * } */ public static void Bake(GameObject go) { var skin = go.GetComponentInChildren <SkinnedMeshRenderer>(); var anim = go.GetComponentInChildren <Animation>(); var dir = $"{Application.dataPath}/{DEFAULT_TEX_DIR}/"; if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } foreach (AnimationState state in anim) { var tex = AnimTextureUtils.BakeMeshToTexture(skin, go, state.clip); AssetDatabase.CreateAsset(tex, $"Assets/{DEFAULT_TEX_DIR}/{tex.name}.asset"); } AssetDatabase.Refresh(); }
private static int BakeClip(GameObject go, SkinnedMeshRenderer skin, Animation anim, AnimTextureManifest manifest, List <int> yList) { var index = 0; foreach (AnimationState state in anim) { //tex var y = yList[index]; var tex = AnimTextureUtils.BakeMeshToTexture(skin, go, state.clip); manifest.atlas.SetPixels(0, y, tex.width, tex.height, tex.GetPixels()); Object.DestroyImmediate(tex); manifest.animInfos.Add(new AnimTextureClipInfo(state.name, y, yList[index + 1]) { isLoop = state.clip.isLooping, length = state.clip.length }); index++; } return(index); }