Ejemplo n.º 1
0
 private void Awake()
 {
     Target       = GameObject.FindGameObjectWithTag("Player").transform;
     Agent        = GetComponent <NavMeshAgent>();
     MonsterStats = GetComponent <Monster>();
     stateMachine = GetComponent <MonsterStateMachine>();
     InitializeStateMachine();
 }
Ejemplo n.º 2
0
 public override void Init()
 {
     if (bInit)
     {
         return;
     }
     base.Init();
     m_machine = GetComponent <MonsterStateMachine>();
     bInit     = true;
 }
Ejemplo n.º 3
0
    private void Start()
    {
        Debug.Log("GSM start");
        player = GameObject.FindGameObjectWithTag("Player").GetComponent <PlayerStateMachine>();
        GameObject monsterGo = GameObject.FindGameObjectWithTag("Monster");

        if (monsterGo)
        {
            monster = monsterGo.GetComponent <MonsterStateMachine>();
        }

        currentAction = Action.START;
    }
Ejemplo n.º 4
0
 // 通知去移除实体
 private void ReleaseEntity()
 {
     if (m_pFSM)
     {
         U3D_Render.EntityView objev = EntityFactory.getEntityViewByID(m_pFSM.entityID);
         if (objev != null)
         {
             //Trace.Log("Release Monster,ID:" + objev.ID);
             EntityFactory.ReleaseEntity(objev);
             m_pFSM = null;
         }
     }
 }
Ejemplo n.º 5
0
        private void ApplyMonsterSkinDataToMachine(MonsterStateMachine machine, SkinInstance instance)
        {
            MonsterSkinConfig SkinConfig = instance.entitySkinConfig as MonsterSkinConfig;

            if (null == SkinConfig)
            {
                Debug.LogError("切换皮肤重大错误-ApplyMonsterSkinDataToMachine");
                return;
            }

            machine.animator = instance.MainAnimator;
            machine.RefershAnimatorDataWhenSkinChangedFinish();
            instance.ReferencedSkinCtrl = this;
        }
Ejemplo n.º 6
0
    //button hien thi ten enemy de thuc hien chon lua
    void EnemyButtons()
    {
        //duyet list mosnter co trong battle
        foreach (GameObject monster in MonsterInBattle)
        {
            //tao 1 button
            GameObject newButton = Instantiate(enemyButton) as GameObject;
            //get component enemyselectbutton cua newButton
            EnemySelectButton button = newButton.GetComponent <EnemySelectButton>();
            //get MSM cua phan tu trong list
            MonsterStateMachine current_monster = monster.GetComponent <MonsterStateMachine>();
            //get text cua new button
            Text buttonText = newButton.transform.Find("Text").gameObject.GetComponent <Text>();
            //set text la ten cua phan tu monster hien tai
            buttonText.text = current_monster.monster.name;

            button.enemyPrefabs = monster;

            newButton.transform.SetParent(spacer, false);
        }
    }
Ejemplo n.º 7
0
 // 构造
 public MonsterState_Standing(MonsterStateMachine pFsm)
 {
     m_pFSM = pFsm;
 }
