보통 wasd같이 키입력을 받는것을 Update()문에 두는 것은 비추다. wasd 뿐만 아니라 공용으로 사용할 수 있는 입력을 총괄하는 InputManager를 사용하는 것을 권장한다!
1. 입력이 굉장히 많으면 Update문에서 매번 수많은 입력을 검사해야하기 때문에 별로다.
2. 입력을 따로 관리하면 유지보수에 용이하다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class InputManager
{
public Action KeyAction = null;
public void OnUpdate()
{
if (Input.anyKey == false) // 어떤 키던 간에 false 면 그냥 return
return;
if (KeyAction != null)
KeyAction.Invoke();
}
}
Action과 같은 이벤트 함수를 설정해 OnUpdate()에서 어떤 키가 들어오지않으면 바로 return 아니면 KeyAction에 추가한 함수들을 Invoke()로 실행시키고 있다.
이것이 마치 Action이벤트가 해당 key가 들어올지 안들어올지 듣고 있다가 들어오면 Action에 추가된 함수들을 실행시킨다.!
Action(이벤트)이 리스너 역할을 해주지 않는가? 이것을 리스너 패턴이라 한다!!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Managers : MonoBehaviour
{
static Managers s_instace;
static Managers Instance { get { Init(); return s_instace; } }
InputManager _input = new InputManager();
public static InputManager Input { get { return Instance._input; } }
void Start()
{
Init();
}
void Update()
{
_input.OnUpdate();
}
static void Init()
{
if (s_instace == null)
{
GameObject obj = GameObject.Find("@Managers");
if (obj == null)
{
obj = new GameObject { name = "@Managers" };
obj.AddComponent<Managers>();
}
DontDestroyOnLoad(obj);
s_instace = obj.GetComponent<Managers>();
}
}
}
그렇다면 이렇게 싱글톤으로 구현해준 Managers에 프로퍼티로 추가해서, 실행하고자 함수(move()라고 하겠다)가 있는 스크립트에다가 Managers.Input.KeyAction += move() 를 추가하여 키가 들어오면 실행하고자 하는 함수들을 추가해주면 된다.
void Start()
{
Managers.Input.KeyAction -= move;
Managers.Input.KeyAction += move;
}
이렇게!
한번 빼주는 이유는 혹시 다른곳에서 해당함수를 호출했을까봐 실수 방지를 위해 추가했다.
그러면 Managers.cs와 InputManager.cs 정말 실행하는 함수가 뭔지도 모르고 "실행" 만 담당하게 된다!
그리고 코드 수정을 하고싶을 때 실행을 담당하는 부분을 건들 필요도 없다!!
그 실행했던 move()의 로직만 바꾸면 된다!!! 이 얼마나 깔끔한가!!!
많은 매니저들을 추가해서 코드를 용이하게 만들때 리스너 패턴을 이용하게 깔끔하게 만들어보자!
'DesignPattern' 카테고리의 다른 글
[Design Pattern] State Pattern, 유니티 애니매이션에 자주 쓰이는 state 디자인 패턴에 대해서 알아보자! (0) | 2024.11.12 |
---|---|
[C#] 유니티에서 보는 싱글톤(SingleTone) 디자인 패턴 완벽 가이드 (0) | 2024.11.10 |