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(); }
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); }