배 타다 개발자

[유니티 ]키를 입력을 관리하는 InputManager 본문

Graphics/Unity 3D

[유니티 ]키를 입력을 관리하는 InputManager

노 아 2021. 10. 17. 21:23

키를 입력을 관리하는 InputManager

Update() 함수 안에서 플레이어마다 키를 반복하는 방식은 매우 안 좋은 방식.
공통된 기능은 이벤트로 받아서 처리하는 깔끔한 형식으로
입력을 관리하는 InputManager 스크립트를 작성해보자.

InputManagers Script


컴포넌트화 하지 않을 인풋매니저이기 때문에
MonoBehaviour를 상속받지 않고 전통적인 C#스크립트로 이용한다.
Monobehaviour를 상속받지 않았기 때문에 다른 누군가 불러주어야 사용할 수 있다.

델리게이트를 사용해서 키입력을 있으면 그 입력을
keyaction에 추가해주기 위한 변수를 선언한다.

장점은 명확하다.

keyAction을 컨트롤 하는 대상의 수가 많아지더라도
InputManager에서 한번에 체크가 가능하다.

만약 받은 입력이 없다면 종료, 입력값이 있다면 있다면
Invoke()를 통해서 이벤트가 발생했음을 구독하고 있는 대상들에게 전달한다.

이렇게 해서 1차적으로 InputManagers 의 스크립트를 완성한다.

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

// Use this class as traditional c# script not as component(Monobehaviour)
public class InputManager
{
    // Delegate 
    public Action keyaction = null;

    // InputMangers will detect inputs in OnUdate()
    public void OnUpdate()
    {
        // 입력 받은 키가 아무것도 없다면 종료
        if (Input.anyKey == false) return;

        // 어떤 키가 들어왔다면, keyaction에서 이벤트가 발생했음을 전파. 
        if (keyaction != null)
        {
            keyaction.Invoke();

        }
    }
}

Managers Script

이제 싱글톤의 매니저인 Manager 클래스에 가서

인풋 매니저 인스턴스를 생성하고, 불러올 수 있게 한다.

이후 Manager의 Update()에서 직접 InputManager의 OnUpdate()를
실행시켜주면

결과적으로 화면에 마우스나 키보드의 입력을 체크하는 역할을 Manager에서 Onupdate를 실행시켜주는 구조가 된다.

PlayerController Scripts

이제 플레이어에 붙은 스크립트 컴포넌트를 작성해보자.
이때, Start() 함수에서

KeyAction을 구독해주고, KeyAction에서 Invoke() 메서드를 통해서 입력받고 있음이 감지가 되면 호출할 함수를 정의해준다.


예를 들면, 플레이어의 이동에 관한 함수이다.