Пример #1
0
    protected override void Initialize(FSMEvent ev)
    {
        _eventGoTo = ev as AnimFSMEventGoTo;

        Vector3 dir = _eventGoTo.finalPosition - Agent.Transform.position;

        dir.y = 0;
        dir.Normalize();
        if (dir != Vector3.zero)
        {
            _finalRotation.SetLookRotation(dir);
        }

        _startRotation = Agent.Transform.rotation;

        Agent.BlackBoard.motionType = GetMotionType();

        if (_eventGoTo.motionType == MotionType.SPRINT)
        {
            _maxSpeed = Agent.BlackBoard.maxSprintSpeed;
        }
        else if (_eventGoTo.motionType == MotionType.RUN)
        {
            _maxSpeed = Agent.BlackBoard.maxRunSpeed;
        }
        else
        {
            _maxSpeed = Agent.BlackBoard.maxWalkSpeed;
        }

        _rotationProgress = 0;
    }
 protected void SendEvent()
 {
     _eventGoTo               = AnimFSMEventGoTo.pool.Get();
     _eventGoTo.moveType      = MoveType.FORWARD;
     _eventGoTo.motionType    = MotionType.SPRINT;
     _eventGoTo.finalPosition = GetDestination(Agent.BlackBoard.desiredTarget);
     Agent.FSMComponent.SendEvent(_eventGoTo);
 }
 public override void OnExit(Phenix.Unity.AI.WorldState ws)
 {
     if (_eventGoTo != null)
     {
         _eventGoTo.Release();
         _eventGoTo = null;
     }
     base.OnExit(ws);
 }
 public override void Reset()
 {
     base.Reset();
     _eventGoTo = null;
 }
Пример #5
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);
     }
 }