유니티 옵저버 패턴 사용해서 Hp 변화를 실시간 반영하기 (믹스마스터 프로젝트)

반응형

글 작성 이유

믹스마스터 프로젝트 작업 중, 플레이어의 체력이 감소하거나 경험치 Bar가 증가하는 기능을 구현해야 했다. 핵심은 플레이어 객체의 상태가 변경될 때 다른 요소들이 이에 반응하도록 만드는 것 이다. 이를 위해 이전에 학습했던 옵저버 패턴을 활용해 해당 기능을 구현해 보았다 옵저버 패턴 정리한 내용은 아래 링크를 참고

 

2025.01.19 - [Unity C#/디자인패턴] - 유니티 옵저버 패턴 정리 (디자인 패턴)

 

유니티 옵저버 패턴 정리 (디자인 패턴)

📌옵저버 패턴 정의한 객체의 `주체(Subject)의 상태가 변경`되었을 때, 이를 `의존하는` 다른 옵저버(Observers)가 자동으로 통보를 받고 업데이트되도록 하는 디자인 패턴.장점느슨한 결합: Subject와

cherry22.tistory.com

 

구현 과정

옵저버 패턴의 핵심은 주체의 상태가 `변경`될 때 이를 의존하는 옵저버들에게 `자동으로 통보`되어 업데이트되도록 하는 데 있습니다. 따라서 주체와 옵저버를 명확히 구분하고, 옵저버가 주체에 의존할 수 있도록 로직을 설계하는 데 중점을 두어 코드를 작성했습니다.

 

[ Subject ]

먼저 Action 이벤트를 주체 객체인 캐릭터 스크립트에서 선언합니다.

 

[Observer]

플레이어 상태 변경 시 통보를 받을 수 있도록, HP와 Exp 데이터를 관리하는 옵저버 객체가 주체(Subject)에 접근해 이벤트에 구독합니다.

 

UpdateHp와 UpdateExp는 상태 변경에 대한 통보만 받기 때문에 이를 기반으로 비즈니스 로직을 작성합니다.

UpdateHp,UpdateExp는 ExpHpMpContainer.cs 코드에 포함 됩니다.

 

최종적으로 몬스터가 플레이어를 공격해서 플레이어 객체의 이벤트가 실행 되면 OnStatsChanged를 구독한 UpdateHp 콜백함수가 호출되어 UI가 변경됩니다. (Exp도 마찬가지)

해당 함수는 Character.cs코드에 포함 되어있습니다.

 

결과

 

주의사항

이벤트를 구독한 부분이 있으면 OnDisable 에서 구독 해제 하는 부분도 작성을 해야한다 메모리 누수가 있을 수 있으니.. 미리 방지하자

    private void OnDisable()
    {
       character.OnStatsChanged -= UpdateHp;
       character.OnExpChanged -= UpdateExp;

    }

 

반응형