109 lines
3.6 KiB
C#
109 lines
3.6 KiB
C#
/********************************************************************************
|
||
* 文件名: 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;
|
||
}
|
||
} |