public void InitTime(AnimMapClip clip) { animStartRate = (float)clip.startHeight / (float)s_AnimDataInfo.maxHeight; float totalRate = (float)clip.height / (float)s_AnimDataInfo.maxHeight; animEndRate = animStartRate + totalRate; m_Speed = 1.0f / clip.animLen * (animEndRate - animStartRate); Replay(); }
public List <BakedData> Bake() { if (_animData == null) { Debug.LogError("bake data is null!!"); return(_bakedDataList); } int totalHeight = 0; AnimDataInfo animDataInfo = new AnimDataInfo(); //所有动作生成在一个动作图上面 for (int i = 0; i < _animData.Value.AnimationClips.Count; i++) { var animationState = _animData.Value.AnimationClips[i]; if (!animationState.clip.legacy)//因为是顶点动画所以只能是legacy { Debug.LogError(string.Format($"{animationState.clip.name} is not legacy!!")); continue; } int startHeight = totalHeight; int frameHeight = (int)(animationState.clip.frameRate * animationState.length);//得到动画总帧数 totalHeight += frameHeight; float perFrameTime = animationState.length / frameHeight; AnimMapClip animMapClip = new AnimMapClip(); animMapClip.startHeight = startHeight; animMapClip.height = frameHeight; // animMapClip.perFrameTime = perFrameTime; animMapClip.animLen = animationState.clip.length; animMapClip.name = animationState.name; animDataInfo.animMapClips.Add(animMapClip); } // totalHeight = Mathf.NextPowerOfTwo(totalHeight); animDataInfo.maxHeight = totalHeight; var animMap = new Texture2D(_animData.Value.MapWidth, totalHeight, TextureFormat.RGBAHalf, true); animMap.name = string.Format($"{_animData.Value.Name}.animMap"); Debug.LogError(totalHeight); for (int i = 0; i < animDataInfo.animMapClips.Count; i++) { BakePerAnimClip(_animData.Value.AnimationClips[i], ref animMap, animDataInfo.animMapClips[i]); } animMap.Apply(); //在生成一个动画信息文本 var animInfoJson = JsonUtility.ToJson(animDataInfo); Debug.LogError(animInfoJson); _bakedDataList.Add(new BakedData(animMap.name, animMap, animInfoJson)); return(_bakedDataList); }
private void BakePerAnimClip(AnimationState curAnim, ref Texture2D texture, AnimMapClip animMapClip) { float sampleTime = 0; float perFrameTime = 0; perFrameTime = curAnim.length / animMapClip.height;//得到单位时间的帧数 _animData.Value.AnimationPlay(curAnim.name); for (int i = animMapClip.startHeight; i < animMapClip.startHeight + animMapClip.height; i++) { curAnim.time = sampleTime; _animData.Value.SampleAnimAndBakeMesh(ref _bakedMesh); for (int j = 0; j < _bakedMesh.vertexCount; j++) { var vertex = _bakedMesh.vertices[j]; texture.SetPixel(j, i, new Color(vertex.x, vertex.y, vertex.z)); } sampleTime += perFrameTime; } // texture.Apply(); }