// 从index找接下来3个点,广播 public static void BroadcastPath(this UnitPathComponent self, List <Vector3> path, int index, int offset) { Unit unit = self.GetParent <Unit>(); Vector3 unitPos = unit.Position; M2C_PathfindingResult m2CPathfindingResult = new M2C_PathfindingResult(); m2CPathfindingResult.X = unitPos.x; m2CPathfindingResult.Y = unitPos.y; m2CPathfindingResult.Z = unitPos.z; m2CPathfindingResult.Id = unit.Id; for (int i = 0; i < offset; ++i) { if (index + i >= self.RecastPath.Results.Count) { break; } Vector3 v = self.RecastPath.Results[index + i]; m2CPathfindingResult.Xs.Add(v.x); m2CPathfindingResult.Ys.Add(v.y); m2CPathfindingResult.Zs.Add(v.z); } MessageHelper.Broadcast(m2CPathfindingResult); }
public static void CancelMove(this UnitPathComponent self) { self.CancellationTokenSource?.Cancel(); self.CancellationTokenSource = null; self.TargetRange = 0; self.Target = Vector3.zero; if (self.BindState != null) { self.Entity.GetComponent <StackFsmComponent>().RemoveState(self.BindState.StateName); self.BindState = null; } if (self.NextState != null) { ReferencePool.Release(self.NextState); self.NextState = null; } Vector3 selfUnitPos = (self.Entity as Unit).Position; M2C_PathfindingResult pathfindingResult = new M2C_PathfindingResult() { X = selfUnitPos.x, Y = selfUnitPos.y, Z = selfUnitPos.z, Id = self.Entity.Id }; pathfindingResult.Xs.Clear(); pathfindingResult.Ys.Clear(); pathfindingResult.Zs.Clear(); MessageHelper.Broadcast(pathfindingResult); }
// 从index找接下来3个点,广播 public static void BroadcastPath(this UnitPathComponent self, List <Vector3> path, int index, int offset) { Unit unit = self.GetParent <Unit>(); Vector3 unitPos = unit.Position; M2C_PathfindingResult m2CPathfindingResult = new M2C_PathfindingResult(); m2CPathfindingResult.X = unitPos.x; m2CPathfindingResult.Y = unitPos.y; m2CPathfindingResult.Z = unitPos.z; m2CPathfindingResult.Id = unit.Id; MessageHelper.Broadcast(unit, m2CPathfindingResult); }
// 可以多次调用,多次调用的话会取消上一次的协程 public static async ETTask FindPathMoveToAsync(this Unit unit, Vector3 target, ETCancellationToken cancellationToken = null) { float speed = unit.GetComponent <NumericComponent>().GetAsFloat(NumericType.Speed); if (speed < 0.01) { unit.SendStop(-1); return; } using var list = ListComponent <Vector3> .Create(); unit.GetComponent <PathfindingComponent>().Find(unit.Position, target, list); List <Vector3> path = list; if (path.Count < 2) { unit.SendStop(0); return; } // 广播寻路路径 M2C_PathfindingResult m2CPathfindingResult = new M2C_PathfindingResult(); m2CPathfindingResult.Id = unit.Id; for (int i = 0; i < list.Count; ++i) { Vector3 vector3 = list[i]; m2CPathfindingResult.Xs.Add(vector3.x); m2CPathfindingResult.Ys.Add(vector3.y); m2CPathfindingResult.Zs.Add(vector3.z); } MessageHelper.Broadcast(unit, m2CPathfindingResult); bool ret = await unit.GetComponent <MoveComponent>().MoveToAsync(path, speed); if (ret) // 如果返回false,说明被其它移动取消了,这时候不需要通知客户端stop { unit.SendStop(0); } }
public virtual async ETTask M2C_PathfindingResultHandler(Scene scene, M2C_PathfindingResult message) { }