363 lines
12 KiB
C#
363 lines
12 KiB
C#
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<GameObject> m_CacheSignObjs = new List<GameObject>();
|
|
|
|
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<int> sweapeds = new List<int>();
|
|
|
|
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<Node>();
|
|
var Nodes = new List<Node>();
|
|
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<ObjManager>.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<ObjManager>.Instance.MainPlayer.NavAgent.path;
|
|
Singleton<ObjManager>.Instance.MainPlayer.NavAgent.CalculatePath(m_CurrDestentPos, path);
|
|
var lastPos = Vector3.zero;
|
|
var Pos = Vector3.zero;
|
|
Transform LastPoint = null;
|
|
var Shows = new List<GameObject>();
|
|
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<ObjManager>.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<ObjManager>.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<ObjManager>.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<Node> _Childs = new List<Node>();
|
|
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();
|
|
}
|
|
}
|
|
} |