오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 21일차(유니티 강의 5주차)

2023. 11. 27. 13:31스파르타코딩클럽 게임개발

반응형

오늘은 새로이 배운 Input System을 소개해보겠다.

  • New Input System
    New Input System의 핵심 개념들
    1. Input Action: 입력 행동을 정의합니다. 예를 들어 "점프", "공격" 등의 행동을 정의하고, 이러한 행동을 트리거하는 키 또는 버튼을 지정할 수 있습니다.
    2. Input Action Asset: 여러 개의 입력 행동을 그룹화하는 방법입니다. 이를 통해 재사용 가능한 입력 설정을 만들어 게임 내의 다른 캐릭터나 메뉴에 적용할 수 있습니다.
    3. Player Input Component: Unity의 New Input System에 추가된 새로운 컴포넌트로, 자동으로 입력 행동을 처리하고 해당 게임 오브젝트에 메시지를 보냅니다.
    New Input System의 장점
    1. Cross-Platform Compatibility: New Input System은 다양한 플랫폼과 입력 장치에 대해 일관된 방식으로 작동합니다.
    2. Rebinding: 플레이어가 게임 내에서 자신의 입력 설정을 변경할 수 있도록 지원합니다.
    3. Multiplayer Support: 여러 플레이어가 동일한 장치에서 게임을 플레이하거나, 각각의 장치에서 게임을 플레이할 때 입력을 쉽게 처리할 수 있습니다.Input System은 따로 패키지매니저에서 설치해야하는데 그 과정을 살펴보자.

설치 과정

Window → Package Manager → Unity Register → Input System → Install

윈도우에서 패키지 매니저를 찾는다.
이렇게 체크가 되어있는지 확인하자
스크롤을 중간쯤 내리다 보면  Input System이 보인다 클릭하자. 나는 현재 설치가 되어있어 Remove가 보이지만  설치가 안되어 있는 분들은  Install 가 보일테니 클릭하여 설치하자

설치를 완료했으면 이젠 Input System을 사용할 준비를 하자.

Create를 클릭하여
Input Actions을 클릭
그러면 이런식으로 만들어진다. 더블클릭하자
클릭하면 창이뜬다.  No Control Schemes를 클릭하자
클릭하고 Add Control Scheme를 클릭하자
이런식으로 추가할 수 있다.
이름수정 =>  Keyboard 와 Mouse 추가 세이브를 누르자
Action Maps에서 +를 누르면 New action map이 나온다 이름을 수정할 수 있다.
Actions에 있는 +를 누르면 새롭게 나타난다. 이름을 수정할 수 있다. Action Type는 Value로 지정한다.
Control Type는 Vector 2로 지정
Binding을 추가하는 곳 (+)를 누르면 Up Down ..... Composite가 나온다 클릭
이렇게 나타나는 것을 확인할 수 있다.
원하는 키에 맞춰서 입력할 수 있다. 나는 wsad를 사용했다. 지금은 w를 입력하는 장면
모두 입력 받은 모습
새로운 액션을 추가한다. 마우스의 위치를 받는 액션이다.
Binding -> Path 클릭 -> Mouse
Position 클릭
이런 상태로 변한다.
나중에 사용할 버튼도 구현하자
Path -> Mouse -> Left Button

자 이제 모든 준비는 끝났다.
이제 스크립트를 만들 차례다.

TopDownCharacterController 만들기

using System;  
using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;

public class TopDownCharacterController : MonoBehaviour
{
    // 이벤트 정의: 캐릭터 이동 시 발생하는 이벤트
    public event Action<Vector2> OnMoveEvent;
    // 이벤트 정의: 캐릭터 시선 이동 시 발생하는 이벤트
    public event Action<Vector2> OnLookEvent;

    // 캐릭터 이동 이벤트 호출 메서드
    public void CallMoveEvent(Vector2 direction)
    {
        // 이벤트가 null이 아닌 경우에만 이벤트 호출
        OnMoveEvent?.Invoke(direction);
    }

    // 캐릭터 시선 이동 이벤트 호출 메서드
    public void CallLookEvent(Vector2 direction)
    {
        // 이벤트가 null이 아닌 경우에만 이벤트 호출
        OnLookEvent?.Invoke(direction);
    }
}

PlayerInputController 만들기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerInputController : TopDownCharacterController
{
    // 주인공을 따라다니는 메인 카메라
    private Camera _camera;

    private void Awake()
    {
        // Awake에서 메인 카메라를 참조
        _camera = Camera.main;
    }

    // 이동 입력 처리 메서드
    public void OnMove(InputValue value)
    {
        // 입력 값에서 벡터를 추출하고 정규화하여 이동 이벤트 호출
        Vector2 moveInput = value.Get<Vector2>().normalized;
        CallMoveEvent(moveInput);
    }

    // 시선 이동 입력 처리 메서드
    public void OnLook(InputValue value)
    {
        // 입력 값을 벡터로 가져오고 해당 위치를 월드 좌표로 변환
        Vector2 newAim = value.Get<Vector2>();
        Vector2 worldPos = _camera.ScreenToWorldPoint(newAim);
        // 플레이어 위치에서 해당 위치로 향하는 벡터를 정규화
        newAim = (worldPos - (Vector2)transform.position).normalized;

        // 정규화된 벡터의 크기가 0.9 이상이면 시선 이동 이벤트 호출
        if (newAim.magnitude >= 0.9f)
        {
            CallLookEvent(newAim);
        }
    }

    // 발사 입력 처리 메서드
    public void OnFire(InputValue value)
    {
        // 발사 입력에 대한 처리 (현재는 로그만 출력)
        Debug.Log("OnFire" + value.ToString());
    }
}

TopDownMovement 만들기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TopDownMovement : MonoBehaviour
{
    // TopDownCharacterController 컴포넌트 참조를 위한 변수
    private TopDownCharacterController _controller;
    // 이동 방향을 저장하기 위한 변수
    private Vector2 _movementDirection = Vector2.zero;
    // Rigidbody2D 컴포넌트 참조를 위한 변수
    private Rigidbody2D _rigidbody;

    private void Awake()
    {
        // 초기화: TopDownCharacterController 및 Rigidbody2D 컴포넌트 참조
        _controller = GetComponent<TopDownCharacterController>();
        _rigidbody = GetComponent<Rigidbody2D>();
    }

    private void Start()
    {
        // 이벤트 핸들러 등록: TopDownCharacterController의 이동 이벤트에 Move 메서드 연결
        _controller.OnMoveEvent += Move;
    }

    private void FixedUpdate()
    {
        // FixedUpdate에서 이동 적용
        ApplyMovement(_movementDirection);
    }

    // 이동 이벤트 핸들러
    private void Move(Vector2 direction)
    {
        // 이동 방향 갱신
        _movementDirection = direction;
    }

    // 실제 이동 적용 메서드
    private void ApplyMovement(Vector2 direction)
    {
        // 이동 방향에 속도를 곱하여 Rigidbody2D에 적용
        direction = direction * 5; // 여기서 5는 이동 속도 조절을 위한 상수
        _rigidbody.velocity = direction;
    }
}

원하는 오브젝트에 이렇게 넣어주자.
완벽하게 이동하는 모습을 볼 수 있다.

 

굳!

반응형