private void BakeAllAnimClip(List <AnimationState> curAnims, string path, GameObject go, float frameRate, GameObject rootBone, GPUSkinningBone[] bones) { int curClipFrame = 0; float sampleTime = 0; float perFrameTime = 0; float len = 0; float s = 1; for (int i = 0; i < this.animData.animClips.Count; i++) { if (!this.animData.animClips[i].clip.legacy) { Debug.LogError(string.Format("{0} is not legacy!!", this.animData.animClips[i].clip.name)); continue; } if (this.animData.animClips[i].name.IndexOf("_all") >= 0) { continue; } //前后各加一帧 curClipFrame += Mathf.CeilToInt(curAnims[i].clip.frameRate * curAnims[i].length * s) + 2; } len = curClipFrame / frameRate; int pow1 = Mathf.NextPowerOfTwo(curClipFrame); int width = Mathf.NextPowerOfTwo(bones.Length * 3); Texture2D animMap = new Texture2D(width, pow1, format, false); animMap.wrapMode = TextureWrapMode.Clamp; animMap.filterMode = FilterMode.Point; animMap.name = this.animData.name; int startFrame = 0; for (int i = 0; i < this.animData.animClips.Count; i++) { if (!this.animData.animClips[i].clip.legacy) { Debug.LogError(string.Format("{0} is not legacy!!", this.animData.animClips[i].clip.name)); continue; } if (this.animData.animClips[i].name.IndexOf("_all") >= 0) { continue; } animData.AnimationPlay(curAnims[i].name); sampleTime = 0; int curClipFrame1 = Mathf.CeilToInt(curAnims[i].clip.frameRate * curAnims[i].length * s) + 2; perFrameTime = curAnims[i].length / (curClipFrame1 - 2); for (int k = startFrame; k < curClipFrame1 + startFrame - 2; k++) { if (sampleTime > curAnims[i].length) { sampleTime = curAnims[i].length; } curAnims[i].time = sampleTime; this.animData.animation.Sample(); for (int j = 0; j < bones.Length; j++) { GPUSkinningBone currentBone = bones[j]; Matrix4x4 lastMat = currentBone.bindpose; while (true) { if (currentBone.parentBoneIndex == -1) { Matrix4x4 mat = Matrix4x4.TRS(currentBone.transform.localPosition, currentBone.transform.localRotation, currentBone.transform.localScale); if (rootBone.transform != go.transform) { mat = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, go.transform.localScale) * mat; } lastMat = mat * lastMat; break; } else { Matrix4x4 mat = Matrix4x4.TRS(currentBone.transform.localPosition, currentBone.transform.localRotation, currentBone.transform.localScale); lastMat = mat * lastMat; currentBone = bones[currentBone.parentBoneIndex]; } } animMap.SetPixel(j * 3, k + 1, new Color(lastMat.m00, lastMat.m01, lastMat.m02, lastMat.m03)); animMap.SetPixel(j * 3 + 1, k + 1, new Color(lastMat.m10, lastMat.m11, lastMat.m12, lastMat.m13)); animMap.SetPixel(j * 3 + 2, k + 1, new Color(lastMat.m20, lastMat.m21, lastMat.m22, lastMat.m23)); if (k == startFrame) { animMap.SetPixel(j * 3, k, new Color(lastMat.m00, lastMat.m01, lastMat.m02, lastMat.m03)); animMap.SetPixel(j * 3 + 1, k, new Color(lastMat.m10, lastMat.m11, lastMat.m12, lastMat.m13)); animMap.SetPixel(j * 3 + 2, k, new Color(lastMat.m20, lastMat.m21, lastMat.m22, lastMat.m23)); } else if (k == curClipFrame1 + startFrame - 3) { animMap.SetPixel(j * 3, k + 2, new Color(lastMat.m00, lastMat.m01, lastMat.m02, lastMat.m03)); animMap.SetPixel(j * 3 + 1, k + 2, new Color(lastMat.m10, lastMat.m11, lastMat.m12, lastMat.m13)); animMap.SetPixel(j * 3 + 2, k + 2, new Color(lastMat.m20, lastMat.m21, lastMat.m22, lastMat.m23)); } } sampleTime += perFrameTime; } startFrame += curClipFrame1; } animMap.Apply(); this.bakedDataList.Add(new BakedData(animMap.name, pow1 / frameRate, animMap)); }