/// <summary>
        /// 进入到A状态时
        /// </summary>
        /// <param name="animator"></param>
        /// <param name="stateInfo"></param>
        /// <param name="layerIndex"></param>
        /// <param name="controller"></param>
        public sealed override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
        {
            m_FirstFrameHappened = false;

            OnSLStateEnter(animator, stateInfo, layerIndex);
            OnSLStateEnter(animator, stateInfo, layerIndex, controller);
        }
        /// <summary>
        /// A状态持续更新
        /// </summary>
        /// <param name="animator"></param>
        /// <param name="stateInfo">动画状态信息</param>
        /// <param name="layerIndex"></param>
        /// <param name="controller"></param>
        public sealed override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
        {
            if (!animator.gameObject.activeSelf)//如果gameObject没有被激活, 则不会调用此函数
            {
                return;
            }

            if (animator.IsInTransition(layerIndex) && animator.GetNextAnimatorStateInfo(layerIndex).fullPathHash == stateInfo.fullPathHash)
            {// 如果在Transition中
                OnSLTransitionToStateUpdate(animator, stateInfo, layerIndex);
                OnSLTransitionToStateUpdate(animator, stateInfo, layerIndex, controller);
            }

            if (!animator.IsInTransition(layerIndex) && m_FirstFrameHappened)
            {// 如果不在Transition中 && 第一帧已经过去
                OnSLStateNoTransitionUpdate(animator, stateInfo, layerIndex);
                OnSLStateNoTransitionUpdate(animator, stateInfo, layerIndex, controller);
            }

            if (animator.IsInTransition(layerIndex) && !m_LastFrameHappened && m_FirstFrameHappened)
            {// 如果在Transition中 && 第一帧已经过去 && 最后一帧没有过去
                m_LastFrameHappened = true;

                OnSLStatePreExit(animator, stateInfo, layerIndex);
                OnSLStatePreExit(animator, stateInfo, layerIndex, controller);
            }

            if (!animator.IsInTransition(layerIndex) && !m_FirstFrameHappened)
            {// 不在Transition中 && 第一帧没有被调用 ---> 完全进入到B状态之后第一帧被调用
                m_FirstFrameHappened = true;

                OnSLStatePostEnter(animator, stateInfo, layerIndex);
                OnSLStatePostEnter(animator, stateInfo, layerIndex, controller);
            }

            if (animator.IsInTransition(layerIndex) && animator.GetCurrentAnimatorStateInfo(layerIndex).fullPathHash == stateInfo.fullPathHash)
            {// transition的每帧都会调用此函数
                OnSLTransitionFromStateUpdate(animator, stateInfo, layerIndex);
                OnSLTransitionFromStateUpdate(animator, stateInfo, layerIndex, controller);
            }
        }
 /// <summary>
 /// Called after OnSLStatePreExit every frame during transition to the state.
 /// 在transition的每帧都会调用此函数. 在OnSLStatePreExit之后调用.
 /// </summary>
 public virtual void OnSLTransitionFromStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
 {
 }
 /// <summary>
 /// Called after Updates when execution of the state first finshes (after transition from the state).
 /// 在transition完成之后调用此函数. 在OnSLTransitionFromStateUpdate之后调用
 /// </summary>
 public virtual void OnSLStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
 {
 }
Пример #5
0
 public sealed override void OnStateMachineExit(Animator animator, int stateMachinePathHash, AnimatorControllerPlayable controller)
 {
 }
Пример #6
0
 public sealed override void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
 {
 }
Пример #7
0
 public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
 {
     Debug.Log("OnStateExit - ExitState - overload");
     base.OnStateExit(animator, stateInfo, layerIndex, controller);
 }
Пример #8
0
 public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
 {
     animator.SetInteger(parameterHash, Random.Range(minInclusive, maxExclusive));
 }
Пример #9
0
 public AnimationControllerNode(PlayableGraph graph, RuntimeAnimatorController controller)
 {
     animatorController = controller;
     controllerPlayable = AnimatorControllerPlayable.Create(graph, controller);
 }
