public Instance(AnimStateController controller, PlayableGraph graph, AnimGraphStand settings) { m_Settings = settings; m_AnimState = controller.GetComponent <AnimStateData>(); m_PredictedState = controller.GetComponent <LogicStateData>(); m_Mask = 1 << LayerMask.NameToLayer("Default") | 1 << LayerMask.NameToLayer("Platform"); m_LocomotionMixer = AnimationMixerPlayable.Create(graph, (int)LocoMixerPort.Count); m_AnimIdle = AnimationClipPlayable.Create(graph, settings.animIdle); graph.Connect(m_AnimIdle, 0, m_LocomotionMixer, (int)LocoMixerPort.Idle); m_LocomotionMixer.SetInputWeight((int)LocoMixerPort.Idle, 1.0f); m_AnimTurnL = CreateTurnPlayable(graph, settings.animTurnL, m_LocomotionMixer, LocoMixerPort.TurnL); m_AnimTurnR = CreateTurnPlayable(graph, settings.animTurnR, m_LocomotionMixer, LocoMixerPort.TurnR); var ports = new int[] { (int)LocoMixerPort.Idle, (int)LocoMixerPort.TurnL, (int)LocoMixerPort.TurnR }; m_Transition = new SimpleTranstion <AnimationMixerPlayable>(m_LocomotionMixer, ports); if (settings.animTurnL.events.Length != 0) { m_LeftTurnFootFalls = ExtractFootFalls(settings.animTurnL); m_RightTurnFootFalls = ExtractFootFalls(settings.animTurnR); } var animator = controller.GetComponent <Animator>(); var skeleton = controller.GetComponent <Skeleton>(); var leftToes = skeleton.bones[skeleton.GetBoneIndex(settings.leftToeBone.GetHashCode())]; var rightToes = skeleton.bones[skeleton.GetBoneIndex(settings.rightToeBone.GetHashCode())]; var ikJob = new FootIkJob { settings = settings.footIK, leftToe = animator.BindStreamTransform(leftToes), rightToe = animator.BindStreamTransform(rightToes) }; m_FootIk = AnimationScriptPlayable.Create(graph, ikJob, 1); graph.Connect(m_LocomotionMixer, 0, m_FootIk, 0); m_FootIk.SetInputWeight(0, 1f); m_AimMixer = AnimationMixerPlayable.Create(graph, (int)AimMixerPort.Count, true); m_AnimAimLeft = CreateAimPlayable(graph, settings.animAimLeft, m_AimMixer, AimMixerPort.AimLeft); m_AnimAimMid = CreateAimPlayable(graph, settings.animAimMid, m_AimMixer, AimMixerPort.AimMid); m_AnimAimRight = CreateAimPlayable(graph, settings.animAimRight, m_AimMixer, AimMixerPort.AimRight); m_AdditiveMixer = AnimationLayerMixerPlayable.Create(graph); var locoMixerPort = m_AdditiveMixer.AddInput(m_FootIk, 0); m_AdditiveMixer.SetInputWeight(locoMixerPort, 1); var aimMixerPort = m_AdditiveMixer.AddInput(m_AimMixer, 0); m_AdditiveMixer.SetInputWeight(aimMixerPort, 1); m_AdditiveMixer.SetLayerAdditive((uint)aimMixerPort, true); }
public Instance(AnimStateController animStateController, PlayableGraph graph, AnimGraphStateSelector settings) { m_AnimStateData = animStateController.GetComponent <AnimStateData>(); m_Mixer = AnimationMixerPlayable.Create(graph, 0, true); m_AnimStates = new AnimationControllerEntry[(int)LocomotionState.MaxValue]; var controllers = new Dictionary <AnimGraphAsset, IAnimGraphInstance>(); var controllerPorts = new Dictionary <IAnimGraphInstance, int>(); var stateTransitionPorts = new List <int>(); var transitionTimes = new Dictionary <IAnimGraphInstance, float[]>(); foreach (var controllerDef in settings.controllers) { if (controllerDef.template == null) { continue; } if (controllers.ContainsKey(controllerDef.template)) { continue; } var controller = controllerDef.template.Instatiate(animStateController, graph); controllers.Add(controllerDef.template, controller); var outputPlayable = Playable.Null; var outputPort = 0; controller.GetPlayableOutput(0, ref outputPlayable, ref outputPort); var port = m_Mixer.AddInput(outputPlayable, outputPort); controllerPorts.Add(controller, port); stateTransitionPorts.Add(port); var times = new float[(int)LocomotionState.MaxValue]; for (var i = 0; i < (int)LocomotionState.MaxValue; i++) { times[i] = controllerDef.transitionTime; } for (var i = 0; i < controllerDef.customTransitions.Length; i++) { var sourceStateIndex = (int)controllerDef.customTransitions[i].sourceState; var time = controllerDef.customTransitions[i].transtionTime; times[sourceStateIndex] = time; } transitionTimes.Add(controller, times); } foreach (var controllerDef in settings.controllers) { var animState = controllerDef.animationState; if (m_AnimStates[(int)animState].controller != null) { continue; } var controller = controllers[controllerDef.template]; m_AnimStates[(int)animState].controller = controller; m_AnimStates[(int)animState].animStateUpdater = controller as IGraphState; m_AnimStates[(int)animState].port = controllerPorts[controller]; m_AnimStates[(int)animState].transitionTimes = transitionTimes[controller]; } m_StateTranstion = new SimpleTranstion <AnimationMixerPlayable>(m_Mixer, stateTransitionPorts.ToArray()); }