키 입력을 매번 Update() 문에서 처리하는 것이 아니라,
Manager를 하나 만든 뒤, 해당 부분에서 키 입력 체크를 하고 이를 필요로 하는 다른 부분들에 호출시키는 방식으로 작업하면 부하를 줄일 수 있다
public class InputManager
{
public Action KeyAction = null;
public void OnUpdate()
{
if (Input.anyKey == false)
return;
if (KeyAction != null)
KeyAction.Invoke();
}
}
* MonoBehavior을 상속받지 않는 형태로 만들어주었고, 때문에 Update 함수를 사용할 수 없어, 외부 스크립트에서 불러올 수 있도록 public의 OnUpdate라는 이름의 함수를 만들어주었다
InputManager를 Manager 스크립트에 연결하기
static Managers s_instance;
static Managers Instance { get { Init(); return s_instance; } }
InputManager _input = new InputManager();
public static InputManager Input { get { return Instance._input; } }
void Update()
{
_input.OnUpdate();
}
새로운 InputManager 인스턴스를 하나 만들어준 뒤, 프로퍼티를 생성해준다
s_instance는 유일하기 때문에 s_instance의 _input을 리턴해주면 된다
그리고 Update 함수에서 _input의 OnUpdate함수를 호출하도록 연결해준다
* 외부에서 s_instance에 접근하는 것을 막기 위해 Instance 프로퍼티는 private으로 변경해준다
그리고 PlayerController 스크립트에서 이 KeyAction의 Invoke를 받을 수 있도록
void Start()
{
Managers.Input.KeyAction -= OnKeyboard;
Managers.Input.KeyAction += OnKeyboard;
}
위와 같이 설정해준다
InputManager에서 KeyAction이 활성화 되면 OnKeyboard 함수를 실행시키겠다는 의미
만약 OnKeyboard가 두 번 붙게 될 경우 두 번 호출이 되기 때문에 이를 방지하기 위해 OnKeyboard를 한번 제거한 뒤에 다시 붙여준다
OnKeyboard 함수는 아래와 같다
void OnKeyboard()
{
if (Input.GetKey(KeyCode.W))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), 0.2f);
transform.position += Vector3.forward * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.S))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), 0.2f);
transform.position += Vector3.back * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.A))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), 0.2f);
transform.position += Vector3.left * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.D))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), 0.2f);
transform.position += Vector3.right * Time.deltaTime * _speed;
}
}
'강의, 책 > [Unity] C#과 유니티로 만드는 MMORPG 게임 개발 시리즈' 카테고리의 다른 글
Section 4. Collision - Collision, Trigger (0) | 2024.01.20 |
---|---|
Section 3. Prefab - Resource Manager (0) | 2024.01.20 |
Section 2. Transform - Rotate (0) | 2024.01.16 |
Section 2. Transform - Vector3 (0) | 2024.01.16 |
Section 2. Transform - Position(WASD로 플레이어 움직이기) (0) | 2024.01.16 |