Пример #1
0
        public void BakeState(StateFrameData frameData)
        {
            Dictionary <string, List <StateFrameData.HitboxData> > hitboxes = BuildHitboxMap(frameData);
            Dictionary <string, Transform> bones = GetBoneMap(_gameObject);
            var frameCount = GetFrameCount(frameData.Animation);

            foreach (var hitbox in hitboxes.Values.SelectMany(x => x))
            {
                hitbox.BakedPositions = new Translation[frameCount];
            }

            if (hitboxes.Count < 0 || bones.Count < 0)
            {
                return;
            }
            var root     = _gameObject.transform;
            var graph    = PlayableGraph.Create();
            var output   = AnimationPlayableOutput.Create(graph, "Animation", _animator);
            var playable = AnimationClipPlayable.Create(graph, frameData.Animation);

            for (var i = 0; i < frameCount; i++)
            {
                playable.SetTime(i * Time.fixedDeltaTime);
                graph.Evaluate();
                foreach (var kvp in hitboxes)
                {
                    Transform bind;
                    if (!bones.TryGetValue(kvp.Key, out bind))
                    {
                        bind = root;
                    }

                    foreach (var hitbox in kvp.Value)
                    {
                        var worldPos = bind.TransformPoint(hitbox.Offset.Value);
                        hitbox.BakedPositions[i].Value = root.InverseTransformPoint(worldPos);
                    }
                }
            }
#if UNITY_EDITOR
            EditorUtility.SetDirty(frameData);
#endif
            graph.Destroy();
        }
Пример #2
0
        static Dictionary <string, List <StateFrameData.HitboxData> > BuildHitboxMap(StateFrameData state)
        {
            var hitboxes = new Dictionary <string, List <StateFrameData.HitboxData> >();

            foreach (StateFrameData.Track track in state.Tracks)
            {
                foreach (var hitbox in track.Hitboxes)
                {
                    var key = hitbox.BoundBone ?? "";
                    List <StateFrameData.HitboxData> data;
                    if (!hitboxes.TryGetValue(key, out data))
                    {
                        data          = new List <StateFrameData.HitboxData>();
                        hitboxes[key] = data;
                    }
                    data.Add(hitbox);
                }
            }
            return(hitboxes);
        }