Пример #1
0
 public override void OnExit(Phenix.Unity.AI.WorldState ws)
 {
     if (_eventRotate != null)
     {
         _eventRotate.Release();
         _eventRotate = null;
     }
     base.OnExit(ws);
 }
Пример #2
0
    protected override void Initialize(FSMEvent ev = null)
    {
        _eventRotate = ev as AnimFSMEventRotate;
        //_currentRotationTime = 0;
        _rotationProgress = 0;
        _startRotation    = Agent.Transform.rotation;
        Vector3 finalDir;

        if (_eventRotate.target != null)
        {
            finalDir = (_eventRotate.target.Position + (_eventRotate.target.BlackBoard.moveDir *
                                                        _eventRotate.target.BlackBoard.speed * 0.5f)) - Agent.Transform.position;
            finalDir.Normalize();
        }
        else if (_eventRotate.direction != Vector3.zero)
        {
            finalDir = _eventRotate.direction;
        }
        else
        {
            finalDir = Agent.Transform.forward;
        }

        if (Vector3.Dot(finalDir, Agent.Transform.right) > 0)
        {
            _animName = Agent.AnimSet.GetRotateAnim(Agent.BlackBoard.motionType, RotationType.RIGHT);
        }
        else
        {
            _animName = Agent.AnimSet.GetRotateAnim(Agent.BlackBoard.motionType, RotationType.LEFT);
        }

        AnimationTools.PlayAnim(Agent.AnimEngine, _animName, 0.01f, QueueMode.CompleteOthers);

        _finalRotation.SetLookRotation(finalDir);

        /*_rotationTime = Vector3.Angle(Agent.Transform.forward, finalDir) / (360 * Agent.BlackBoard.rotationSmooth);
         *
         * if (_rotationTime == 0)
         * {
         *  IsFinished = true;
         *  _eventRotate.IsFinished = true;
         * }
         *
         * float animLen = Agent.AnimEngine[_animName].length;
         * int multi = Mathf.CeilToInt(_rotationTime / animLen);
         *
         * _rotationTime = animLen * multi + Time.timeSinceLevelLoad;*/
    }
Пример #3
0
 // Update is called once per frame
 protected override void Update()
 {
     base.Update();
     if (Input.GetKey(KeyCode.Alpha1))
     {
         AnimFSMEventGoTo ev = AnimFSMEventGoTo.pool.Get();
         ev.moveType      = MoveType.FORWARD;
         ev.motionType    = MotionType.RUN;
         ev.finalPosition = Agent.Decision.GetBestAttackStart(Agent.BlackBoard.desiredTarget);
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha2))
     {
         AnimFSMEventShowHideSword ev = AnimFSMEventShowHideSword.pool.Get();
         ev.show = true;
         Agent.BlackBoard.weaponState = WeaponState.IN_HAND;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha3))
     {
         AnimFSMEventIdle ev = AnimFSMEventIdle.pool.Get();
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha4))
     {
         AnimFSMEventRotate ev = AnimFSMEventRotate.pool.Get();
         ev.target = Agent.BlackBoard.desiredTarget;
         //ev.rotationModifier = 0.8f;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha5))
     {
         AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get();
         ev.target = Agent.BlackBoard.desiredTarget;
         ev.minDistanceToTarget = 3;
         ev.moveType            = MoveType.FORWARD;
         if (Agent.agentType == AgentType.DOUBLE_SWORDS_MAN || Agent.agentType == AgentType.SWORD_MAN) // 这里暂时偷个懒,另外扩展一个不同参数的goapaction才是更灵活的做法
         {
             ev.motionType        = MotionType.WALK;
             ev.totalMoveDistance = Agent.BlackBoard.DistanceToDesiredTarget - (Agent.BlackBoard.combatRange * 0.8f);
         }
         else
         {
             ev.totalMoveDistance = UnityEngine.Random.Range((Agent.BlackBoard.DistanceToDesiredTarget - (Agent.BlackBoard.combatRange * 0.5f)) * 0.5f,
                                                             Agent.BlackBoard.DistanceToDesiredTarget - (Agent.BlackBoard.combatRange * 0.5f));
         }
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha6))
     {
         AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get();
         ev.moveType            = MoveType.BACKWARD;
         ev.target              = Agent.BlackBoard.desiredTarget;
         ev.minDistanceToTarget = 0;
         if (Agent.agentType == AgentType.DOUBLE_SWORDS_MAN) // 这里暂时偷个懒,另外扩展一个不同参数的goapaction才是更灵活的做法
         {
             ev.motionType        = MotionType.RUN;
             ev.totalMoveDistance = UnityEngine.Random.Range(4f, 6f);
         }
         else
         {
             ev.totalMoveDistance = UnityEngine.Random.Range(2f, 5f);
         }
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha7))
     {
         AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get();
         ev.moveType            = MoveType.LEFTWARD;
         ev.target              = Agent.BlackBoard.desiredTarget;
         ev.totalMoveDistance   = UnityEngine.Random.Range(2.0f, 4.0f);
         ev.minDistanceToTarget = Agent.BlackBoard.DistanceToDesiredTarget * 0.7f;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha8))
     {
         AnimFSMEventCombatMove ev = AnimFSMEventCombatMove.pool.Get();
         ev.moveType            = MoveType.RIGHTWARD;
         ev.target              = Agent.BlackBoard.desiredTarget;
         ev.totalMoveDistance   = UnityEngine.Random.Range(2.0f, 4.0f);
         ev.minDistanceToTarget = Agent.BlackBoard.DistanceToDesiredTarget * 0.7f;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha9))
     {
         AnimFSMEventShowHideSword ev = AnimFSMEventShowHideSword.pool.Get();
         ev.show = false;
         Agent.BlackBoard.weaponState = WeaponState.NOT_IN_HANDS;
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Alpha0))
     {
         AnimFSMEventAttackMelee ev = AnimFSMEventAttackMelee.pool.Get();
         ev.target = Agent.BlackBoard.desiredTarget;
         //ev.attackType = OrderAttackType.X;
         //ev.animAttackData = Agent.GetComponent<AnimSet>().GetFirstAttackAnim(Agent.BlackBoard.weaponSelected,
         //  ev.attackType);
         Agent.FSMComponent.SendEvent(ev);
     }
     if (Input.GetKey(KeyCode.Minus))
     {
         AnimFSMEventAttackWhirl ev = AnimFSMEventAttackWhirl.pool.Get();
         ev.data = Agent.GetComponent <AnimSet>().GetWhirlAttackAnim();
         Agent.FSMComponent.SendEvent(ev);
     }
 }
Пример #4
0
 void SendEvent()
 {
     _eventRotate        = AnimFSMEventRotate.pool.Get();
     _eventRotate.target = Agent.BlackBoard.desiredTarget;
     Agent.FSMComponent.SendEvent(_eventRotate);
 }
Пример #5
0
 public override void Reset()
 {
     base.Reset();
     _eventRotate = null;
 }