Files
JJBB/Assets/Project/Script/Player/AutoSearch/AutoSearchPath.cs

109 lines
3.6 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
/********************************************************************************
* AutoSearchPath.cs
* \Script\Player\AutoSearch\AutoSearchPath.cs
*
* 2014-01-02
*
*
* List中
*
*
* List中的头元素删除
*
*********************************************************************************/
using System.Collections.Generic;
using Games.Events;
using UnityEngine;
public class AutoSearchPath
{
public delegate void FinishCallBack(object param);
public const float stopRange = 1f;
public const float toNpcStopRange = 2f;
public float autoSearchRadius;
public object callBackParam;
public FinishCallBack finishCallBack;
//自动寻路目标ServerID
//自动寻路目标名字
//自动寻路结束事件
//当到达最后一个点之后触发
public AutoSearchPath()
{
AutoSearchPosCache = new List<AutoSearchPoint>();
}
//自动寻路点缓存
public List<AutoSearchPoint> AutoSearchPosCache { get; private set; }
public string AutoSearchTargetName { get; set; }
public int AutoSearchTargetID { get; set; }
public int AutoSearchTargetRoleID { get; set; } //寻路的中途发现更近的NPC可以切换到更近的这个
public GameEvent FinishCallBackEvent { get; set; }
public void AddPathPoint(AutoSearchPoint point)
{
AutoSearchPosCache.Add(point);
}
public void ResetPath()
{
AutoSearchPosCache.Clear();
if (null != FinishCallBackEvent)
FinishCallBackEvent.Reset();
AutoSearchTargetName = string.Empty;
autoSearchRadius = 0.0f;
finishCallBack = null;
callBackParam = null;
AutoSearchTargetRoleID = -1;
AutoSearchTargetID = -1;
}
//找到场景sceneId中第一个需要达到的点
public AutoSearchPoint GetPathPosition(int sceneId)
{
if (GameManager.gameManager.ActiveScene.IsCopyScene() //旧场景是副本(当前场景)
&& !GameManager.gameManager.ActiveScene.IsCopyScene(sceneId)) //新场景(将要切换的场景)不是副本
return new AutoSearchPoint(); //不返回空,需要自动寻路
for (var i = 0; i < AutoSearchPosCache.Count; ++i)
if (AutoSearchPosCache[i].SceneID == sceneId)
return AutoSearchPosCache[i];
//Debug.LogError("Return null");
return null;
}
//是否已经抵达路径点
public bool IsFinish(Vector3 pos)
{
return AutoSearchPosCache.Count < 2 && IsReachPoint(pos);
}
//是否到达寻路路径中的下一个目标点
//按照设计就是当前索引为0的点
public bool IsReachPoint(Vector3 pos)
{
if (AutoSearchPosCache.Count <= 0)
return false;
//先判断场景ID
if (AutoSearchPosCache[0].SceneID == GameManager.gameManager.RunningScene)
{
var destDistance = string.IsNullOrEmpty(AutoSearchTargetName) ? stopRange : toNpcStopRange;
destDistance = Mathf.Max(destDistance, autoSearchRadius);
var destPos = new Vector2(AutoSearchPosCache[0].PosX, AutoSearchPosCache[0].PosZ);
if ((destPos - pos.RemoveY()).sqrMagnitude < destDistance.ToSquare())
return true;
}
return false;
}
}