// 从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 async ETVoid MoveTo(this UnitPathComponent self, Vector3 target) { if ((self.Target - target).magnitude < 0.1f) { return; } self.Target = target; Unit unit = self.GetParent <Unit>(); PathfindingComponent pathfindingComponent = Game.Scene.GetComponent <PathfindingComponent>(); self.ABPath = ComponentFactory.Create <ETModel.ABPath, Vector3, Vector3>(unit.Position, new Vector3(target.x, target.y, target.z)); pathfindingComponent.Search(self.ABPath); Log.Debug($"find result: {self.ABPath.Result.ListToString()}"); self.CancellationTokenSource?.Cancel(); self.CancellationTokenSource = new CancellationTokenSource(); await self.MoveAsync(self.ABPath.Result); self.CancellationTokenSource.Dispose(); self.CancellationTokenSource = null; }
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); }
/// <summary> /// 移动到目标点,随后进入指定状态(如果有的话) /// </summary> /// <param name="self"></param> /// <param name="target"></param> /// <param name="bindState"></param> /// <param name="nextState"></param> /// <param name="targetRange">目标范围,当自身与目标位置小于等于此范围时,则停止寻路,进入NextState</param> /// <returns></returns> private static async ETVoid MoveTodoSomething(this UnitPathComponent self, Vector3 target, AFsmStateBase bindState, AFsmStateBase nextState = null, float targetRange = 0) { self.BindState = bindState; self.NextState = nextState; self.Target = target; self.TargetRange = targetRange; Unit unit = self.GetParent <Unit>(); RecastPathComponent recastPathComponent = Game.Scene.GetComponent <RecastPathComponent>(); RecastPath recastPath = ReferencePool.Acquire <RecastPath>(); recastPath.StartPos = unit.Position; recastPath.EndPos = new Vector3(target.x, target.y, target.z); self.RecastPath = recastPath; //TODO 因为目前阶段只有一张地图,所以默认mapId为10001 recastPathComponent.SearchPath(10001, self.RecastPath); //Log.Debug($"find result: {self.ABPath.Result.ListToString()}"); self.CancellationTokenSource?.Cancel(); self.CancellationTokenSource = new CancellationTokenSource(); await self.MoveAsync(self.RecastPath.Results); self.CancellationTokenSource.Dispose(); self.CancellationTokenSource = null; if (nextState != null) { self.Entity.GetComponent <StackFsmComponent>().ChangeState(nextState); } self.Entity.GetComponent <StackFsmComponent>().RemoveState(bindState.StateName); }
protected override void Run(ETModel.Session session, M2C_PathfindingResult message) { Unit unit = ETModel.Game.Scene.GetComponent <MonsterUnitComponent>().Get(message.Id); ///20190630 if (unit == null) { unit = ETModel.Game.Scene.GetComponent <UnitComponent>().Get(message.Id); } if (unit == null) { return; } //unit.GetComponent<AnimatorComponent>().SetFloatValue("Speed", 5f); ///20190803 unit.GetComponent <AnimatorComponent>().AnimSet(1.0f); UnitPathComponent unitPathComponent = unit.GetComponent <UnitPathComponent>(); unitPathComponent.StartMove(message).Coroutine(); GizmosDebug.Instance.Path.Clear(); GizmosDebug.Instance.Path.Add(new Vector3(message.X, message.Y, message.Z)); for (int i = 0; i < message.Xs.Count; ++i) { GizmosDebug.Instance.Path.Add(new Vector3(message.Xs[i], message.Ys[i], message.Zs[i])); } }
public static async ETVoid MoveTo_InternalWithOutStateChange(this UnitPathComponent self, Vector3 target) { if ((self.Target - target).magnitude < 0.1f) { return; } self.Target = target; Unit unit = self.GetParent <Unit>(); RecastPathComponent recastPathComponent = Game.Scene.GetComponent <RecastPathComponent>(); RecastPath recastPath = ReferencePool.Acquire <RecastPath>(); recastPath.StartPos = unit.Position; recastPath.EndPos = new Vector3(target.x, target.y, target.z); self.RecastPath = recastPath; //TODO 因为目前阶段只有一张地图,所以默认mapId为10001 recastPathComponent.SearchPath(10001, self.RecastPath); //Log.Debug($"find result: {self.ABPath.Result.ListToString()}"); self.ETCancellationTokenSource?.Cancel(); self.ETCancellationTokenSource = ComponentFactory.Create <ETCancellationTokenSource>(); await self.MoveAsync(self.RecastPath.Results); self.ETCancellationTokenSource.Dispose(); }
protected override async ETVoid Run(Session session, M2C_PathfindingResult message) { Unit unit = session.Domain.GetComponent <UnitComponent>().Get(message.Id); UnitPathComponent unitPathComponent = unit.GetComponent <UnitPathComponent>(); unitPathComponent.StartMove(message).Coroutine(); await ETTask.CompletedTask; }
/// <summary> /// 正常寻路,寻路完成后进入Idle状态 /// </summary> /// <param name="self"></param> /// <param name="target"></param> public static void CommonNavigate(this UnitPathComponent self, Vector3 target) { if (!self.Entity.GetComponent <StackFsmComponent>().ChangeState <NavigateState>(StateTypes.Run, "Navigate", 1)) { return; } IdleState idleState = ReferencePool.Acquire <IdleState>(); idleState.SetData(StateTypes.Idle, "Idle", 1); self.MoveTodoSomething(target, self.Entity.GetComponent <StackFsmComponent>().GetCurrentFsmState(), idleState).Coroutine(); }
protected override void Run(ETModel.Session session, M2C_PathfindingResult message) { Unit unit = ETModel.Game.Scene.GetComponent <UnitComponent>().Get(message.Id); UnitPathComponent unitPathComponent = unit.GetComponent <UnitPathComponent>(); unitPathComponent.StartMove(message).NoAwait(); GizmosDebug.Instance.Path.Clear(); GizmosDebug.Instance.Path.Add(new Vector3(message.X, message.Y, message.Z)); for (int i = 0; i < message.Xs.Count; ++i) { GizmosDebug.Instance.Path.Add(new Vector3(message.Xs[i], message.Ys[i], message.Zs[i])); } }
public static void Update(this UnitPathComponent self) { if (self.CancellationTokenSource != null && self.TargetRange >= 0 && Vector3.Distance((self.Entity as Unit).Position, self.Target) <= self.TargetRange) { self.CancellationTokenSource?.Cancel(); self.CancellationTokenSource = null; if (self.NextState == null) { return; } self.Entity.GetComponent <StackFsmComponent>().ChangeState(self.NextState); } }
protected override async ETTask Run(ETModel.Session session, M2C_PathfindingResult message) { Unit unit = UnitComponent.Instance.Get(message.Id); UnitPathComponent unitPathComponent = unit.GetComponent <UnitPathComponent>(); unitPathComponent.StartMove(message).Coroutine(); GizmosDebug.Instance.ClearData(message.Id); GizmosDebug.Instance.AddData(message.Id, new Vector3(message.X, message.Y, message.Z)); for (int i = 0; i < message.Xs.Count; ++i) { GizmosDebug.Instance.AddData(message.Id, new Vector3(message.Xs[i], message.Ys[i], message.Zs[i])); } await ETTask.CompletedTask; }
public static async ETTask MoveAsync(this UnitPathComponent self, List <Vector3> path) { if (path.Count == 0) { return; } // 第一个点是unit的当前位置,所以不用发送 for (int i = 1; i < path.Count; ++i) { // 每移动3个点发送下3个点给客户端 if (i % 3 == 1) { self.BroadcastPath(path, i, 3); } Vector3 v3 = path[i]; await self.Entity.GetComponent <MoveComponent>().MoveToAsync(v3, self.CancellationTokenSource.Token); } }
/// <summary> /// 寻路到某个点然后做某事,如果当前距离小于目标距离则直接进入状态,否则就寻路到适合的地点再进行寻路 /// </summary> /// <param name="self"></param> /// <param name="target">目标地点</param> /// <param name="targetRange">目标距离</param> /// <param name="targetState">目标状态</param> public static void NavigateTodoSomething(this UnitPathComponent self, Vector3 target, float targetRange, AFsmStateBase targetState) { if (Vector3.Distance((self.Entity as Unit).Position, target) >= targetRange) { if (!self.Entity.GetComponent <StackFsmComponent>().ChangeState <NavigateState>(StateTypes.Run, "Navigate", 1)) { ReferencePool.Release(targetState); return; } self.MoveTodoSomething(target, self.Entity.GetComponent <StackFsmComponent>().GetCurrentFsmState(), targetState, targetRange) .Coroutine(); } else { self.Entity.GetComponent <StackFsmComponent>().ChangeState(targetState); } }
protected override async ETTask Run(ETModel.Session session, M2C_PathfindingResult message) { Unit unit = ETModel.Game.Scene.GetComponent <UnitComponent>().Get(message.Id); unit.GetComponent <AnimatorComponent>().SetFloatValue("Speed", 5f); UnitPathComponent unitPathComponent = unit.GetComponent <UnitPathComponent>(); unitPathComponent.StartMove(message).Coroutine(); GizmosDebug.Instance.Path.Clear(); GizmosDebug.Instance.Path.Add(new Vector3(message.X, message.Y, message.Z)); for (int i = 0; i < message.Xs.Count; ++i) { GizmosDebug.Instance.Path.Add(new Vector3(message.Xs[i], message.Ys[i], message.Zs[i])); } await ETTask.CompletedTask; }