Ejemplo n.º 8
0
    // 更新状态逻辑
    public void Update()
    {
        if (!isOnThisState)
        {
            return;
        }
        if (m_pFSM.bIsForceMoving || m_pFSM.m_bForceFlighting || m_pFSM.bPauseMachineUpdate)
        {
            return;
        }
        if (!m_pFSM.creaturePropety)
        {
            return;
        }

        //建筑不会移动
        if (m_pFSM.creaturePropety.GetNumProp(ENTITY_PROPERTY.PROPERTY_SEX) == (int)MONSTER_TYPE.MONSTER_TYPE_TOWER)
        {
            return;
        }
        Vector3 deltapos = m_pFSM.syncPosition - m_pFSM.transform.position;
        float   deltadis = deltapos.magnitude;

        if (deltadis < 0.01f)
        {
            return;
        }

        float deltatime   = Time.deltaTime;
        int   smoothlevel = EntityFactory.Instance.smoothlevel;
        float apprfactor1 = EntityFactory.Instance.apprfactor1;
        float apprfactor2 = EntityFactory.Instance.apprfactor2;



        Vector3 curPos;

        if (smoothlevel == 2)
        {
            int vavyingframe = EntityFactory.Instance.vavyingFrame;

            Vector3 advance    = m_pFSM.syncVelocity.magnitude * deltapos.normalized * deltatime;
            float   advancedis = advance.magnitude;

            bool bRun = advancedis > 0.001f && m_pFSM.GetAnimatorBool("isRun");

            if (bRun)
            {
                if (runframecount < 0)
                {
                    runframecount = 0;
                }
                runframecount++;
                if (runframecount > 9999)
                {
                    runframecount = 9999;
                }
            }
            else
            {
                if (runframecount > 0)
                {
                    runframecount = 0;
                }
                runframecount--;
                if (runframecount < -9999)
                {
                    runframecount = -9999;
                }
            }
            int absrunframecount = Mathf.Abs(runframecount);

            if (deltadis > 10.0f || deltadis < 0.1f)  //太远或者太近直接拉
            {
                curPos = m_pFSM.syncPosition;
            }
            else if (runframecount < -vavyingframe)  //稳定静止状态,已经停下来有vavyingframe帧,没走路情况只能直接拉
            {
                curPos        = m_pFSM.syncPosition;
                currappfactor = apprfactor2;
            }
            else if (runframecount >= -vavyingframe && runframecount < 0)  //正在停下来的情况都用逼近公式2,apprfactor2趋于极限(同步点)时收敛速度更快
            {
                float deltafactor = Mathf.Abs(apprfactor2 - apprfactor1) / (float)vavyingframe;
                currappfactor += deltafactor;
                currappfactor  = Mathf.Clamp(currappfactor, apprfactor1, apprfactor2);
                curPos         = m_pFSM.syncPosition * currappfactor + m_pFSM.transform.position * (1 - currappfactor);
            }
            else if (runframecount > 0 && runframecount <= vavyingframe)  //正在起步情况都用逼近公式2,apprfactor2趋于极限(同步点)时收敛速度更快
            {
                float deltafactor = Mathf.Abs(apprfactor2 - apprfactor1) / (float)vavyingframe;
                currappfactor -= deltafactor;
                currappfactor  = Mathf.Clamp(currappfactor, apprfactor1, apprfactor2);
                curPos         = m_pFSM.syncPosition * currappfactor + m_pFSM.transform.position * (1 - currappfactor);
            }
            else //稳定走路情况或临时停下来情况
            {
                if (advancedis * 0.5f > deltadis) //走路的最后一步,不足半个步长
                {
                    curPos = m_pFSM.syncPosition;
                }
                else if (advancedis * 3.0f > deltadis && advancedis < deltadis) //处于走路动作且3个步长内能走远到同步位置的距离,用普通走路公式
                {
                    curPos = m_pFSM.transform.position + advance;
                }
                else //否则,存在较大误差,比如时间轴缩放了,余下情况都用逼近公式1
                {
                    curPos = m_pFSM.syncPosition * apprfactor1 + m_pFSM.transform.position * (1 - apprfactor1);
                }
                currappfactor = apprfactor1;
            }
        }
        else if (smoothlevel == 1)
        {
            if (deltadis > 10.0f || deltadis < 0.1f)  //太远或者太近直接拉
            {
                curPos = m_pFSM.syncPosition;
            }
            else
            {
                curPos = m_pFSM.syncPosition * apprfactor2 + m_pFSM.transform.position * (1 - apprfactor2);
            }
        }
        else
        {
            curPos = m_pFSM.syncPosition;
        }

        if (m_pFSM.GetVisible())
        {
            curPos = MonsterStateMachine.CorrectPosFromPhysic(curPos, m_pFSM.creaturePropety.CreatureHeightInMeters + 2, GroundedCheckDistance);
        }
        m_pFSM.SetPosition(curPos);

        Quaternion ate      = Quaternion.Euler(m_pFSM.syncAngles);
        Vector3    movDir   = ate * Vector3.forward;
        Vector3    ptTarget = curPos + movDir * 10;

        m_pFSM.LookAtPoint(m_pFSM.CorrectLookAtPoint(ptTarget));

        return;
    }
Ejemplo n.º 9
0
 // Start is called before the first frame update
 private void Awake()
 {
     msm  = GetComponent <MonsterStateMachine>();
     mb   = GetComponent <MonsterBrain>();
     anim = GetComponentInChildren <Animator>();
 }
Ejemplo n.º 10
0
    // Update is called once per frame
    void Update()
    {
        switch (battleState)
        {
        //truong hop battle dang trong trang thai wait
        case PerformAction.WAIT:
            //neu list hanh dong can thuc hien > 0
            if (PerformList.Count > 0)
            {
                //chuyen trang thai ve tackeaction
                battleState = PerformAction.TAKEACTION;
            }
            break;

        //truong hop battle dang trong trang thai takeaction
        case PerformAction.TAKEACTION:
            //tim gameobject co ten la ten phan tu dau tien trong list thuc hien
            GameObject performer = GameObject.Find(PerformList[0].attacker);
            //neu ng thuc hien thuoc type monster
            if (PerformList[0].type == "Monster")
            {
                //get component MSM cua no
                MonsterStateMachine MSM = performer.GetComponent <MonsterStateMachine>();

                MSM.playerToAttack = PerformList[0].AttackersTarget;
                //chuyen trang thai cua monster sang action
                MSM.currentState = MonsterStateMachine.TurnState.ACTION;
            }
            else if (PerformList[0].type == "Player")
            {
                HeroStateMachine HSM = performer.GetComponent <HeroStateMachine>();
                HSM.enemyToAttack = PerformList[0].AttackersTarget;
                HSM.currentState  = HeroStateMachine.TurnState.ACTION;
            }
            //chuyen trang thai cua battle sang perform action
            battleState = PerformAction.PERFORMACTION;
            break;

        case PerformAction.PERFORMACTION:
            break;
        }

        switch (playerInput)
        {
        case PlayerGUI.ACTIVATE:
            //neu player quan li > 0
            if (PlayerToManager.Count > 0)
            {
                //tim gameobject selector va set active = true
                PlayerToManager[0].transform.Find("selector").gameObject.SetActive(true);
                //tao moi 1 handler turn
                playerChoice = new HandleTurn();
                //hien thi attack panel
                AttackPanel.SetActive(true);
                //chuyen trang thai playerGUI ve waiting
                playerInput = PlayerGUI.WAITING;
            }
            break;

        case PlayerGUI.WAITING:
            break;

        case PlayerGUI.DONE:
            //thuc hien ham PlayerInputDone()
            PlayerInputDone();
            break;
        }
    }
Ejemplo n.º 11
0
 private void ClearMonsterSkinDataFromMachine(MonsterStateMachine machine)
 {
     m_machine.animator = null;
 }
Ejemplo n.º 12
0
 void Start()
 {
     mb  = GetComponent <MonsterBrain>();
     msm = GetComponent <MonsterStateMachine>();
 }
Ejemplo n.º 13
0
 public MonsterState_Dead(MonsterStateMachine pFsm)
 {
     m_pFSM = pFsm;
 }