bdfgdfg

Input Manager / Resource Manager 본문

게임프로그래밍/Unity

Input Manager / Resource Manager

marmelo12 2021. 8. 5. 14:34
반응형

Input Manager

키보드, 마우스 입력처리등을 모든 cs파일 Update문안에 넣는것은 비효율적.

 

그렇기에 InputManger라는 클래스를 만들어. 입력과 관련된 로직을 처리해주는 클래스를 만들어준다.

using System; // Action을 사용하기 위해 추가.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputManager
{
    // Action은 Delegate. 단 반환형이 void에 매개변수가 없는 애들을 함수로 등록가능.
    public Action KeyAction = null;

    public void OnUpdate()
    {
        if (Input.anyKey == false)
            return;
        
        // Action의 Invoke는 등록된 함수를 호출해준다.
        if (KeyAction != null)
            KeyAction.Invoke();
    }
}

 

그리고 게임 전체를 관리하기 위한 매니저(싱글톤)에서 위의 InputManager를 만들고 객체를 생성.

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

public class Managers : MonoBehaviour
{
    private static Managers m_instance;
    public static Managers Instance
    {
        get { Init(); return m_instance; }
    }
    private InputManager m_input = new InputManager();
    public static InputManager Input { get { if (m_instance == null) Init();  return m_instance.m_input; } }
    

    void Awake()
    {
        Init();
    }
    void Update()
    {
        m_input.OnUpdate();    
    }
 .....

여기서 Input과 관련된 입력확인을 Update문에서 체크하고. 다른 클래스에서 플레이어등 입력과 관련된 행동을 할 때

Update문 안에 바로넣는게 아닌. 매니저클래스의 m_input에 접근해 Action변수에 어떤 입력에 관한 로직을 정의한 함수를 등록하면 된다.

 

 void Awake()
{
    Managers.Input.KeyAction -= OnKeyBoard;
    Managers.Input.KeyAction += OnKeyBoard; 
}

 

Resource Manager

규모가 큰 게임을 만들면, 모든 리소스를 유니티 툴로 하나하나 리소스들을 관리하거나 연결하는것은 힘들다고 함.

 

그렇기에 따로 리소스를 코드를 통해 직접 호출하거나 해서 사용한다.

GameObject go = Resources.Load<GameObject>("prefabs/tank");
Instantiate(go);

다만 이렇게 필요할때마다 직접 이런 코드를 사용하는것보단,

리소스 매니저라는 클래스를 만들어 리소스를 불러와 사용하는 기능들을 한번 래핑하여 사용하도록 만든다.

 

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

public class ResourceManager
{
	// 제네릭 함수. T는 Object타입을 받음.
    public T Load<T>(string path) where T : Object
    {
        return Resources.Load<T>(path);
    }

    public GameObject Instantiate(string path, Transform parent = null)
    {
        GameObject prefab = Load<GameObject>($"Prefabs/{path}");

        if(prefab == null)
        {
            Debug.Log($"Failed to load prefab : {path}");
            return null;
        }

        return Object.Instantiate(prefab,parent);
    }

    public void Destroy(GameObject go)
    {
        if (go == null)
            return;

        Object.Destroy(go);
    }
}

위의 ResourceManager또한 Managers클래스에서 생성한 후, 반환하는 프로퍼티를 만들어준다.

반응형

'게임프로그래밍 > Unity' 카테고리의 다른 글

데이터 관리(Json)  (0) 2021.08.08
Coroutine(코루틴)  (0) 2021.08.08
Animation State패턴  (0) 2021.08.06
투영  (0) 2021.08.05
Raycasting / LayerMask  (0) 2021.08.05
Comments