Пример #10
0
        public override void InitForAvatar()
        {
            StartVrcHooks();

            AvatarAnimator.applyRootMotion           = false;
            AvatarAnimator.runtimeAnimatorController = null;
            AvatarAnimator.updateMode  = AnimatorUpdateMode.Normal;
            AvatarAnimator.cullingMode = AnimatorCullingMode.CullCompletely;
            DestroyGraphs();

            var layerList = _avatarDescriptor.baseAnimationLayers.ToList();

            layerList.AddRange(_avatarDescriptor.specialAnimationLayers);
            layerList.Sort(ModuleVrc3Styles.Data.LayerSort);

            _playableGraph = PlayableGraph.Create("Gesture Manager 3.1");
            var externalOutput = AnimationPlayableOutput.Create(_playableGraph, "Gesture Manager", AvatarAnimator);
            var playableMixer  = AnimationLayerMixerPlayable.Create(_playableGraph, layerList.Count + 1);

            externalOutput.SetSourcePlayable(playableMixer);

            _fromBlend.Clear();
            _avatarClips.Clear();
            _weightControllers      = new RadialWeightController[layerList.Count];
            _humanAnimatorPlayables = new AnimatorControllerPlayable[layerList.Count];

            for (var i = 0; i < layerList.Count; i++)
            {
                var vrcAnimLayer = layerList[i];
                var iGraph       = i + 1;

                if (vrcAnimLayer.animatorController)
                {
                    foreach (var clip in vrcAnimLayer.animatorController.animationClips)
                    {
                        _avatarClips.Add(clip);
                    }
                }

                var isFx     = vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.FX;
                var isAdd    = vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.Additive;
                var isPose   = vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.IKPose || vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.TPose;
                var isAction = vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.Sitting || vrcAnimLayer.type == VRCAvatarDescriptor.AnimLayerType.Action;
                var limit    = isPose || isAction;

                var controller = vrcAnimLayer.animatorController ? vrcAnimLayer.animatorController : ModuleVrc3Styles.Data.ControllerOf[vrcAnimLayer.type];
                var mask       = vrcAnimLayer.isDefault || isFx ? ModuleVrc3Styles.Data.MaskOf[vrcAnimLayer.type] : vrcAnimLayer.mask;

                if (!controller)
                {
                    continue;
                }

                _humanAnimatorPlayables[i] = AnimatorControllerPlayable.Create(_playableGraph, Vrc3ProxyOverride.OverrideController(controller));
                _weightControllers[i]      = new RadialWeightController(playableMixer, iGraph);
                for (var j = 0; j < _humanAnimatorPlayables[i].GetLayerCount(); j++)
                {
                    _humanAnimatorPlayables[i].SetLayerWeight(j, 1f);
                }

                playableMixer.ConnectInput(iGraph, _humanAnimatorPlayables[i], 0, 1);
                _fromBlend[vrcAnimLayer.type] = _weightControllers[i];

                if (limit)
                {
                    playableMixer.SetInputWeight(iGraph, 0f);
                }
                if (isAdd)
                {
                    playableMixer.SetLayerAdditive((uint)iGraph, true);
                }
                if (mask)
                {
                    playableMixer.SetLayerMaskFromAvatarMask((uint)iGraph, mask);
                }
            }

            _playableGraph.SetTimeUpdateMode(DirectorUpdateMode.GameTime);
            _playableGraph.Play();
            _playableGraph.Evaluate(0f);

            RadialMenu.Set(AvatarAnimator, Menu, Parameters, _humanAnimatorPlayables);
            RadialMenu.GetParam("TrackingType")?.InternalSet(1f);
            RadialMenu.GetParam("Upright")?.InternalSet(1f);
            RadialMenu.GetParam("Grounded")?.InternalSet(1f);
            RadialMenu.GetParam("VelocityX")?.Amplify(-7f);
            RadialMenu.GetParam("VelocityZ")?.Amplify(7f);
            RadialMenu.GetParam("AvatarVersion")?.InternalSet(3f);
            RadialMenu.GetParam("Seated")?.OnChange(OnSeatedModeChange);
        }
 public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
 {
     OnExit();
 }
Пример #12
0
        public sealed override void OnStateExit(UnityEngine.Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
        {
            m_LastFrameHappened = false;

            OnSLStateExit(animator, stateInfo, layerIndex);
            OnSLStateExit(animator, stateInfo, layerIndex, controller);
        }
Пример #13
0
        public sealed override void OnStateUpdate(UnityEngine.Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
        {
            if (!animator.gameObject.activeSelf)
            {
                return;
            }

            if (animator.IsInTransition(layerIndex) && animator.GetNextAnimatorStateInfo(layerIndex).fullPathHash == stateInfo.fullPathHash)
            {
                OnSLTransitionToStateUpdate(animator, stateInfo, layerIndex);
                OnSLTransitionToStateUpdate(animator, stateInfo, layerIndex, controller);
            }

            if (!animator.IsInTransition(layerIndex) && m_FirstFrameHappened)
            {
                OnSLStateNoTransitionUpdate(animator, stateInfo, layerIndex);
                OnSLStateNoTransitionUpdate(animator, stateInfo, layerIndex, controller);
            }

            if (animator.IsInTransition(layerIndex) && !m_LastFrameHappened && m_FirstFrameHappened)
            {
                m_LastFrameHappened = true;

                OnSLStatePreExit(animator, stateInfo, layerIndex);
                OnSLStatePreExit(animator, stateInfo, layerIndex, controller);
            }

            if (!animator.IsInTransition(layerIndex) && !m_FirstFrameHappened)
            {
                m_FirstFrameHappened = true;

                OnSLStatePostEnter(animator, stateInfo, layerIndex);
                OnSLStatePostEnter(animator, stateInfo, layerIndex, controller);
            }

            if (animator.IsInTransition(layerIndex) && animator.GetCurrentAnimatorStateInfo(layerIndex).fullPathHash == stateInfo.fullPathHash)
            {
                OnSLTransitionFromStateUpdate(animator, stateInfo, layerIndex);
                OnSLTransitionFromStateUpdate(animator, stateInfo, layerIndex, controller);
            }
        }
Пример #14
0
 /// <summary>
 /// Called every frame when the state is not being transitioned to or from.
 /// </summary>
 public virtual void OnSLStateNoTransitionUpdate(UnityEngine.Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
 {
 }
Пример #15
0
 /// <summary>
 /// Called on the first frame after the transition to the state has finished.
 /// </summary>
 public virtual void OnSLStatePostEnter(UnityEngine.Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller)
 {
 }