본문 바로가기
🌐 유니티 (Unity)

Day 27 - 플레이어를 둘러싼 적 생성(Mathf.Cos & Mathf.Sin)

by shin0707 2024. 5. 16.
728x90
반응형

  • 주제

>> 플레이어를 중심으로 원형을 그리며 포위하고 있는 적 생성

>> 적 비행기 방향 설정(플레이어를 바라봄)


  • 공부내용

1. 플레이어를 중심으로 원형을 그리며 포위하고 있는 적 생성

1-1. 360도를 적 비행기 수로 등분하여 배치(원형배치)

 

1-2. 현재 적 비행기가 배치될 각도를 계산하고 라디안으로 변환

: 삼각함수 Mathf.Cos 와 Mathf.Sin 을 사용하기 위해 각도를 라디안으로 변환시킴.

[변환방법] 각도 * Mathf.Deg2Rad(1도가 몇 라디안인지 나타내는 값)

 

1-3. 적 비행기의 위치 계산

Mathf.Cos 함수:  각도에 대한 삼각함수 코사인 값을 반환

(적 비행기가 x축으로 얼마나 멀리 떨어져 있는지를 나타낸다.

각도가 증가함에 따라 코사인 값은 1에서 -1까지 변화한다.

코사인 값이 0일 때, 즉 각도가 90도나 270도일 때, 적 비행기는 플레이어와 동일한 y축에 위치한다.)

 

Mathf.Sin 함수: 각도에 대한 삼각함수 사인 값을 반환

(적 비행기가 y축으로 얼마나 멀리 떨어져 있는지를 나타낸다.

각도가 증가함에 따라 사인 값은 1에서 -1까지 변화한다.

사인 값이 0일 때, 즉 각도가 0도나 180도일 때, 적 비행기는 플레이어와 동일한 x축에 위치한다.)

void GenerateEnemies()
{
    // 360도를 적 비행기 수로 등분하여 배치
    float angle = 360f / enemyCount;

    for (int i = 0; i < enemyCount; i++)
    {
        // 현재 각도 계산
        float currentAngle = i * angle;
        // 각도를 라디안으로 변환
        float radianAngle = currentAngle * Mathf.Deg2Rad;
        // 적 비행기의 위치 계산
        Vector2 enemyPos = player.position + new Vector3(Mathf.Cos(radianAngle), Mathf.Sin(radianAngle)) * radius;
        // 적 비행기 생성
        GameObject enemy = Instantiate(enemyPrefab, enemyPos, Quaternion.identity);
    }
}

2. 플레이어를 바라보도록 적 비행기 방향 설정

// 플레이어를 향하는 방향 벡터 계산
Vector2 direction = ((Vector2)player.position - enemyPos).normalized;

// 적 비행기의 방향 설정
enemy.transform.up = direction;

*벡터 = 크기 + 방향

player.position : 플레이어의 위치를 나타내는 벡터

enemyPos : 적 비행기의 위치를 나타내는 벡터(위에서 계산)

((Vector2)player.position - enemyPos).normalized : 적 비행기가 바라봐야할 방향

 

Q: player.position 앞에 Vector2가 추가된 이유?

A: 유니티 Transform은 3차원 벡터를 사용하므로,

3차원 벡터를 2차원 벡터로 변환하여 연산의 결과를 얻기 위함이다.

(산술 계산을 간소화하고 정확도를 높이기 위해)  

 

Q: normalized 함수를 사용한 이유?

A: 적 비행기가 바라봐야할 방향만 구하면 되므로,

normalized 함수를 사용하여 방향만 남기고 크기를 1로 만들어준다.(단위 벡터로 정규화)

728x90
반응형