ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 관찰자 패턴, 전략 패턴
    TIL 2024. 6. 20. 21:48

    디자인 패턴을 쓸 때 KISS원칙 'Keep It Simple, Stupid'

    단순하게 유지하기를 숙지해야한다. 복잡도는 필요한 경우에만 높여야 한다.

     

    따라서 패턴이 적용되는지 확실치 않은 경우에는 더 자연스럽게 적용할 상황이 될 때까지 기다리는 편이 좋다.

    새롭고 참신하다는 이유만으로 디자인 패턴을 사용해서는 안된다.

     

    관찰자 패턴(ObeserverPattern)

    관찰자 패턴은 일반적으로 일대다 종속 관계를 사용해 오브젝트가 통신하되 낮음 결합도를 유지하도록 할 수 있다.

    한 오브젝트의 상태가 변경되면 종속된 모든 오브젝트가 자동으로 알림을 받는다.

     

    구독한 채널에 알림이 온다던가, 단체 톡방에 누군가 글을 올리면 모두가 알림이 온다는가 등

     

    게임플레이 과정에서 발생하는 거의 모든 상황에 관찰자 패턴을 적용할 수 있다.

     

    C# Unity에서는 event가  옵저버 패턴같은 역할을 하는 event가 이미있다.

     

     

    구독한 사람들에게 알림을 알리는 예제

    //Manager.cs
    
    public class Manager:MonoBehaviour
    {
        public static Manager instance;
        public Action saleAct;
    
        public bool onSale=false;
    
        void Awake()
        {
            instance= this;
        }
    
        void Start()
        {
            StartCorutine(ItemArrive());
        }
    
        private IEmurator ItemArrive()
        {
            float waitTime= Random.Range(1f,3f);
            Debug.Log(waitTime +"초 대기 시작");
    
            yield return new WaitForSeconds(waitTime);
            //onSale=true;
            saleAct();
        }
    }
    //ItemObserver.cs
    
    public class ItemObserver:MonoBehaviour
    {
        public string name;
        
        void Start()
        {
        	Manager.instacne.saleAct +=CheckSale;
        }
        void Update()
        {
        	//if(Manager.instacne.onSale)
            //{
            //}
        }
        
        private void CheckSale()
        {
        	Debug.Log(name+"당장사");
        }
    	
    }

     


    보스 몬스터를 처치하고 경험치와 퀘스트 완료를 알리는 예제

    //BossManager.cs
    
    public class BossManager:MonoBehaviour
    {
        public int KillQidx=0;
        public float exp=9999f;
        public Action<int> onDeadQuest;
        public Func<float,int> onDeadExp;
    
        public int count;
    
        public void OnDead()
        {
            onDeadQuest(KillQidx);
            onDeadExp(exp);
        }
    }
    //ObserverPlayer.cs
    
    public class ObserverPlayer:MonoBehaviour
    {
        public BossManager boss;
        
        void Start()
        {
        	boss.OnDeadExp+=KillMonster;
        }
    
        public int KillMonster(float exp)
        {
            Debug.Log(exp+"경험치를 획득");
            return 0;
        }
    }
    //QuestManager.cs
    
    public class QuestManager:MonoBehaviour
    {
        public BossManager boss;
    
        void Start()
        {
        	boss.onDeadQuest+= QuestManaging
        }
        void OnDisable()
        {
        	boss.onDeadQuest-= QuestManaging //메모리 누수 방지
        }
    
        public void QuestManaging(int qidx)
        {
            if(qidx==0)
            {
                Debug.Log("보스잡기 퀘스트 완료");
            }
        }
    }

     

    Action과 Func차이점

    Action은 반환값이 없고 Func는 반환값이 있다.

     

    게임 플레이 과정에서 발생하는 거의 모든 상황에 관찰자 패턴을 적용할 수 있다.

    플레이어가 적을 파괴하거나 아이템을 수집할 때 마다 이벤트가 발생할 수 있는 게임 을 예시로

    점수나 업적을 추적하는 통계 시스템이 필요할 경우, 관찰자 패턴을 사용하면 원본 게임플레이 코드에 영향을 주지 않고 해당 시스템을 만들 수 있다.

     

    그 외 관찰자 패턴 예시

    - 목적, 목표 달성

    - 승리, 패배 조건

    - 플레이어 사망, 적, 사망 

    - 아이템 획득

    - 사용자 인터페이스 등..

     

    관찰자 패턴 장점과 단점

    장점

    • 결합도가 낮고 확장성이 높다.
    • 런타임에서 옵저버 추가/ 제거가 용이하다
    • C#과 유니티에서 구현이 용이하다.

    단점

    • 시스템의 복잡성이 증가할 수 있고 디버깅시에 힘든 경험이 생긴다.
    • 관찰자들 사이에 호출 순서가 예측 불가능하다.
    • 구독을 해지하지않고 옵저버가 파괴될 경우 메모리 누수가 발생할 수 있다.

     

     

    전략패턴(Startegy Pattern)

    실해 중에 알고리즘을 선택할 수 있게 하는 디자인 패턴이다.

    특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화 하며 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.

     

    전략패턴은 객체지향 그 자체라고 볼 수 있다.

    만약 캐릭터가 추가 될 때 if esle나 switch문으로 계속 추가하게 된다면 절차가 계속 늘어나게 된다.

     

    스크립트를 나눠두면 절차는 그대로이지만 객체가 증가하게 된다

     

    틀을 만들어놔서 캐릭터를 찍어낼 수 있다.

     

     

    'TIL' 카테고리의 다른 글

    [TIL] Unity 최적화  (0) 2024.07.04
    [TIL]RenderingPipeline, ShaderGraph 기초  (0) 2024.06.18
    [TIL] 멀티 시스템 기초 지식  (0) 2024.06.17
    [TIL] 파티클시스템, 애니메이션 이벤트  (0) 2024.06.12
    [TIL] 자료구조  (1) 2024.06.08
Designed by Tistory.