public void Prepare(List <AnimationInfo> infoList, ExtraBoneInfo extraBoneInfo) { aniInfo = infoList; //extraBoneInfo = extraBoneInfo; List <Matrix4x4> bindPose = new List <Matrix4x4>(150); // to optimize, MergeBone don't need to call every time Transform[] bones = RuntimeHelper.MergeBone(lodInfo[0].skinnedMeshRenderer, bindPose); allTransforms = bones; if (extraBoneInfo != null) { List <Transform> list = new List <Transform>(); list.AddRange(bones); Transform[] transforms = gameObject.GetComponentsInChildren <Transform>(); for (int i = 0; i != extraBoneInfo.extraBone.Length; ++i) { for (int j = 0; j != transforms.Length; ++j) { if (extraBoneInfo.extraBone[i] == transforms[j].name) { list.Add(transforms[j]); } } bindPose.Add(extraBoneInfo.extraBindPose[i]); } allTransforms = list.ToArray(); } AnimationInstancingMgr.Instance.AddMeshVertex(prototype.name, lodInfo, allTransforms, bindPose, bonePerVertex); foreach (var lod in lodInfo) { foreach (var cache in lod.vertexCacheList) { cache.shadowcastingMode = shadowCastingMode; cache.receiveShadow = receiveShadow; cache.layer = layer; } } Destroy(GetComponent <Animator>()); //Destroy(GetComponentInChildren<SkinnedMeshRenderer>()); PlayAnimation(0); }
private ExtraBoneInfo ReadExtraBoneInfo(BinaryReader reader) { ExtraBoneInfo info = null; if (reader.ReadBoolean()) { info = new ExtraBoneInfo(); int count = reader.ReadInt32(); info.extraBone = new string[count]; info.extraBindPose = new Matrix4x4[count]; for (int i = 0; i != info.extraBone.Length; ++i) { info.extraBone[i] = reader.ReadString(); } for (int i = 0; i != info.extraBindPose.Length; ++i) { for (int j = 0; j != 16; ++j) { info.extraBindPose[i][j] = reader.ReadSingle(); } } } return(info); }
void BakeWithAnimator() { #if UNITY_ANDROID || UNITY_IPHONE Debug.LogError("You can't bake animations on IOS or Android. Please switch to PC."); return; #endif if (generatedPrefab != null) { generatedObject = Instantiate(generatedPrefab); generatedObject.transform.position = Vector3.zero; generatedObject.transform.rotation = Quaternion.identity; Animator animator = generatedObject.GetComponentInChildren <Animator>(); AnimationInstancing script = generatedObject.GetComponent <AnimationInstancing>(); Debug.Assert(script); SkinnedMeshRenderer[] meshRender = generatedObject.GetComponentsInChildren <SkinnedMeshRenderer>(); List <Matrix4x4> bindPose = new List <Matrix4x4>(150); Transform[] boneTransform = RuntimeHelper.MergeBone(meshRender, bindPose); // calculate the bindpose of attached points if (generatedFbx) { List <Transform> listExtra = new List <Transform>(); Transform[] trans = generatedFbx.GetComponentsInChildren <Transform>(); Transform[] bakedTrans = generatedObject.GetComponentsInChildren <Transform>(); foreach (var obj in selectExtraBone) { if (!obj.Value) { continue; } for (int i = 0; i != trans.Length; ++i) { Transform tran = trans[i] as Transform; if (tran.name == obj.Key) { bindPose.Add(tran.localToWorldMatrix); listExtra.Add(bakedTrans[i]); } } } Transform[] totalTransform = new Transform[boneTransform.Length + listExtra.Count]; System.Array.Copy(boneTransform, totalTransform, boneTransform.Length); System.Array.Copy(listExtra.ToArray(), 0, totalTransform, boneTransform.Length, listExtra.Count); boneTransform = totalTransform; //boneTransform = boneTransform; extraBoneInfo = new ExtraBoneInfo(); extraBoneInfo.extraBone = new string[listExtra.Count]; extraBoneInfo.extraBindPose = new Matrix4x4[listExtra.Count]; for (int i = 0; i != listExtra.Count; ++i) { extraBoneInfo.extraBone[i] = listExtra[i].name; extraBoneInfo.extraBindPose[i] = bindPose[bindPose.Count - listExtra.Count + i]; } } Reset(); AddMeshVertex2Generate(meshRender, boneTransform, bindPose.ToArray()); Transform rootNode = meshRender[0].rootBone; for (int j = 0; j != meshRender.Length; ++j) { meshRender[j].enabled = true; } animator.applyRootMotion = true; totalFrame = 0; UnityEditor.Animations.AnimatorController controller = animator.runtimeAnimatorController as UnityEditor.Animations.AnimatorController; Debug.Assert(controller.layers.Length > 0); cacheTransition.Clear(); cacheAnimationEvent.Clear(); UnityEditor.Animations.AnimatorControllerLayer layer = controller.layers[0]; AnalyzeStateMachine(layer.stateMachine, animator, meshRender, 0, aniFps, 0); generateCount = generateInfo.Count; } }