// 从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);
        }
Example #4
0
        // 可以多次调用,多次调用的话会取消上一次的协程
        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);
            }
        }
Example #5
0
 public virtual async ETTask M2C_PathfindingResultHandler(Scene scene, M2C_PathfindingResult message)
 {
 }