TIL 30 Input System

qkrrlcks00·2024년 10월 7일

Hierarchy 창에서 새로운 오브젝트를 만들고 F2를 누르면 Rename을 할수있다

빈 오브젝트를 만들면 습관처럼 Transform을 한번 Reset 시켜주면 좋다.

메인 카메라의 초기세팅인데, Z값이 -10이 되어있는 이유는
화면이 0에 위치해 있는데 카메라의 Z값도 0이라면 화면에 찍히는게
없어서 뒤에서 찍을수있도록 되있는것이다.

Solid Color는 배경색을 정해주는것이고
Orthographic은 2D 이미지라는것이고
Size는 세로의 반사이즈값을 말한다.

↑함수의 실행순서

Pixels Per Unit (PPU)

  • Pixels Per Unit (PPU): 스프라이트의 픽셀 수와 해당 스프라이트가 게임 세계에서 차지하는 공간의 관계를 설명합니다. 예를 들어, PPU가 100이라면 스프라이트의 100픽셀은 게임 세계에서 1 유니티 단위를 나타냅니다.
  • 스프라이트의 크기: PPU 값이 클수록 스프라이트는 작아집니다. 이는 더 많은 픽셀이 동일한 게임 세계의 공간에 매핑되기 때문입니다.
  • 물리 시뮬레이션: PPU 값은 물리 시뮬레이션에 영향을 미칩니다. 높은 PPU 값은 더 작은 스프라이트를 생성하므로, 이는 더 높은 해상도의 물리 시뮬레이션을 가능하게 합니다.
  • 퍼포먼스: 높은 PPU 값은 더 많은 연산을 필요로 합니다. 이는 성능에 영향을 미칠 수 있습니다. 따라서, 필요한 만큼의 PPU 값을 설정하는 것이 중요합니다.
  • 일관성: 모든 스프라이트에 대해 일관된 PPU 값을 사용하는 것이 좋습니다. 이는 스프라이트간의 크기 비율을 일정하게 유지하고, 물리적 행동의 일관성을 보장하는 데 도움이 됩니다.

계층 구조 ('Transform' 구조)

  • 각 게임 오브젝트는 Transform 컴포넌트를 가지고, Transform 컴포넌트는 게임 오브젝트의 위치, 회전, 및 크기(scale)를 정의합니다.
  • 게임 오브젝트는 다른 게임 오브젝트의 '자식'이 될 수 있습니다.
  • 부모 게임 오브젝트의 Transform이 변경되면(예: 이동, 회전, 크기 변경), 그 자식 오브젝트들의 Transform도 동일하게 적용됩니다.
  • 이렇게, 게임 오브젝트들 사이에 계층적인 관계가 형성되고 이를 '트리 구조'라고도 부릅니다.
  • 이 구조는 복잡한 씬을 구성하고 관리하는데 유용합니다. 예를 들어, 차량 게임 오브젝트 내부에 각각의 부품(바퀴, 핸들 등)을 자식 게임 오브젝트로 두면, 차량의 Transform이 변경될 때 각 부품들도 함께 움직입니다.
  1. 월드 좌표계(World Coordinate System): 월드 좌표계는 게임 세계의 전체적인 참조 프레임을 제공합니다. 이는 모든 게임 오브젝트가 공유하며, 월드 좌표계에서의 위치는 게임 환경 내에서 오브젝트의 절대적인 위치를 나타냅니다. 월드 좌표계는 변하지 않고 일정하게 유지됩니다. 스크립트에서는 position, rotation, lossyScale 를 통해 참조합니다.

  2. 로컬 좌표계 : 유니티에서 인스펙터창에서 볼 수 있는 position, scale, rotation 등이 로컬 좌표계에 따른 값에 해당합니다. 이는 월드 좌표계가 아닌 부모에 대한 좌표를 말하며, 부모에 대해 x축으로 2만큼 떨어져 있으면 이 오브젝트의 로컬 포지션은 (2, 0, 0)이 되는 것입니다.
    스크립트에서는 localPosition, localRotation, localScale 등이 있습니다.

Input.GetAxis

  • Input.GetAxis는 유니티의 입력 시스템에서 사용되는 메서드입니다.
  • 이 메서드는 입력 축의 값을 반환합니다.
  • 입력 축은 주로 키보드나 조이스틱과 같은 입력 장치의 입력을 나타냅니다.
  • GetAxis 메서드는 -1부터 1 사이의 값을 반환하는데, 입력 장치의 움직임에 따라 해당 값이 변경됩니다.
  • 값이 0에 가까울수록 입력이 없거나 중립 상태를 나타내며, 양수 값은 양 방향 입력을, 음수 값은 음 방향 입력을 나타냅니다.
  • GetAxis 메서드는 주로 플레이어의 움직임, 회전, 점프 등을 처리하는 데 사용됩니다.
  • 예를 들어, 수평 이동을 처리하는 경우, 좌우 화살키의 입력에 따라 Input.GetAxis("Horizontal")을 사용하여 좌우 방향의 값을 얻을 수 있습니다.
  • 이 값은 플레이어의 이동 속도나 회전 속도와 같은 변수에 적용하여 게임 오브젝트를 제어할 수 있습니다.

SerializeField

  • private로 선언된 변수를 인스펙터에서 직접 접근
  • 기본적으로 private 변수는 인스펙터에 표시되지 않지만, SerializeField를 사용하면 해당 변수가 인스펙터에서 수정 가능한 필드로 표시

GetAxis를 사용해보면 뭔가 한번에 멈추지 않고 미끄러지는 느낌을 받는데, 이때 GetAxisRaw를 사용하면 미끄러지는 느낌이 사라진다.

