//移动 public override void MovePos(Vector3 pos) { //add by lzp if (!CoreEntry.GameStart) { return; } if (m_agent == null) { // Debug.LogError("NavMeshAgent is null"); return; } m_agent.enabled = true; if (m_agent.gameObject.activeSelf && m_agent.enabled)//为什么有时候是关闭的??add by Alex 20160606 { m_agent.SetDestination(pos); } m_dstPos = pos; //设置isRuning的时候,阻止update运行 m_isRuning = false; //开始移动 EventParameter param = EventParameter.Get(); param.goParameter = this.gameObject; m_eventMgr.TriggerEvent(GameEvent.GE_ACTOR_MOVE_BEGIN, param); //0.01秒后开始计算距离 Invoke("BeginRun", 0.01f); }
// Update is called once per frame void Update() { if (m_dstPos != Vector3.zero) { float distance = Vector3.Distance(m_transform.position, m_dstPos); Vector3 curDir = m_dstPos - m_transform.position; curDir.Normalize(); //方向点乘,防止走过头 float dot = Vector3.Dot(curDir, m_dstDir); if (distance <= 0.1f || dot < 0) { m_dstPos = Vector3.zero; //todo:移动到目的地 EventParameter param = EventParameter.Get(); param.goParameter = this.gameObject; m_eventMgr.TriggerEvent(GameEvent.GE_PLAYER_MOVE_END, param); //renwuzhixiangSetActive(false); return; } //移动 MoveToDir(m_dstDir); Debug.DrawLine(m_transform.position, m_dstPos, Color.red); } else { Debug.DrawLine(m_transform.position, m_dstPos, Color.red); } }
//移动 public override void MovePos(Vector3 pos) { //add by lzp if (!CoreEntry.GameStart) { return; } if (m_agent == null) { //Debug.LogError("NavMeshAgent is null"); return; } //计算路径点 m_agent.enabled = true; NavMeshPath path = new NavMeshPath(); m_listPath.Clear(); bool ret = m_agent.CalculatePath(pos, path); if (ret) { if (path.corners.Length < 2) { return; } for (int i = 0; i < path.corners.Length; ++i) { m_listPath.Add(path.corners[i]); } m_isRuning = true; m_startTime = Time.time; } else { //Debug.LogError("CalculatePath() error! pos="+m_transform.position.ToString("f4")); } m_agent.enabled = false; if (m_isRuning) { //开始移动 EventParameter param = EventParameter.Get(); param.goParameter = this.gameObject; m_eventMgr.TriggerEvent(GameEvent.GE_ACTOR_MOVE_BEGIN, param); } }
//加载非主角 void LoadMonster() { OneZoneData zoneData = m_gameDBMgr.GetAimPosZoneData(m_curMonsterGroupId, m_sceneMgr.curOpenZoneID); if (zoneData == null) { LogMgr.UnityError("Load zoneData error. mapid:" + m_curMonsterGroupId + " zoneid:" + m_sceneMgr.curOpenZoneID); return; } //add by lzp SetGuidSkill(); StartLoadMonster(); //所有的种怪 SpawnMonster[] monsters = m_gameDBMgr.GetSpawnMonsterInfo(m_curMonsterGroupId); for (int i = 0; i < monsters.Length; ++i) { if (!monsters[i].enable) { continue; } if (CurMonsterWaveSeq != monsters[i].waveSequence) { continue; } Vector3 pos = monsters[i].pos; //是否当前区域怪 if (zoneData != null && m_isLoadZone) { if (pos.x < zoneData.startPos.x || pos.x > zoneData.endPos.x || pos.z < zoneData.startPos.z || pos.z > zoneData.endPos.z) { continue; } } //刷怪时间扰动,避免所有怪一起刷新动作太整齐的问题 if (m_curWaveTriggerInfo.turbulenceTime > 0f) { m_TurbulenceSpawnMonsters.Add(monsters[i]); } else { SpawnActor(monsters[i]); } } //发送怪物被加载完了 m_eventMgr.TriggerEvent(GameEvent.GE_EVENT_AFTER_MONSTER_LOADED, null); if (m_TurbulenceSpawnMonsters.Count > 0) { InvokeRepeating("TurbulenceSpawnMonster", Random.Range(0f, m_curWaveTriggerInfo.turbulenceTime / m_TurbulenceSpawnMonsters.Count), m_curWaveTriggerInfo.turbulenceTime / m_TurbulenceSpawnMonsters.Count); } //m_bCurWaveLoaded = true; if (m_bWaveLoop == false && IsLoopMonsterAllDeath() == false) { m_bWaveLoop = true; TriggerLoopWave(); } // 下一波怪在这波开始时延时刷新情况 if (IsOpenZoneFinalWaveMonster() == false && (GetNextWaveTrigType() == WTC_TYPE.LASTWAVEBEGAN || GetNextWaveTrigType() == WTC_TYPE.ZONE)) { CurMonsterWaveSeq++; UpdateWaveTriggerInfo(); //m_bCurWaveLoaded = false; if (m_curWaveTriggerInfo.trigType == (int)WTC_TYPE.LASTWAVEBEGAN) { if (m_curWaveTriggerInfo.arg1 > 0) { StartDelayLoadMonster(); Invoke("DelaySpawnMonster", m_curWaveTriggerInfo.arg1); } else { LoadMonster(); } } else if (m_curWaveTriggerInfo.trigType == (int)WTC_TYPE.ZONE) { m_bNeedCheckZone = true; SetMonsterTips(true); } } }