벽에 막히는 대쉬를 구현하기위해 아래와 같이 작성하였다.
public async UniTaskVoid Rush(CancellationToken token)
{
float timer = 0f;
while (timer < duration)
{
Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
mouseWorldPos.z = 0f;
Vector3 playerPos = PlayerController.Instance.transform.position;
Vector3 targetDirection = (mouseWorldPos - playerPos).normalized;
smoothedDirection = Vector3.Lerp(smoothedDirection, targetDirection, Time.deltaTime * 2f);
RaycastHit2D hit = Physics2D.Raycast(playerPos, smoothedDirection, 1.5f, LayerMask.GetMask("Obstacle"));
if (hit.collider != null)
{
ObjectPoolManager.Instance.Return(this.gameObject, "MagicRush");
cts?.Cancel();
}
else
{
timer += Time.deltaTime;
PlayerController.Instance.transform.position += smoothedDirection * speed * Time.deltaTime / 2;
transform.position = PlayerController.Instance.transform.position;
}
await UniTask.Yield(token);
}
ObjectPoolManager.Instance.Return(this.gameObject, "MagicRush");
}
hit를 통해 벽에 닿으면 해당 비동기 실행이 멈추게하여 벽을 넘어가지 못하도록 구현.
또한 Vector3.Lerp를 통해 마우스 방향이 빠르게 바뀌어도 천천히 방향이 바뀌도록 구현하였다.