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

Day 25 - 아크탄젠트(마우스 위치로 회전, 총알 발사 방향 설정 등)

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

  • 주제

>> 아크탄젠트(예제 4개)

- 플레이어를 마우스 커서의 위치로 회전

- 총알을 설정된 방향으로 발사

- 적 캐릭터가 특정 타겟을 향해 회전하여 이동

- 랜덤한 방향으로 주변을 배회하는 캐릭터


  • 공부내용

>> 아크탄젠트는 언제 사용하는가?

두 오브젝트 간의 상호작용을 구현하기 위해 사용한다.

예를 들어, 플레이어와 마우스 두 오브젝트의 관계를 정의할 때,

마우스 커서의 위치에 따라 플레이어가 회전하는 코드를 구현하고 싶을 때 사용한다.

 

- 예제 1 : 플레이어를 마우스 위치로 회전시키기

플레이어의 위치와 마우스의 위치 사이의 방향을 계산하고, 이 방향의 각도를 구한 후, 

플레이어를 해당 각도로 회전시킨다.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    void Update()
    {
        // 플레이어 위치와 마우스 위치 사이의 방향 벡터 계산
        Vector3 direction = Input.mousePosition - Camera.main.WorldToScreenPoint(transform.position);
        
        // 방향 벡터를 각도로 변환하여 플레이어를 회전시킴
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
    }
}

- 예제 2 :  총알을 설정된 방향으로 발사하기

총알의 초기 방향을 설정하고, 이 방향의 각도를 계산하여 해당 방향으로 총알을 발사한다.

using UnityEngine;

public class BulletController : MonoBehaviour
{
    public float speed = 10f;

    void Start()
    {
        // 총알의 현재 방향을 계산
        Vector2 direction = new Vector2(1, 0); // 예시로 오른쪽 방향으로 설정
        
        // 방향 벡터를 각도로 변환하여 총알의 이동 방향을 설정
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
        GetComponent<Rigidbody2D>().velocity = Quaternion.Euler(0, 0, angle) * Vector2.right * speed;
    }
}

- 예제 3 : 적 캐릭터를 플레이어 위치로 이동시키기

using UnityEngine;

public class EnemyController : MonoBehaviour
{
    public Transform player;
    public float moveSpeed = 5f;

    void Update()
    {
        if (target != null)
        {
            // 플레이어와 자신의 위치 차이를 계산하여 방향 벡터를 구함
            Vector3 direction = player.position - transform.position;
            
            // 방향 벡터를 각도로 변환하여 플레이어를 향해 회전
            float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
            transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));

            // 플레이어 방향으로 이동
            transform.position += direction.normalized * moveSpeed * Time.deltaTime;
        }
    }
}

- 예제 4 : 랜덤한 방향으로 주변을 배회하는 캐릭터

using UnityEngine;

public class Wanderer : MonoBehaviour
{
    public float moveSpeed = 3f;
    private Vector3 randomDirection;
    
    void Start()
    {
        // 초기 랜덤 방향 설정
        RandomizeDirection();
    }

    void Update()
    {
        // 일정 시간마다 방향을 랜덤으로 변경
        if (Time.time % 2f < 0.1f) // 매 2초마다 변경 (캐릭터에 따라 조절 가능)
        {
            RandomizeDirection();
        }

        // 설정된 방향으로 이동
        transform.position += randomDirection.normalized * moveSpeed * Time.deltaTime;

        // 이동 방향으로 회전
        float angle = Mathf.Atan2(randomDirection.y, randomDirection.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
    }

    void RandomizeDirection()
    {
        // 랜덤 방향 설정
        randomDirection = new Vector3(Random.Range(-1f, 1f), Random.Range(-1f, 1f), 0f);
    }
}
728x90
반응형

loading