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();
            }
Exemple #2
0
    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);
    }
Exemple #3
0
    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();
    }