Inheritance: MonoBehaviour
示例#1
0
    public void ChangeState(Type stateType)
    {
        if (stateDic.ContainsKey(stateType))
        {
            BaseFSM <T> fsm = stateDic[stateType];

            if (fsm != null)
            {
                currentStateType = stateType;
                previousState    = currentState;
                currentState     = fsm;
                currentState.Begin();
            }
        }
    }
示例#2
0
    protected override bool Evaluate(BaseFSM fsm)
    {
        if (fsm.targetPlayer == null)
        {
            return(false);
        }

        //玩家离开攻击范围
        if (Vector3.Distance(fsm.transform.position, fsm.targetPlayer.transform.position) > fsm.sightDistance)
        {
            return(true);
        }

        return(false);
    }
示例#3
0
    /// <summary>
    /// 检查子条件
    /// </summary>
    /// <param name="fsm"></param>
    /// <returns></returns>
    protected bool CheckSubTriggers(BaseFSM fsm)
    {
        if (subTriggers.Count == 0)
        {
            return(true);
        }

        for (int i = 0; i < subTriggers.Count; i++)
        {
            if (subTriggers[i].Evaluate(fsm))
            {
                return(true);
            }
        }
        return(false);
    }
 private Quaternion Look(BaseFSM FSM)
 {
     //Ray ray = new Ray(GameTool.FindTheChild(FSM.gameObject, "RigLArmPalmGizmo").position, new Vector3(Screen.width / 2, Screen.height / 2, 0));
     Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
     RaycastHit hitInfo;
     Vector3 targetPoint;
     if (Physics.Raycast(ray, out hitInfo))
     {
         targetPoint = hitInfo.point;       
     }
     else
     {
         targetPoint = Camera.main.transform.forward * 100;
     }
     return Quaternion.LookRotation(targetPoint - GameTool.FindTheChild(FSM.gameObject, "RigLArmPalmGizmo").position);
 }
示例#5
0
 public void Pause(bool isPaused)
 {
     if (isPaused)
     {
         if (currentState.GetType() != typeof(DeactivationState))
         {
             previousState = currentState;
             ChangeState(typeof(DeactivationState));
         }
     }
     else
     {
         if (currentState.GetType() == typeof(DeactivationState))
         {
             ChangeState(previousState.GetType());
         }
     }
 }
示例#6
0
    public override void Reason(BaseFSM FSM)
    {
        CharacterMessageDispatcher.Instance.DispatchMesssage
            (FSMTransitionType.IsIdle,
            FSM,
            FSM.animationManager.baseStateInfo.IsName("Idle") && FSM.animationManager.attackStateInfo.normalizedTime > 1.15f
            );

        if (Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.DoubleHands)
        {
            FSM.Attacked = true;
            FSM.PerformTransition(FSMTransitionType.AttackWithDoubleHands);
        }
        CharacterMessageDispatcher.Instance.DispatchMesssage
            (FSMTransitionType.CanBeMove,
            FSM,
            (Mathf.Abs(Input.GetAxis("Horizontal")) > 0.5 || Mathf.Abs(Input.GetAxis("Vertical")) > 0.5) && FSM.controller.CC.isGrounded
            );
    }
示例#7
0
    public override void Act(BaseFSM FSM)
    {
        if (FSM.controller.GetCurSelectedWeaponInfo() != null)
        {
            attackDistance = FSM.controller.GetCurSelectedWeaponInfo().weaponProperties.weaponLength;
        }
        if (FSM.Attacked)
        {
            foreach (KeyValuePair <string, NetworkPlayer> enemy in FSM.controller.ScenePlayers)
            {
                if (FSM.controller.CheckCanAttack(FSM.gameObject, enemy.Value.gameObject, attackDistance, 45))
                {
                    NetworkManager.SendPlayerHitSomeone(enemy.Value.name, FSM.characterStatus.Attack_Physics * (1 - enemy.Value.status.Defend_Physics / 100));

                    AudioManager.PlaySound2D("Spear").Play();
                }
            }
            FSM.animationManager.PlayAnimation("Spear Melee Attack 02");
            FSM.Attacked = false;
        }
    }
示例#8
0
    public override void Reason(BaseFSM FSM)
    {
        if (!FSM.animationManager.baseStateInfo.IsName("Idle") && FSM.animationManager.attackStateInfo.normalizedTime > 1f)
        {
            FSM.animationManager.combo = 0;
            FSM.animationManager.PlayAnimation("AttackID", 0);
            FSM.PerformTransition(FSMTransitionType.IsIdle);
        }


        if (Input.GetButtonDown("Fire1"))
        {
            FSM.Attacked = true;
        }

        CharacterMessageDispatcher.Instance.DispatchMesssage
            (FSMTransitionType.CanBeMove,
            FSM,
            (Mathf.Abs(Input.GetAxis("Horizontal")) > 0.5 || Mathf.Abs(Input.GetAxis("Vertical")) > 0.5) && FSM.controller.CC.isGrounded
            );
    }
