[C#] 리스너 패턴을 알아보자 근데 유니티를 곁들인.(이벤트 함수를 사용하는 대표적인 패턴! )

2024. 11. 14. 15:01·DesignPattern

보통 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
'DesignPattern' 카테고리의 다른 글
  • [Design Pattern] State Pattern, 유니티 애니매이션에 자주 쓰이는 state 디자인 패턴에 대해서 알아보자!
  • [C#] 유니티에서 보는 싱글톤(SingleTone) 디자인 패턴 완벽 가이드
개발준입니다
개발준입니다
백문이 불여일타
  • 개발준입니다
    Re:제로부터 시작하는 개발이야기
    개발준입니다
  • 전체
    오늘
    어제
    • All (32)
      • Java & Kotlin (3)
      • Spring (0)
      • DataBase (0)
      • Git & Github (1)
      • Baekjoon (8)
      • C & C++ & C# (5)
      • Unity (12)
      • DesignPattern (3)
      • SmallTalk (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    개발자
    알고리즘 #코테
    github
    가중치 비교
    c#
    디자인패턴
    코딩
    유니티
    매서드
    게임개발
    리스너 패턴
    티스토리챌린지
    state pattern
    코테
    알고리즘
    레벨 디자인
    개발
    오블완
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
개발준입니다
[C#] 리스너 패턴을 알아보자 근데 유니티를 곁들인.(이벤트 함수를 사용하는 대표적인 패턴! )
상단으로

티스토리툴바