Input system
- New Input system이라고도 불리는 이 시스템은 UnityEngine.Input에서 Unity의 기존 입력 시스템을 대신하여 사용할 수 있으며, 확장성 높고 커스터마이징을 지원한다.
Input system 장점
- 크로스 플랫폼 호환성 : 다양한 플랫폼과 입력 장치에 대해 일관된 방식으로 작동한다.
- 리바인딩 : 플레이어가 게임 내에서 자신의 입력 설정을 변경할 수 있도록 지원한다.
- 멀티플레이어 지원 : 여러 플레이어가 동일한 장치에서 게임을 플레이하거나, 각각의 장치에서 게임을 플레이할 때 입력을 쉽게 처리할 수 있다.
Input system 핵심 개념
- Input Action: 입력 행동을 정의한다.
- Input Action Asset: 여러 개의 입력 행동을 그룹화하는 방법이다. = 재사용 가능한 입력 설정으로 다른 캐릭터나 메뉴에 적용 가능하다.
- Player Input Component: Unity의 New Input System에 추가된 새로운 컴포넌트로, 자동으로 입력 행동을 처리하고 해당 게임 오브젝트에 메시지를 보낸다.
New Input System package 사용법
1. Window > Package Manager 클릭
2. Packages가 In Project로 설정되어 있다면 Unity Registry 클릭
3. 검색해서 Input System을 검색하거나 내리다보면 Input System이 있는데 오른쪽 Install을 누르고 유니티 재부팅
4. 프로젝트 재 로드 후 Create > Input Actions 클릭
5. No Control Scheme > Add Control Scheme 클릭
6. Scheme Name 작성 > List is Empty + 클릭 > 나는 Keyboard와 Mouse만 쓸거라 두개 추가
= 이런 상태가 되어야 함
7. Move와 Look의 Type은 키가 입력되었을 경우 그 값을 어떤 타입으로 다루고 싶은지 선택하면 된다.
- 캐릭터의 이동방향과 마우스의 위치가 필요하기 때문에 Vector2
8. Move는 상하좌우로 움직이기 때문에 +를 눌러 2번째 옵션을 클릭해서 만들어준다.
- 물론 직접 바인딩 할 수 있지만 이미 있는건 써야지..
9. Move는 상하좌우로 움직이기 때문에 +를 눌러 2번째 옵션을 클릭해서 만들어준다.
- 저 네모친 작은부분을 누르면 키보드 입력 받은 값을 보여주는데 거기서 내가 원하는 값(W)을 클릭해서 선택하면 된다.
= 이런 상태가 되어야 함
10. Look은 Mouse의 Position으로 설정하면 된다.
Player Object에 연결된 것들
코드
- TopDownMovement.cs
using System;
using UnityEngine;
public class TopDownMovement : MonoBehaviour
{
// 실제로 이동이 일어날 컴포넌트
private TopDownController controller;
private Rigidbody2D movementRigidbody;
private Vector2 movementDirection = Vector2.zero;
// Awake는 주로 내 컴포넌트 안에서 끝나는거
private void Awake()
{
// controller랑 TopDownMovement랑 같은 GameObject에 있다라는 가정
controller = GetComponent<TopDownController>();
movementRigidbody = GetComponent<Rigidbody2D>();
}
private void Start()
{
controller.OnMoveEvent += Move;
}
private void Move(Vector2 direction)
{
movementDirection = direction;
}
private void FixedUpdate()
{
// FixedUpdate는 물리 업데이트 관련
// Rigidbody의 값을 바꾸니깐 FixedUpdate 사용
ApplyMovement(movementDirection);
}
private void ApplyMovement(Vector2 direction)
{
direction = direction * 5;
movementRigidbody.velocity = direction; // velocity 공부하기
}
}
- PlayerInputController.cs
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerInputController : TopDownController
{
private Camera camera;
private void Awake()
{
camera = Camera.main; // mainCamera 태그에 붙어있는 카메라를 가져온다.
}
public void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>().normalized;
CallMoveEvent(moveInput);
// 실제 움직이는 처리는 여기서 하는게 아니라 PlayerMovement에서 처리함.
}
public void OnLook(InputValue value)
{
Vector2 newAim = value.Get<Vector2>();
Vector2 worldPos = camera.ScreenToWorldPoint(newAim);
newAim = (worldPos - (Vector2)transform.position).normalized;
CallLookEvent(newAim);
}
}
- TopDownController.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TopDownController : MonoBehaviour
{
public event Action<Vector2> OnMoveEvent; // Action은 무조건 void만 반환, 아니면 Func
public event Action<Vector2> OnLookEvent;
public void CallMoveEvent(Vector2 direction)
{
OnMoveEvent?.Invoke(direction); // 없으면 말고 있으면 실행한다.
}
public void CallLookEvent(Vector2 direction)
{
OnLookEvent?.Invoke(direction);
}
}
기능 영상
참고 문서
> 공식 문서
> 공식 블로그
오늘의 회고
오늘 올린 내용이랑 이전 Input System 합쳐서 아마 Unity 관련 글로 올리지 않을까 싶다.
내가 찾아볼때 한번에 찾아보기 쉽도록...
사실 그러기 편하라고 지금도 엄청 자세하게 써놨는데 그러다보니깐 공부가 더 되는 것 같다.
무슨 TIL 쓰는데 강의 들을때보다 더 열심히 찾아보면서 쓰는건지..
일단 입력 시스템에는 내가 굉장히 많은 충격을 받았고..... 이런게 있는지 왜 다들 나한테는 말 안해준건지 나 유니티 처음 한다고 지금 따돌림 하는거지.... 휴
나는.... 지금까지 뭐 만들때 WASD 입력이 있어야하면 이 애들을 버튼으로 만들어서 애네들한테 클릭 이벤트를 다 붙여가지고 키보드 입력이 들어왔을때! x.position으로 몇 만큼 이동해라 이런식으로 하고 드래그앤 드롭해서 연결시켰는데..
어떻게 이렇게 편리한게 있었는데도..... 어떻게..... 아무도... 아무 유튜브 알고리즘도 나한테 추천을 안해줘....
아마 내가 모르는게 많을 것 같은데 이런 기본적인 것도 모르는데 어찌어찌 개발이 되는게 진짜 하드코딩러라고 느꼈다.... 많이 공부해야게따... ㅎ..ㅎ.ㅎ...
'Record > TIL' 카테고리의 다른 글
[Unity] 스크롤뷰 사용해서 참석인원 불러오기 (1) | 2024.05.13 |
---|---|
[Unity] 애니메이션 활용 (내가 만든 캐릭터로 게임 만들기) (2) | 2024.05.10 |
[Unity] Input.GetAxis (ps.WASD상하좌우 기본 컨트롤하기) (4) | 2024.05.08 |
[Unity] 팀프로젝트 던전 마무리 (2) | 2024.05.07 |
[Unity] 깊은 복사와 얕은 복사 (2) | 2024.05.03 |