private void _UpdateCurrentState(bool updateTime) { var stateInfo = _animator.GetCurrentAnimatorStateInfo(profile.controllerLayer); // var frame = Mathf.Min(TimeUtils.Time2Frame(stateInfo.length * stateInfo.normalizedTime), TimeUtils.Time2Frame(stateInfo.length)); var totalFrame = FrameUtil.Time2Frame(stateInfo.length * stateInfo.normalizedTime); var profileState = _stateTable[stateInfo.shortNameHash]; var frame = stateInfo.loop ? totalFrame % profileState.frames : totalFrame; CurrentStateInfo prevState = currentState; { var nstate = currentState; var didStateChange = false; nstate.frame = frame; nstate.totalFrame = totalFrame; nstate.state = profileState; nstate.stateInfo = stateInfo; if (nstate.state != currentState.state) { nstate.timeSinceExecution = 0; didStateChange = true; } else if (updateTime) { nstate.timeSinceExecution += Time.deltaTime; } currentState = nstate; if (didStateChange && onStateChanged != null) { onStateChanged(); } else { // Execute frame update for (int f = prevState.totalFrame; f < currentState.totalFrame; ++f) { int fr = f % profileState.frames; foreach (var list in currentBehaviours) { _FrameUpdateStateBehaviours(list, fr); } } } } }
void SyncControllerStates_Impl(List <State> states, AnimatorStateMachine machine) { foreach (var st in machine.states) { var state = (State)ScriptableObject.CreateInstance(typeof(State)); state.name = "State " + st.state.name; state.stateName = st.state.name; state.profile = profile; var clip = (AnimationClip)st.state.motion; var frames = clip == null ? 1 : clip.length / st.state.speed; state.frames = FrameUtil.Time2Frame(frames); states.Add(state); } foreach (var m in machine.stateMachines) { SyncControllerStates_Impl(states, m.stateMachine); } }
public bool InTriggerRange(TransitionRuntime.CurrentStateInfo info) { if (triggerRangeType == TriggerRangeType.AnyTime) { return(true); } if (triggerRangeType == TriggerRangeType.StateEnd) { return(info.stateInfo.normalizedTime >= 1); } if (triggerRangeType == TriggerRangeType.FrameSinceExec) { return(FrameUtil.Time2Frame(info.timeSinceExecution) >= triggerFrameSinceExec); } if (triggerRangeType == TriggerRangeType.FrameSinceExecBefore) { return(FrameUtil.Time2Frame(info.timeSinceExecution) <= triggerFrameSinceExec); } return(triggerRange.Contains(info.frame)); }
public override void OnInspectorGUI() { bool targetChanged = false; if (target != state) { addStatePortionName = ""; targetChanged = true; } state = (State)target; if (targetChanged) { var layer = state.profile.controller.layers[state.profile.controllerLayer]; var animState = Utils.FindState(layer.stateMachine, state.stateName); clip = animState.motion as AnimationClip; var sb = new System.Text.StringBuilder(); var events = AnimationUtility.GetAnimationEvents(clip); sb.AppendFormat("Events ({0}) ", events.Length).AppendLine(); if (events.Length > 0) { foreach (var ev in events) { sb.Append(string.Format("{0,4}", (int)FrameUtil.Time2Frame(ev.time))).Append("F "); sb.Append(ev.functionName); sb.AppendLine(); } } sb.AppendLine(); var bindings = AnimationUtility.GetCurveBindings(clip); sb.AppendFormat("Bindings ({0})", bindings.Length).AppendLine(); foreach (var binding in bindings) { sb.Append(" ").Append(binding.path).Append(binding.path == "" ? "" : "/") .Append("<").Append(binding.type.Name).Append(">.") .Append(binding.propertyName).AppendLine(); } summary = sb.ToString(); } EditorGUI.BeginChangeCheck(); EGL.LabelField("Name", state.stateName); EGL.LabelField("Frames", state.frames.ToString()); bool lastGUIEnabled = GUI.enabled; GUI.enabled = false; EGL.ObjectField("Clip", clip, typeof(AnimationClip), allowSceneObjects: false); GUI.enabled = lastGUIEnabled; if (summary.Length > 0) { EGL.HelpBox(summary, MessageType.None); } state.tags = InspectTags(state.tags); EGL.Space(); using (new EGL.VerticalScope(EditorStyles.helpBox)) { ++EditorGUI.indentLevel; InspectBehaviourList(state.behaviours); --EditorGUI.indentLevel; EGL.Space(); } EGL.LabelField("Portions"); var portions = state.portions; for (int i = 0; i < portions.Count; ++i) { var portion = portions[i]; bool active = activePortions.Contains(portion); active = EGL.Foldout(active, portion.name); if (active) { activePortions.Add(portion); } else { activePortions.Remove(portion); } if (active) { ++EditorGUI.indentLevel; EGL.BeginHorizontal(); portion.name = EGL.TextField("Name", portion.name); // GL.FlexibleSpace(); if (GL.Button("-", GUILayout.Width(30))) { portions.RemoveAt(i); --i; } EGL.EndHorizontal(); portion.range = EditorGUIUtil.FrameRangeSlider("Range", portion.range, state.frames); portion.includeEnd = EGL.Toggle("Include nt>=1", portion.includeEnd); portion.tags = InspectTags(portion.tags); using (new EGL.VerticalScope(EditorStyles.helpBox)) { InspectBehaviourList(portion.behaviours); } --EditorGUI.indentLevel; } } EGL.Space(); EGL.Space(); EGL.BeginHorizontal(); addStatePortionName = EGL.TextField(addStatePortionName); if (GUI.enabled && GL.Button("Add Portion", GL.Width(90))) { var portion = new StatePortion { name = addStatePortionName }; portions.Add(portion); addStatePortionName = ""; } EGL.EndHorizontal(); if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(state); } }