/// <summary> /// 查找目标。 /// </summary> private void FindTarget() { PlayerObj player = CoreEntry.gActorMgr.MainPlayer; if (player == null) { return; } //有任务在身时,判断任务位置 Vector3 selfpos = player.transform.position; int mid = 0; LogMgr.LogAI("AutoAIFindTarget.FindTarget"); if (TaskMgr.RunTaskType != 0 && !IsInDungeon()) { mid = TaskMgr.Instance.GetCurTargetMonsterId(); if (mid != 0) { const float RESET_DISTANCE = 5; //重新回到任务点距离 Vector3 pos = TaskMgr.Instance.goPos; float x = selfpos.x - pos.x; float z = selfpos.z - pos.z; if (x * x + z * z >= RESET_DISTANCE * RESET_DISTANCE) { LogMgr.LogAI("AutoAIFindTarget.FindTarget 离开任务目标位置太远,重新回去"); m_TargetPosition = pos; m_IsHaveTarget = true; return; } } } int mapid = MapMgr.Instance.EnterMapId; LuaTable cfg = ConfigManager.Instance.Map.GetMapConfig(mapid); ActorObj actor = player.FindTarget(cfg.Get <int>("autoFightRange"), mapid); if (actor != null) { //如果选择的不是当前怪物则忽略 if (mid != 0 && actor is MonsterObj) { MonsterObj monster = actor as MonsterObj; if (monster.ConfigID != mid) { return; } } m_TargetPosition = actor.transform.position; m_IsHaveTarget = true; return; } if (MapMgr.Instance.CurMapType == MapMgr.MapType.Map_CrossServer) { return; } //向服务器查询位置 if (WildQuery || IsInDungeon()) { //加载查询列表 if (m_QueryList.Count <= 0) { m_QueryList = GetSortedEntList(player.transform.position); m_QueryIndex = 0; } //开始查询 if (m_QueryList.Count > 0) { Vector3 pos = m_QueryList[m_QueryIndex]; m_QueryIndex = (m_QueryIndex + 1) % m_QueryList.Count; m_IsRequestPositon = true; m_QueryWaitCount = 5; NetLogicGame.Instance.SendQueryMonsterByPosition((int)(pos.x * 1000), (int)(pos.z * 1000)); LogMgr.LogAI("AutoAIFindTarget.FindTarget RequestPositon:{0}", pos); } else { LogMgr.LogAI("AutoAIFindTarget.FindTarget The QueryList is empty!"); } } else { LogMgr.LogAI("AutoAIFindTarget.FindTarget Can not find target."); } }