본문 바로가기

Project/도둑과 경호원

[도둑과 경호원] Unity: Guard 회전하기

728x90

이번에는 Guard가 이동하는 방향에 맞게 회전하는 것을 구현하겠다.

 

1
2
3
4
5
6
7
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Guard : MonoBehaviour
{
    public float turnSpeed = 90;

 

Guard 움직이기에서 turnSpeed를 추가로 선언해주면 된다.

  • turnSpeed - Guard가 회전하는 속도에 대한 값을 저장하는 변수이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
IEnumerator TurnToFace(Vector3 lookTarget)
    {
        Vector3 dirToLookTarget = (lookTarget - transform.position).normalized;
        float targetAngle = 90 - Mathf.Atan2(dirToLookTarget.z, dirToLookTarget.x) * Mathf.Rad2Deg;
 
        while(Mathf.Abs(Mathf.DeltaAngle(transform.eulerAngles.y, targetAngle)) > 0.05f)
        {
            float angle = Mathf.MoveTowardsAngle(transform.eulerAngles.y, targetAngle, turnSpeed * Time.deltaTime);
            transform.eulerAngles = Vector3.up * angle;
            yield return null;
        }
    }

 

dirToLookTarget을 구하여 Atan2를 사용하여 다음 waypoint까지의 각을 구한다. 그리고 DeltaAngle을 이용하여 transform.eulerAngles.y와 targetAngle의 차이가 0.05f 이하일 때까지 while문을 돌려주는데 이때 MoveTowardAngle을 통해서 transform.eulerAngles.y에서 targetAngle까지 turnSpeed * Time.deltaTime의 속도로 값을 반환해주고 반환한 값에 Vector3.up을 곱해주어 transform.eulerAngles로 설정해준다.

 

위의 코드를 전부 작성하였다면 Guard 움직이기에서 FollowPath IEnumerator에 다음의 코드를 추가시켜준다. 추가 위치는 yield return new WaitForSeconds(waitTime); 바로 밑에 추가해주면 된다.

 

1
yield return StartCoroutine(TurnToFace(targetWaypoint));

 

이렇게 코루틴 속에 또 다른 코루틴을 넣어주어서 Guard가 waypoint로 이동한 후에 TurnToFace 코루틴을 시작할 수 있게 해 주었다.

 

결과 화면

보기 편하게 OnDrawGizmos 함수를 사용하여 빨간색 선을 추가시켜주었다. 결과 화면에서 볼 수 있듯이 정상적으로 Guard가 회전하는 모습을 볼 수 있다.

 

Atan2에서 90도를 빼주는 것은 내가 생각했을 때 기준점을 만들어주어서 정상적으로 회전을 할 수 있게 해 주기 위한 것 같다. 그리고 게임을 만들 때 가장 수학이 많이 사용되는 것이 회전에 대해 다룰 때라고 생각한다. 오늘 코드에서의 수학은 가장 많이 쓰는 수학이니 모르는 부분이 있다면 유니티 개발자 홈페이지에 가서 공부해보기를 권장한다.

728x90