/******************************************************************************** * 文件名: 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(); } //自动寻路点缓存 public List 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; } }