示例#9
0
 /// <summary>Remove FSM from list</summary>
 protected static void RemoveFSM(BaseFSM fsm)
 {
     if (first == fsm)
     {
         first = fsm.nextFsm; // remove first
     }
     else
     {
         // not head of list
         if (fsm.nextFsm != null)
         {
             fsm.prevFsm.nextFsm = fsm.nextFsm;
             fsm.nextFsm.prevFsm = fsm.prevFsm;
         }
         else if (fsm.prevFsm != null)
         {
             fsm.prevFsm.nextFsm = null;
         }
     }
     fsm.prevFsm = null;
     fsm.nextFsm = null;
 }
示例#10
0
    public virtual BaseFSM Clone()
    {
        BaseFSM cfsm = new BaseFSM();

        cfsm.name = m_name;

        foreach (BaseState snode in m_stateNodes)
        {
            BaseState cnode = snode.Clone();
            cnode.curFSM = cfsm;
            cfsm.states.Add(snode);
        }
        BaseState defaultNode = cfsm.FindChildState(m_defaultNode.name);

        if (defaultNode != null)
        {
            //设置当前默认状态
            cfsm.currentState = defaultNode;
            cfsm.defaultNode  = defaultNode;
        }

        return(cfsm);
    }
示例#11
0
 public override void EnterState(BaseFSM fsm)
 {
     //播放死亡动画
     fsm.PlayeAnimation(fsm.animParams.Dead);
 }
示例#12
0
 /// <summary>
 /// 目标是否在攻击范围内
 /// </summary>
 protected override bool Evaluate(BaseFSM fsm)
 {
     return(Vector3.Distance(fsm.transform.position, fsm.targetPlayer.position) <= fsm.chStatus.attackDistance);
 }
示例#13
0
 public override void Action(BaseFSM fsm)
 {
     //播待机动画
     fsm.PlayeAnimation(fsm.animParams.Idle);
 }
示例#14
0
 public override void EnterState(BaseFSM fsm)
 {
 }
示例#15
0
 public override void Act(BaseFSM FSM)
 {
     FSM.PlayAnimation("Jump");
     FSM.controller.Jump(FSM.characterStatus.jumpSpeed);
 }
示例#16
0
 void LateUpdate()
 {
     BaseFSM.StartAllNextStates();
 }
示例#17
0
 public void SetFSM(string fsmName, BaseFSM fsm)
 {
     m_fsmDict[fsmName] = fsm;
 }
 public CharacterMessage(FSMTransitionType msg, BaseFSM rid, bool con)
 {
     Msg       = msg;
     Receiver  = rid;
     condition = con;
 }
示例#19
0
 public override void ExitState(BaseFSM fsm)
 {
 }
示例#20
0
 public override void Action(BaseFSM fsm)
 {
 }
示例#21
0
    public void LoadFSMTemplate(XmlNode fsmNode)
    {
        Assembly assembly = Assembly.GetExecutingAssembly();

        if (fsmNode == null || fsmNode.Name != "FSM")
        {
            return;
        }
        object fsmObj = assembly.CreateInstance(fsmNode.Attributes.GetNamedItem("type").Value);

        if (fsmObj != null)
        {
            BaseFSM bfsm = fsmObj as BaseFSM;
            bfsm.name = fsmNode.Attributes.GetNamedItem("name").Value;
            switch (bfsm.type)
            {
            case EFSM_TYPE.EFSM_DEFAULT_FSM:
            {
            }
            break;

            case EFSM_TYPE.EFSM_ENTITY_FSM:
            {
            } break;
            }
            //先将所有节点生成一遍,再设置连接关系
            XmlNodeList stateNodes = fsmNode.ChildNodes;
            for (int i = 0; i < stateNodes.Count; i++)
            {
                XmlNode stateNode = stateNodes[i];
                if (stateNode.Name != null && stateNode.Name == "StateNode")
                {
                    //string t = typeof(EntityAnimationState).ToString();
                    //object stateObj = assembly.CreateInstance(t);
                    object stateObj = assembly.CreateInstance(stateNode.Attributes.GetNamedItem("type").Value);
                    if (stateObj != null)
                    {
                        BaseState state = stateObj as BaseState;
                        state.name   = stateNode.Attributes.GetNamedItem("name").Value;
                        state.curFSM = bfsm;
                        int duration = 0;
                        int.TryParse(stateNode.Attributes.GetNamedItem("duration").Value, out duration);
                        state.durationTick = duration;
                        switch (state.type)
                        {
                        case EStateType.EStateType_LoginEntiy:
                        {
                        }
                        break;

                        case EStateType.EStateType_EntityAnimation:
                        {
                            EntityAnimationState animState = state as EntityAnimationState;
                            animState.animantioName = stateNode.Attributes.GetNamedItem("AnimationType").Value;
                            float speed = 0;
                            float.TryParse(stateNode.Attributes.GetNamedItem("AnimationSpeed").Value, out speed);
                            animState.animationSpeed = speed;
                            int loopCount = 0;
                            int.TryParse(stateNode.Attributes.GetNamedItem("loopCount").Value, out loopCount);
                            animState.loopCount = loopCount;
                        }
                        break;
                        }
                        for (int j = 0; j < stateNode.ChildNodes.Count; j++)
                        {
                            XmlNode linkNode = stateNode.ChildNodes[j];
                            object  linkObj  = assembly.CreateInstance("StateLink");
                            if (linkObj != null)
                            {
                                StateLink link    = linkObj as StateLink;
                                object    linkKey = Enum.Parse(typeof(EActionType), linkNode.Attributes.GetNamedItem("actionId").Value);
                                if (linkKey != null)
                                {
                                    link.linkID        = (int)linkKey;
                                    link.linkStateName = linkNode.Attributes.GetNamedItem("linkStateName").Value;
                                    state.links.Add((int)linkKey, link);
                                }
                            }
                            bfsm.AddStateNode(state);
                        }
                    }
                }
            }
            object defaultNode = bfsm.FindChildState(fsmNode.Attributes.GetNamedItem("defaultNode").Value);
            if (defaultNode != null)
            {
                bfsm.defaultNode = defaultNode as BaseState;
            }
            //设置连接关系
            //foreach (XmlNode stateNode in fsmNode.ChildNodes)
            for (int i = 0; i < stateNodes.Count; i++)
            {
                XmlNode   stateNode = stateNodes[i];
                BaseState state     = bfsm.FindChildState(stateNode.Attributes.GetNamedItem("name").Value);
                object    outstate  = bfsm.FindChildState(stateNode.Attributes.GetNamedItem("outState").Value);
                if (outstate != null)
                {
                    state.timeOutState = outstate as BaseState;
                }
            }
            //添加到FSM表
            m_fsmTemplates[bfsm.name] = bfsm;
        }
    }
