- 주제
1. Player Input System이란?
2. 설정방법
3. Invoke Unity Events 사용하기
- 공부내용
1. Player Input System이란?
키보드나 마우스, 게임패드 등으로 부터 입력을 받아 처리하는데 유용하다.
이 기능을 이용하려면 Unity에서 설치가 필요하다.
Windows -> Package Manager -> 상단 Packages: Unity Registry로 변경 -> Input System 검색 -> 다운로드
-> 새로운 Input system을 적용하려면 다시 시작해야한다는 문구 -> Yes
2. Player Input System 설정 방법
① Input Actions 생성
Assets -> Create -> Input Actions ("RocketInputActions")
② Action Maps 생성
Input Actions (예: 'RocketInputActions') 더블 클릭 -> All Control Schemes -> Add Control Scheme
-> Scheme Name 설정 -> + 입력받을 기기 선택 -> Save
③ Action Maps 생성 (예: 'Player') -> Actions 생성 (예: 'Move', 'Jump', 'Boost')
>>일련의 과정을 상세하게 설명한 사이트
https://daekyoulibrary.tistory.com/entry/Unity-New-Input-System-1
3. Invoke Unity Events 사용하기
'Invoke Unity Events' 동작은 Unity 이벤트 시스템을 이용하는 방식으로, 각 입력 액션에 UnityEvent를 연결하여 사용한다.
"Input" 이 아닌 "InputAction.CallbackContext" 를 매개변수에 추가하여 메서드를 구현해야 한다.
PlayerController.cs
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour
{
// Rigidbody2D 컴포넌트를 저장할 변수
private Rigidbody2D _rb2d;
// 플레이어의 이동 방향을 저장할 변수
private Vector2 _moveDirection;
// 플레이어가 점프 중인지 여부를 저장할 변수
private bool _isJumping;
// 기본 이동 속도
private readonly float SPEED = 5f;
// 점프할 때의 힘
private readonly float JUMP_FORCE = 10f;
// Awake 메서드는 스크립트가 활성화될 때 호출되며, 필요한 초기 설정을 수행함
private void Awake()
{
// Rigidbody2D 컴포넌트를 가져옴
_rb2d = GetComponent<Rigidbody2D>();
}
// FixedUpdate 메서드는 일정한 시간 간격으로 호출되며, 물리 연산을 처리함
private void FixedUpdate()
{
// 이동을 처리하는 메서드 호출
Move();
}
// OnMove 메서드는 이동 입력을 처리함
public void OnMove(InputAction.CallbackContext context)
{
// 이동 방향을 입력 값으로 설정
_moveDirection = context.ReadValue<Vector2>();
}
// OnJump 메서드는 점프 입력을 처리함
public void OnJump(InputAction.CallbackContext context)
{
// 점프 입력이 수행된 상태이고, 플레이어가 점프 중이 아닐 때
if (context.phase == InputActionPhase.Performed && !_isJumping)
{
// 점프 중으로 설정
_isJumping = true;
// Rigidbody2D에 위쪽 방향으로 힘을 가해 점프를 구현함
_rb2d.AddForce(Vector2.up * JUMP_FORCE, ForceMode2D.Impulse);
}
}
// Move 메서드는 플레이어의 이동을 처리함
private void Move()
{
// 이동 속도를 계산
Vector2 velocity = _moveDirection * SPEED;
// Rigidbody2D의 속도를 설정하여 이동을 구현함
_rb2d.velocity = new Vector2(velocity.x, _rb2d.velocity.y);
}
// OnCollisionEnter2D 메서드는 충돌이 발생했을 때 호출됨
private void OnCollisionEnter2D(Collision2D collision)
{
// 충돌한 오브젝트가 Ground 태그를 가지고 있을 때
if (collision.gameObject.CompareTag("Ground"))
{
// 점프 중이 아님으로 설정
_isJumping = false;
}
}
}
'유니티' 카테고리의 다른 글
Day 28 - OnBecameInvisible 메서드(화면을 벗어난 총알 제거) (0) | 2024.05.17 |
---|---|
Day 27 - 플레이어를 둘러싼 적 생성(Mathf.Cos & Mathf.Sin) (0) | 2024.05.16 |
Day 25 - 아크탄젠트(마우스 위치로 회전, 총알 발사 방향 설정 등) (0) | 2024.05.13 |
Day 24 - C# (인스턴스 생성자 예제 1, 2) (0) | 2024.05.11 |
Day 23 - 탑뷰게임 만들기(InputField) (0) | 2024.05.10 |