하지만 이렇게 GstAxis를 사용하게 되면 키를 변경하는 리바인딩이 힘들고 다양한 플랫폼에 대응하기 어려운 문제가 있고
입력 처리와 실제 로직 실행 주체가 분리가 안되있어, 클래스에 대한 확장성과 유지보수성이 많이 떨어지는 문제가 있다. 그래서
단일 책임 원칙을 지켜주기 위해 다음과 같은것을 배운다.

New Input System

    1. Input Action : 입력 행동을 정의합니다. 예를 들어 "점프", "공격" 등의 행동을 정의하고, 이러한 행동을 트리거하는 키 또는 버튼을 지정할 수 있습니다.
    1. Input Action Asset : 여러 개의 입력 행동을 그룹화하는 방법입니다. 이를 통해 재사용 가능한 입력 설정을 만들어 게임 내의 다른 캐릭터나 메뉴에 적용할 수 있습니다.
    1. Player Input Component : Unity의 New Input System에 추가된 새로운 컴포넌트로, 자동으로 입력 행동을 처리하고 해당 게임 오브젝트에 메세지를 보냅니다.

New Input System의 장점

    1. Cross-Platform Compatibility : New Input Systme은 다양한 플랫폼과 입력 장치에 대해 일관된 방식으로 작동합니다.
    1. Rebinding : 플레이어가 게임 내에서 자신의 입력 설정을 변경할 수 있도록 지원합니다.
    1. Multiplayer Support : 여러 플레이어가 동일한 장치에서 게임을 플레이하거나, 각각의 장치에서 게임을 할때 입력을 쉽게 처리할 수 있습니다.

Window - pakage manager - Input System 다운 후

Input Actions를 추가해주고


여기서 키보드랑 마우스를 추가해준다.
오류때문에 좌클릭은 안먹고 우클릭만 먹는다.

이제 플레이어를 추가하고
이동, 바라보는방향, 공격을 추가하고
Action Type을 Value로
Control Type을 Vector2로 맞춰준 후


+를 눌러보면 프리셋이 등록되어 있는데 저 버튼을 누르면


Up down Left Right가 추가되고, Binding 에 Path에서 원하는 키를 눌러 값을 할당할수 있고 keyboard - wasd를 할당했다.

바라보는 방향인 Look은 바인딩, 컴포지트가 필요없고 마우스 위치 그 자체가 2D Vector라서

그냥 마우스에 Path에서 Postion으로 바꿔주면 된다
공격도 마우스에서 Left Button으로 설정해줫다.

그후 Player를 만들고 Add Compoenent에서 Player Input을 추가하고 Actions에 방금 만든 Input Action을 추가해준다.

Action은 무조건 Void만 반환해야한다 아니면 Func

OnMoveEvent?.Invoke(direction) // ?. 없으면 말고 있으면 실행

쿼터니언(Quaternion)

유니티 인스펙터 창에서 나오는 회전은 Vector3로 표현되고, 이런 방법을 오일러각(Euler Angle)이라고 합니다. 하지만, 시중의 많은 3D 소프트웨어는 내부적으로 쿼터니언을 사용합니다.

  • Quaternion.Euler : 오일러각을 쿼터니언으로 변경할 수 있어요. (Quaternion.Euler(0f, 0f, 90f) → Quaternion으로 변환)
  • Quaternion.LookRotation : 머리를 회전하는 것처럼, 앞과 위를 특정한 방향으로 하는 회전 쿼터니언을 만들어요.
  • Quaternion.Slerp : 쿼터니언과 다른 쿼터니언 사이에 내분점을 알 수 있어요. 구형 보간(Spherical Linear Interpolation)기법을 활용해서 쿼터니언에 쓰면 더 정확해져요.

삼각함수 기초와 아크탄젠트

  • sin = 높이/빗변, cos = 밑변/빗변, tan = 높이/밑변

한 줄 요 약 : 삼각함수는 비율을 알기 위해 각도→비율을 구하는 함수, 탄젠트(tan)는 그중에서도 밑변과 높이의 비율

아크탄젠트란?

  • 삼각함수에서 아크(arc)-가 붙으면 삼각함수의 역함수인 역삼각함수를 말합니다. 각도→비율이었던게 비율→각도가 되는거죠! 즉, 아크탄젠트 함수는 삼각함수인 탄젠트의 역함수입니다. 가로와 세로의 비에 따른 각도를 계산하는 데 사용됩니다.
  • 2D에서 점 또는 벡터에 대한 각도를 찾는 데 아크탄젠트 함수가 종종 사용되는데…
  • 여기다가 개발자들이 편하게 쓸려고 한 가지를 더 추가합니다. 비율말고도 x, y자체가 양수인지 음수인지를 통해 360도를 다 구분해낼 수 있게 한 것이죠!
    (원래는 x, y가 같은 부호이지만 둘다 양수, 둘다 음수이거나 x, y가 다른 부호이지만 x가 음수이거나 y가 음수인 상황 때문에 아크탄젠트로는 180도 각도 범위에서만 알아낼 수 있었어요!)
    이러한 구현을 개발자들은 Atan2라고 이름 붙이고, 밑변 / 높이였던 탄젠트의 기본 개념을 적용해 y, x순으로 인수를 넣습니다.
  • 이를 통해 점 (x, y)에서, Math.Atan2(y, x) 함수를 사용하여 벡터가 x축과 이루는 각도를 [π,π][-\pi , \pi]까지의 값으로 얻을 수 있습니다.
    (각도를 π\pi가 180도가 되도록 표현하는 방법을 호도법, 그리고 그 단위를 라디안이라고 부릅니다.)
  • Atan2를 활용해서 객체가 특정 방향을 향하도록 만들거나 두 점 사이의 각도를 계산할 때 유용합니다.

0개의 댓글