//广播 本身坐标和向量坐标
        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 async ETVoid StartMove(M2C_KeyboardPosition message)
        {
            // 取消之前的移动协程
            this.CancellationTokenSource?.Cancel();
            this.CancellationTokenSource = new CancellationTokenSource();

            this.Path.Clear();
            for (int i = 0; i < message.Xs.Count; ++i)
            {
                this.Path.Add(new Vector3(message.Xs[i], message.Ys[i], message.Zs[i]));
            }
            this.ServerPos = new Vector3(message.X, message.Y, message.Z);

            await StartMove(this.CancellationTokenSource.Token);

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