TIL 0322 최종 프로젝트 - 9 / 보스 이동

강성원·2024년 3월 24일
0

TIL 오늘 배운 것

목록 보기
55/70
post-thumbnail

공중 보스 이동 완성

공중 보스의 이동은 처음에 position 자체를 이동시키는 방식으로 진행했다.

자연스러운 움직임을 위해서 Lerp로 이동 값을 조정해줬지만 원하는 움직임이 나오지 않았다.
그래서 보스의 강체에 힘을 가해서 움직이는 방식으로 변경하였다.

이동 방식을 바꾸니 정지 거리를 임의로 하드코딩해야했던 부분도 제거할 수 있었고, 연출에서도 자연스러움을 얻을 수 있었다.

목표물 바라보기

  • 타겟 방향을 계산해서 쳐다보도록 하였다.
  • 타겟이 가까워질수록 X축 회전 각도가 너무 커져서 보스가 무슨 비석처럼 서있게 되는 문제가 생겼다.
    방향 계산과 오브젝트 회전처리 사이에 방향의 오일러 각도를 받아와서 x값만 40으로 제한해주는 처리를 하였다.
  • 코드
protected override void Look()
{
    // 타겟 방향 계산
    Vector3 targetDirection = (boss.Target.transform.position - boss.transform.position).normalized;
    Quaternion lookRotation = Quaternion.LookRotation(targetDirection);

    // 쿼터니언의 오일러 각도를 제한해준다.
    Vector3 euler = lookRotation.eulerAngles;
    euler.x = Mathf.Min(euler.x, 40f);

    // 나온 오일러 각도를 다시 방향으로
    lookRotation = Quaternion.Euler(euler);
    boss.transform.rotation = Quaternion.RotateTowards(boss.transform.rotation, lookRotation, 30 * Time.deltaTime);
}

목표물 따라가기

  • 목표물을 따라갈 때에는 AddForce메서드를 사용하여 정지 위치 (타겟의x, 보스의y, 타겟의z)로 향한다.

  • 정지 위치가 되면 힘을 가하지 않아 자연스럽게 정지한다.

  • 정지 위치와 가까워질 수록 가하는 힘이 적어지도록 하였다.

protected override void Move()
{
    // 이동 방향 벡터 계산
    Vector3 moveDirection = (StopPoint - boss.transform.position).normalized;

    float distanceToStopPoint = Vector3.Distance(boss.transform.position, StopPoint);

    float forceMagnitude = distanceToStopPoint / boss.Data.moveSpeed;

    forceMagnitude = Mathf.Clamp(forceMagnitude, 4, 10);

    // Rigidbody에 힘을 가해 이동
    boss.GetComponent<Rigidbody>().AddForce(moveDirection * forceMagnitude);
}

가하는 힘이 적어지게 하는 부분이 아직 많이 부족하다.. 연구 필요

목표물 따라가다 멈추기

위에서 말한 것 처럼 정지 위치를 지나가면 Move 메서드를 호출하지 않음으로 움직임을 멈추게 한다.

profile
개발은삼순이발

0개의 댓글