private void Awake() { Target = GameObject.FindGameObjectWithTag("Player").transform; Agent = GetComponent <NavMeshAgent>(); MonsterStats = GetComponent <Monster>(); stateMachine = GetComponent <MonsterStateMachine>(); InitializeStateMachine(); }
public override void Init() { if (bInit) { return; } base.Init(); m_machine = GetComponent <MonsterStateMachine>(); bInit = true; }
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; }
// 通知去移除实体 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; } } }
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; }
//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); } }
// 构造 public MonsterState_Standing(MonsterStateMachine pFsm) { m_pFSM = pFsm; }
// 更新状态逻辑 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; }
// Start is called before the first frame update private void Awake() { msm = GetComponent <MonsterStateMachine>(); mb = GetComponent <MonsterBrain>(); anim = GetComponentInChildren <Animator>(); }
// 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; } }
private void ClearMonsterSkinDataFromMachine(MonsterStateMachine machine) { m_machine.animator = null; }
void Start() { mb = GetComponent <MonsterBrain>(); msm = GetComponent <MonsterStateMachine>(); }
public MonsterState_Dead(MonsterStateMachine pFsm) { m_pFSM = pFsm; }