/// <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) { }
public sealed override void OnStateMachineExit(Animator animator, int stateMachinePathHash, AnimatorControllerPlayable controller) { }
public sealed override void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller) { }
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller) { Debug.Log("OnStateExit - ExitState - overload"); base.OnStateExit(animator, stateInfo, layerIndex, controller); }
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller) { animator.SetInteger(parameterHash, Random.Range(minInclusive, maxExclusive)); }
public AnimationControllerNode(PlayableGraph graph, RuntimeAnimatorController controller) { animatorController = controller; controllerPlayable = AnimatorControllerPlayable.Create(graph, controller); }
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(); }
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); }
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); } }
/// <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) { }
/// <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) { }