using System.Collections; using System.Collections.Generic; using Games.Mission; using Games.Scene; using GCGame.Table; using UnityEngine; //主要是处理主角到某个点路径路标显示 public class RoadSignManager { public enum RoadType { None, Mission, Gharry } public int _LastChangeSceneType = (int) CG_REQ_CHANGE_SCENE.CHANGETYPE.TELEPORT; private float LastUpdateTime; private readonly List m_CacheSignObjs = new List(); private Vector3 m_CurrDestentPos = Vector3.zero; private float m_destentPosX = -1; private float m_destentPosZ = -1; private int m_destentSceneID = -1; private float m_LastInputTime; private int m_RoadTypeNumber; //标记当前的路标是哪个系统添加的 算法 RoadType*100000+index private GameObject SignCloneObj; private readonly List sweapeds = new List(); public RoadSignManager() { ShowSign = false; } public bool ShowSign { get; private set; } private int GetRoadTypeNumber(RoadType type, int index) { return (int) type * 100000 + index; } public void InitRoadSignData(RoadType type, int index, int desSceneID, float PosX, float PosZ) { m_RoadTypeNumber = GetRoadTypeNumber(type, index); m_destentSceneID = desSceneID; m_destentPosX = PosX; m_destentPosZ = PosZ; CreateRoadSign(); } public void AutoMoveStart() { if (GameManager.gameManager.AutoSearch.IsAutoSearching || m_CurrDestentPos == Vector3.zero) return; ShowSign = false; var point = new AutoSearchPoint(GameManager.gameManager.RunningScene, m_CurrDestentPos.x, m_CurrDestentPos.z); if (GameManager.gameManager && GameManager.gameManager.AutoSearch) { GameManager.gameManager.AutoSearch.BuildPath(point); var mission = GameManager.gameManager.MissionManager.GetMissionByType(MISSIONTYPE.MISSION_GUILDPAOSHANG); if (m_destentSceneID == GameManager.gameManager.RunningScene && mission != null && mission.m_yStatus == 1) { //判断当前任务是否需要寻找NPC提交 var missionDic = TableManager.GetMissionDictionaryByID(mission.m_nMissionID); if (missionDic != null) { var roleBase = TableManager.GetRoleBaseAttrByID(missionDic.CompleteNpcDataID); if (roleBase != null) GameManager.gameManager.AutoSearch.Path.AutoSearchTargetName = roleBase.Name; } } GameManager.gameManager.AutoSearch.Path.autoSearchRadius = 1.5f; if (m_RoadTypeNumber == GetRoadTypeNumber(RoadType.Gharry, 0)) GameManager.gameManager.AutoSearch.Path.finishCallBack = delegate { RoadStateChange(Vector3.zero); }; } ShowSign = true; } private void CreateRoadSign() { sweapeds.Clear(); if (SignCloneObj == null) InitSignGameObject(); if (GameManager.gameManager.RunningScene != m_destentSceneID) CreateNode(); else Start(m_destentPosX, m_destentPosZ); } private void InitSignGameObject() { LoadAssetBundle.Instance.LoadGameObject(LoadAssetBundle.BUNDLE_PATH_EFFECT, "tx_ui_lubiao", delegate(string assetName, GameObject resObj, Hashtable hashParam) { SignCloneObj = resObj; }, new Hashtable()); } private void FindPathOver(Node node) { if (node == null) return; var nextScene = -1; while (node != null) { if (node._Parent != null && node._Parent._sceneID == GameManager.gameManager.RunningScene) { nextScene = node._sceneID; break; } node = node._Parent; } if (nextScene == -1) return; var teles = TableManager.GetTeleport().Values; foreach (var tele in teles) if (tele.SrcSceneID == GameManager.gameManager.RunningScene && tele.DstSceneID == nextScene) Start(tele.SrcPosX, tele.SrcPosZ); } private bool CreateNode() { var LeafNodes = new List(); var Nodes = new List(); Nodes.Add(new Node(GameManager.gameManager.RunningScene, null)); while (Nodes.Count > 0) { for (var n = 0; n < Nodes.Count; n++) { var teles = TableManager.GetTeleport().Values; foreach (var tele in teles) if (tele.SrcSceneID == Nodes[n]._sceneID) { if (sweapeds.Contains(tele.DstSceneID)) //环路的处理 continue; sweapeds.Add(tele.DstSceneID); var node = new Node(tele.DstSceneID, Nodes[n]); LeafNodes.Add(node); if (tele.DstSceneID == m_destentSceneID) { FindPathOver(node); return true; } } } Nodes.Clear(); Nodes.AddRange(LeafNodes); LeafNodes.Clear(); } return true; } public void UpdateSign() { if (ShowSign == false || m_CurrDestentPos == Vector3.zero || LoadingWindow._IsLoadingScene) return; //需要处理多久玩家没操作 if (Input.touchCount > 0 || Input.anyKey || LoadingWindow._IsLoadingScene) { m_LastInputTime = Time.realtimeSinceStartup; } else if (m_LastInputTime + 8 < Time.realtimeSinceStartup) { m_LastInputTime = Time.realtimeSinceStartup; AutoMoveStart(); } if (Time.realtimeSinceStartup - LastUpdateTime < 0.5f) return; LastUpdateTime = Time.realtimeSinceStartup; if (Singleton.Instance.MainPlayer == null) return; if (SignCloneObj == null) { InitSignGameObject(); return; } ShowSignImage(); } private void ShowSignImage() { var pointId = 0; var totleDistanc = 0; var distance = 0f; var path = Singleton.Instance.MainPlayer.NavAgent.path; Singleton.Instance.MainPlayer.NavAgent.CalculatePath(m_CurrDestentPos, path); var lastPos = Vector3.zero; var Pos = Vector3.zero; Transform LastPoint = null; var Shows = new List(); for (var i = 0; i < path.corners.Length; i++) { if (i + 1 >= path.corners.Length) break; var start = path.corners[i]; var end = path.corners[i + 1]; var length = Vector3.Distance(start, end); while (distance < length) { // 最后一个点把长度保留到下一段路径 Pos = Vector3.Lerp(start, end, distance / length); GameObject SignGameObj = null; if (pointId < m_CacheSignObjs.Count) { SignGameObj = m_CacheSignObjs[pointId]; } else { SignGameObj = Object.Instantiate(SignCloneObj); SignGameObj.transform.SetParent(GameManager.gameManager.AutoSearch.transform); SignGameObj.transform.localScale = Vector3.one; m_CacheSignObjs.Add(SignGameObj); } pointId++; Shows.Add(SignGameObj); SignGameObj.transform.position = ActiveScene.GetTerrainPosition(Pos); if (LastPoint != null) LastPoint.LookAt(SignGameObj.transform); LastPoint = SignGameObj.transform; distance = distance + 3; totleDistanc += 3; if (totleDistanc > 20) break; } distance -= length; if (totleDistanc > 20) break; } for (var i = 0; i < m_CacheSignObjs.Count; i++) m_CacheSignObjs[i].SetActive(false); for (var i = 1; i < Shows.Count - 1; i++) Shows[i].SetActive(true); } public void OnDestroy() { Clearup(); for (var i = 0; i < m_CacheSignObjs.Count; i++) if (m_CacheSignObjs[i] != null) { Object.Destroy(m_CacheSignObjs[i]); m_CacheSignObjs[i].SetActive(false); } m_CacheSignObjs.Clear(); } private void Clearup() { m_destentSceneID = -1; m_destentPosX = -1; m_destentPosZ = -1; m_RoadTypeNumber = 0; if (GameManager.gameManager && GameManager.gameManager.AutoSearch) GameManager.gameManager.AutoSearch.Stop(); m_CurrDestentPos = Vector3.zero; ShowSign = false; for (var i = 0; i < m_CacheSignObjs.Count; i++) if (m_CacheSignObjs[i] != null) m_CacheSignObjs[i].SetActive(false); } public void Start(float Posx, float Posz) { m_CurrDestentPos = ActiveScene.GetTerrainPosition(new Vector3(Posx, 0, Posz)); ShowSign = true; UpdateSign(); AutoMoveStart(); } public void Stop(RoadType type, int index) { if (GetRoadTypeNumber(type, index) != m_RoadTypeNumber) return; Clearup(); } public void LeaveScene() { m_CurrDestentPos = Vector3.zero; if (ShowSign) GameManager.gameManager.AutoSearch.Stop(); } public void ChangeSceneOver() { if (ShowSign == false) return; //如果是传送点并且不是去寻找马车就不请求马车的位置 if (_LastChangeSceneType != (int) CG_REQ_CHANGE_SCENE.CHANGETYPE.TELEPORT || m_RoadTypeNumber == GetRoadTypeNumber(RoadType.Gharry, 0)) AskGharryPos(); } public void AskGharryPos() { var send = (CG_REQ_GHARRY_POS) PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_GHARRY_POS); send.Nilparam = 1; send.SendPacket(); } public void RoadStateChange(Vector3 gharryPos) { if (Singleton.Instance.MainPlayer == null) return; var mission = GameManager.gameManager.MissionManager.GetMissionByType(MISSIONTYPE.MISSION_GUILDPAOSHANG); if (mission == null || mission.m_yStatus != 1) return; var missionDic = TableManager.GetMissionDictionaryByID(mission.m_nMissionID); if (missionDic == null) return; var obj = Singleton.Instance.FindObjCharacterInScene(GameManager.gameManager.PlayerDataPool .nGharryObjID); if (obj == null && gharryPos == Vector3.zero) { AskGharryPos(); return; } if (obj != null) { gharryPos = obj.Position; gharryPos.y = GameManager.gameManager.RunningScene; } if ((int) gharryPos.y != GameManager.gameManager.RunningScene || Vector2.Distance(Singleton.Instance.MainPlayer.Position.RemoveY(), gharryPos.RemoveY()) > 4) GameManager.gameManager.AutoSearch.RoadSignManager.InitRoadSignData(RoadType.Gharry, 0, (int) gharryPos.y, gharryPos.x, gharryPos.z); else GameManager.gameManager.AutoSearch.RoadSignManager.InitRoadSignData(RoadType.Mission, mission.m_nMissionID, missionDic.CompleteNpcSceneID, missionDic.CompleteNpcPosX, missionDic.CompleteNpcPosZ); } public class Node { public List _Childs = new List(); public Node _Parent; public int _sceneID; public Node(int sceneID, Node Parent) { _sceneID = sceneID; _Parent = Parent; if (Parent != null) Parent._Childs.Add(this); _Childs.Clear(); } } }