본문 바로가기
유니티

Day 26 - Player Input System을 이용한 이동 및 점프 구현

by shin0707 2024. 5. 14.
728x90

  • 주제

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

 

[Unity] New Input System #1 | 세팅하기

/* 수업 들으며 했던 내용들을 실습해보며 정리한 글입니다. 잘못된 부분이 있다면 말씀해주세요. */ 게임은 특정 플랫폼 하나만을 겨냥하고 개발하는 경우는 거의 없다. 스케일이 커지게 되면 PC

daekyoulibrary.tistory.com


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;
        }
    }
}

 

728x90
반응형