示例#1
0
        public static async ETTask MoveToAsync(this Unit unit, List <Vector3> path, ETCancellationToken cancellationToken = null)
        {
            float speed = unit.GetComponent <NumericComponent>().GetAsFloat(NumericType.Speed);

            if (speed < 0.01)
            {
                unit.SendStop(-1);
                return;
            }
            // 广播寻路路径
            M2C_PathfindingResult m2CPathfindingResult = new M2C_PathfindingResult();

            m2CPathfindingResult.Id = unit.Id;
            for (int i = 0; i < path.Count; ++i)
            {
                Vector3 vector3 = path[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);
            }
        }
示例#2
0
        // 从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);
        }
示例#3
0
        public async ETVoid StartMove(M2C_PathfindingResult 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]));
            }
            ServerPos = new Vector3(message.X, message.Y, message.Z);

            await StartMove(this.CancellationTokenSource.Token);

            this.CancellationTokenSource.Dispose();
            this.CancellationTokenSource = null;
        }
示例#4
0
        public static async ETVoid StartMove(this UnitPathComponent self, M2C_PathfindingResult message)
        {
            // 取消之前的移动协程
            self.ETCancellationToken?.Cancel();
            self.ETCancellationToken = new ETCancellationToken();

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

            self.ServerPos = new Vector3(message.X, message.Y, message.Z);

            await self.StartMove_Internal(self.ETCancellationToken);

            self.ETCancellationToken = null;
        }
示例#5
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.Domain.GetComponent <RecastPathComponent>().SearchPath(10001, unit.Position, target, list.List);

            List <Vector3> path = list.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.List.Count; ++i)
            {
                Vector3 vector3 = list.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);
            }
        }
示例#6
0
        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>();

            unit.Position = target;

            M2C_PathfindingResult m2CPathfindingResult = new M2C_PathfindingResult();

            m2CPathfindingResult.X  = unit.Position.x;
            m2CPathfindingResult.Y  = unit.Position.y;
            m2CPathfindingResult.Z  = unit.Position.z;
            m2CPathfindingResult.Id = unit.Id;
            MessageHelper.Broadcast(unit, m2CPathfindingResult);
        }
示例#7
0
        // 从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.ABPath.Result.Count)
                {
                    break;
                }
                Vector3 v = self.ABPath.Result[index + i];
                m2CPathfindingResult.Xs.Add(v.x);
                m2CPathfindingResult.Ys.Add(v.y);
                m2CPathfindingResult.Zs.Add(v.z);
            }
            MessageHelper.Broadcast(unit, m2CPathfindingResult);
        }