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);
                        }
                    }
                }
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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));
        }
Example #4
0
        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);
            }
        }