zxl
/
CTT
forked from Cal/CTT
1
0
Fork 0
CTT/Server/Hotfix/Game/Helper/MoveHelper.cs

111 lines
3.9 KiB
C#
Raw Normal View History

2021-04-08 20:09:59 +08:00
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
namespace ET
{
public static class MoveHelper
{
public const float AtkDis = 2.7f * 2.7f;
2021-04-09 00:48:56 +08:00
public static ETTask<bool> MoveTo(Unit unit, Vector2 target, ETCancellationToken token = null)
{
2021-04-08 20:09:59 +08:00
UnitScene unitScene = unit.GetComponent<UnitScene>();
Vector2 pos = unitScene.Position;
2021-04-09 00:48:56 +08:00
int yAngle = pos.x <= target.x ? 0 : 180;
return MoveTo(unit, target, yAngle);
2021-04-08 20:09:59 +08:00
}
2021-04-09 00:48:56 +08:00
public static async ETTask<bool> MoveTo(Unit unit, Vector2 target, int yAngle, ETCancellationToken token = null)
2021-04-08 20:09:59 +08:00
{
try
{
2021-04-10 19:49:32 +08:00
UnitScene unitScene = unit.GetComponent<UnitScene>();
unitScene.targetPos = target;
unitScene.isMoved = true;
2021-04-09 00:48:56 +08:00
var ret = await FindPathMoveToAsync(unit, target, token);
2021-04-10 19:49:32 +08:00
unitScene.YAngle = yAngle;
unitScene.isMoved = false;
2021-04-09 00:48:56 +08:00
return ret;
//int index = 0;
//foreach (var u in team.GetUnits())
//{
// if (u.IsTransfer) continue;
// if (u.IsTeamLeader)
// {
// }
// else
// {
// await TimerComponent.Instance.WaitAsync(300);
// UnitScene unitScene = u.GetComponent<UnitScene>();
// Vector2 delta = CalucateDistanceXandY(unitScene.Position, target);
// Vector2 targetPos = new Vector2(target.x - delta.x * ++index, target.y - delta.y * index);
// FindPathMoveToAsync(u, targetPos, token).Coroutine();
// unitScene.YAngle = yAngle;
// }
//}
2021-04-08 20:09:59 +08:00
}
catch (Exception e)
{
Log.Error(e);
}
2021-04-09 00:48:56 +08:00
return false;
2021-04-08 20:09:59 +08:00
}
// 可以多次调用,多次调用的话会取消上一次的协程
2021-04-09 00:48:56 +08:00
public static async ETTask<bool> FindPathMoveToAsync(this Unit unit, Vector3 target, ETCancellationToken cancellationToken = null)
2021-04-08 20:09:59 +08:00
{
float speed = ConstDefine.MoveSpeed;
using var list = ListComponent<Vector3>.Create();
UnitScene unitScene = unit.GetComponent<UnitScene>();
list.List.Add(unitScene.Position);
list.List.Add(target);
// 广播寻路路径
M2C_PathfindingResult m2CPathfindingResult = new M2C_PathfindingResult
{
Id = unit.Id,
X = unitScene.X,
Y = unitScene.Y,
TX = target.x,
TY = target.y,
MoveSpeed = ConstDefine.MoveSpeed
};
var brocast = unit.GetComponent<BrocastComponent>();
brocast.Brocast(m2CPathfindingResult);
bool ret = await unit.GetComponent<MoveComponent>().MoveToAsync(list.List, speed, cancellationToken);
if (ret) // 如果返回false说明被其它移动取消了这时候不需要通知客户端stop
{
2021-04-09 00:48:56 +08:00
SendStop(unit, 0);
2021-04-08 20:09:59 +08:00
}
2021-04-09 00:48:56 +08:00
return ret;
2021-04-08 20:09:59 +08:00
}
public static void Stop(this Unit unit)
{
unit.GetComponent<MoveComponent>().Stop();
SendStop(unit, 0);
}
private static void SendStop(Unit unit, int error)
{
if (!unit.IsTeamLeader) return;
UnitScene unitScene = unit.GetComponent<UnitScene>();
var brocast = unit.GetComponent<BrocastComponent>();
brocast.Brocast(new M2C_Stop()
{
Error = error,
Id = unit.Id,
X = unitScene.X,
Y = unitScene.Y,
YAngle = unitScene.YAngle
});
}
}
}