示例#22
0
 public override void Act(BaseFSM FSM)
 {
     FSM.PlayAnimation("Run");
     FSM.controller.Move(FSM.characterStatus.moveSpeed, FSM.characterStatus.jumpSpeed);
 }
    public override void Reason(BaseFSM FSM)
    {
        if ((Mathf.Abs(Input.GetAxis("Horizontal")) > 0.5 || Mathf.Abs(Input.GetAxis("Vertical")) > 0.5))
        {
            FSM.PerformTransition(FSMTransitionType.CanBeMove);
        }


        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonUp("PickUp") && FSM.isFound)
        {
            FSM.picked = true;
            FSM.PerformTransition(FSMTransitionType.CanPickUp);
        }


        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && (FSM.characterStatus.weaponType == WeaponType.Sword || FSM.characterStatus.weaponType == WeaponType.Club))
        {
            FSM.Attacked = true;

            FSM.PerformTransition(FSMTransitionType.AttackWithSingleWield);
        }

        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.DoubleHands)
        {
            FSM.Attacked = true;
            FSM.PerformTransition(FSMTransitionType.AttackWithDoubleHands);
        }


        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.Ripple)
        {
            FSM.PerformTransition(FSMTransitionType.UsingRipple);
        }

        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.HeartAttack)
        {
            FSM.PerformTransition(FSMTransitionType.UsingHeartAttack);
        }

        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.StygianDesolator)
        {
            FSM.PerformTransition(FSMTransitionType.UsingStygianDesolator);
        }

        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.IceArrow)
        {
            FSM.PerformTransition(FSMTransitionType.UsingIceArrow);
        }

        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.ChoshimArrow)
        {
            FSM.PerformTransition(FSMTransitionType.UsingChoshimArrow);
        }

        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.NULL && FSM.characterStatus.magicType == MagicType.Thunderbolt)
        {
            FSM.PerformTransition(FSMTransitionType.UsingThunderBolt);
        }

        if (!EventSystem.current.IsPointerOverGameObject() && Input.GetButtonDown("Fire1") && FSM.characterStatus.weaponType == WeaponType.Spear)
        {
            FSM.Attacked = true;
            FSM.PerformTransition(FSMTransitionType.AttackWithSpear);
        }
        if (FSM.transform.position.y > 10)
        {
            FSM.PerformTransition(FSMTransitionType.Falling);
        }
    }
示例#24
0
 public override bool HandleTrigger(BaseFSM fsm)
 {
     return(fsm.playerTF.GetComponent <CharacterStatus>().HP <= 0);
 }
示例#25
0
 public override bool HandleTrigger(BaseFSM fsm)
 {
     return(fsm.IsPatrolComplete);
 }
示例#26
0
 /// <summary>
 /// 进入状态时
 /// </summary>
 /// <param name="fsm"></param>
 public abstract void EnterState(BaseFSM fsm);
示例#27
0
 public override void Act(BaseFSM FSM)
 {
     MessageCenter.AddListener(EMessageType.UseItem, (object obj) => { itemID = (int)obj; });
     FSM.GetComponent <PlayerBag>().UseItem(itemID);
 }
示例#28
0
 /// <summary>
 /// 离开状态时
 /// </summary>
 /// <param name="fsm"></param>
 public abstract void ExitState(BaseFSM fsm);
示例#29
0
 public override void ExitState(BaseFSM fsm)
 {
     //停止移动
     fsm.StopMove();
 }
示例#30
0
 /// <summary>
 /// 持续状态时,执行的主要行为
 /// </summary>
 /// <param name="fsm"></param>
 public abstract void Action(BaseFSM fsm);