2024-05-08

이재형·2024년 5월 8일
0
post-thumbnail

Unity(2D) 입문

배운 내용

1. Input System

public class TopDownController : MonoBehaviour
{
    public event Action<Vector2> OnMoveEvent;
    public event Action<Vector2> OnLookEvent;

    // 키보드를 움직일 때의 발생하는 이벤트
    public void CallMoveEvent(Vector2 direction)
    {
        OnMoveEvent?.Invoke(direction);
    }

    // 마우스를 움직일 때의 발생하는 이벤트
    public void CallLookEvent(Vector2 direction)
    {
        OnLookEvent?.Invoke(direction);
    }
}

public void OnMove(InputValue value)
{
    // 해당 value를 받아서 처리
    Vector2 moveInput = value.Get<Vector2>().normalized;
	CallMoveEvent(moveInput);
}

public void OnLook(InputValue value)
{
    Vector2 newAim = value.Get<Vector2>();

    // 월드 좌표를 화면 좌표로 변경하여 저장
    // 전체 위치가 아닌 에서의 위치로 봐야하기 때문에
    Vector2 worldPos = camera.ScreenToWorldPoint(newAim);

    // transform.position의 경우에는 Vector3이므로 Vector2로 변경 후 정규화
    newAim = (worldPos - (Vector2)transform.position).normalized;

    CallLookEvent(newAim);
}

private void Start()
{
    controller.OnLookEvent += OnAim;
}

private void OnAim(Vector2 direction)
{
    RotateArm(direction);
}

private void RotateArm(Vector2 direction)
{
    // Mathf.Atan()으로 해당 Radian값을 알아냄
    // Radian값에 Mathf.Rad2Def를 곱셈하여 Degree값으로 변환하여 사용
    float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

    // 절대값으로 전체 180도 중에 절반 90로 중심으로 좌우 반전을 시킴
    characterRenderer.flipX = Mathf.Abs(rotZ) > 90f;

    armPivot.rotation = Quaternion.Euler(0, 0, rotZ);
}


설명: 키보드, 마우스 말고 다른 콘솔 기기를 사용할 때 따로 지정하지 않고 사용할 수 있게 함
사용:
1. 각 기능에 관하여 델리게이트(Action)를 제네릭타입인 매개변수를 지정 후 생성 해준다.
2. 해당 Actions에 기능 Move, Look, Fire는 앞에 On을 붙여 메서드를 생성하여 매개변수로 해당 InputValue 타입을 받아 해당 값을 처리한다.
3. 후 다른 CS에서 해당 CS정보를 받아와서 구현 처리하는 메서드를 생성하고 해당 델리게이트에 추가 처리 해준다.


2. normalized(정규화)

public void OnMove(InputValue value)
{
    Vector2 moveInput = value.Get<Vector2>().normalized;
    CallMoveEvent(moveInput);
}

설명: 직선으로 가는 것이 아닌 대각선으로 방향 벡터를 표준화하여 길이를 1로 만들어 처리를 하기 쉽게 만드는 것이다.
사용: VectorValue.normalized;


3. 화면좌표와 월드좌표

// 월드 좌표를 화면 좌표로 변경하여 저장
// 전체 위치가 아닌 화면에서의 위치로 봐야하기 때문에
Vector2 worldPos = camera.ScreenToWorldPoint(newAim);

설명: 마우스의 경우에는 WorldSpace(월드좌표)에 있으므로 Camera의 ScreenToWorldPoint(벡터값)로 화면 좌표로 변경하여 마우스의 좌표로 다른 처리를 할 수있게 함
사용: camera.ScreenToWorldPoint(VectorValue);


4. Mathf.Atan2, Mathf.Rad2Deg

// Mathf.Atan()으로 해당 Radian값을 알아냄
// Radian값에 Mathf.Rad2Def를 곱셈하여 Degree값으로 변환하여 사용
float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

설명: 해당 스크립트를 Component한 객체가 다른 오브젝트와의 각도를 알아내기 위해 사용함
사용: Mathf.Atan2(VectorValue.y, VectorValue.x) * Mathf.Rad2Deg;


정리

배운 내용

1. Input System: 다른 콘솔의 사용처를 편하게 설정 할 수 있음
2. normalized: 방향 벡터의 길이를 1로 변경
3. camera.ScreenToWorldPoint(VectorValue): 월드 좌표를 화면좌표로 변경
4. Mathf.Atan2, Mathf.Rad2Deg: 해당 위치의 각도를 알아냄

해결 못한 문제

1. 없음

문제점

1. 없음

profile
한국사람

0개의 댓글