Notice
Recent Posts
Recent Comments
Link
bdfgdfg
Input Manager / Resource Manager 본문
반응형
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