//广播 本身坐标和向量坐标
        public static void BroadcastPath(this MapPathComponent self, List <Vector3> path, int index, int offset)
        {
            M2C_KeyboardPosition m2C_KeyboardPosition = new M2C_KeyboardPosition();
            Unit    unit    = self.GetParent <Unit>();
            Vector3 unitPos = unit.Position;

            m2C_KeyboardPosition.X  = unitPos.x;
            m2C_KeyboardPosition.Y  = unitPos.y;
            m2C_KeyboardPosition.Z  = unitPos.z;
            m2C_KeyboardPosition.Id = unit.Id;

            for (int i = 0; i < offset; ++i)
            {
                if (index + i >= self.ABPath.Result.Count)
                {
                    break;
                }
                Vector3 v = self.ABPath.Result[index + i];
                m2C_KeyboardPosition.Xs.Add(v.x);
                m2C_KeyboardPosition.Ys.Add(v.y);
                m2C_KeyboardPosition.Zs.Add(v.z);
            }
            MessageHelper.Broadcast(m2C_KeyboardPosition, unit.GetComponent <AoiUnitComponent>().playerIds.MovesSet.ToArray());

            Console.WriteLine(" UnitDirComponentHelper-82-MoveToClient:  " + m2C_KeyboardPosition.Id + " ( " + m2C_KeyboardPosition.X + ", " + m2C_KeyboardPosition.Y + ", " + m2C_KeyboardPosition.Z + ")");
        }
 public static async ETTask MoveAsync(this MapPathComponent 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);
     }
 }
        public static async ETVoid MoveTo(this MapPathComponent 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 <ABPathWrap, Vector3, Vector3>(unit.Position, new Vector3(target.x, target.y, target.z));
            pathfindingComponent.Search(self.ABPath);

            self.CancellationTokenSource?.Cancel();
            self.CancellationTokenSource = new CancellationTokenSource();

            //ToTo 同步到服务端 本身坐标和向量坐标
            await self.MoveAsync(self.ABPath.Result);

            self.CancellationTokenSource.Dispose();
            self.CancellationTokenSource = null;
        }