Beispiel #1
0
            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);
            }
Beispiel #2
0
            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());
            }