해결된 질문
작성
·
148
·
수정됨
답변 1
1
안녕하세요.
말씀하신 두 가지 구현방식에는 분명히 장단점이 있습니다.
먼저 ScriptableObject 기반의 이벤트 버스의 장점은 다음과 같습니다.
첫번째는, ScriptableObject는 유니티 에셋으로 저장되기에 여러 씬에서 동인한 인스턴스를 갖고 공유할 수 있습니다. 반대로 싱글턴의 경우 씬이 변경될 때 유지하기 위해 DontDestroyOnLoad 처리를 해야합니다.
두번째는, 디커플링 입니다. 싱글톤의 경우는 접근하려는 클래스에서 해당 싱글톤을 참조해야 하기때문에 의존관계가 형성됩니다. 반면 SO를 사용한 이벤트 버스의 경우 이벤트 Publisher와 Subscriber 간의 의존관계 없이 구동하게 됩니다. 이점이 SO를 활용한 이벤트 버스의 가장 큰 장점입니다.
말씀하신데로 장점만 있는것은 아닙니다. 단점으로는 paehwang 님께서 지적하신데로 SO의 파일 갯수가 늘어날 수록 관리해야하는 에셋이 늘어나는 점입니다. 또한, 런타임에서 동적으로 이벤트를 추가하는 기능을 구현하기 어렵습니다. 반면에 싱글턴 기반으로 이벤트를 관리하면 Dictionary를 활용해 동적 이벤트를 추가하기 편리합니다.
결론적으로 SO를 사용한다고 무조건 좋은 것은 아니며 프로젝트의 개발 스타일에 따라서 선택하셔야 하는 부분이라고 말씀드리고 싶습니다.
Player - MyEventBus - UIManager 관계에 대한 이해는 정확히 하셨습니다.~
SO를 사용한 이벤트버스의 경우 Player와 UIManager가 MyEventBus를 각각 참조하고 있습니다. 직접적인 연결은 없지요. 그러나 싱글톤을 사용해 Player가 UIManager를 접근하고자 한다면 다음과 둘간의 직접적인 연결(커플링)이 형성됩니다. 이것을 막고자 하는 디자인 패턴입니다.
예를 들어 Player 스크립트에서 UIManager를 싱글톤으로 참조한다고 가정한다면 다음과 같이 참조하겠죠. 만약 UIManager에 선언한 UpdateHealthBar의 파라메터 갯수를 변경해야만 하는 상황이 발생했다면 해당 싱글턴을 참조하고 있는 모든 스크립트를 수정해야합니다.
public class Player : MonoBehaviour
{
private float maxHealth = 100.0f;
private void TakeDamage()
{
// 여기서 싱글톤을 참조합니다. 커플링이 발생하는 것이죠.
UIManager.instance.UpdateHealthBar(10.0f, maxHealth);
}
}
public class UIManager : MonoBehaviour
{
//싱글톤 패턴
public static UIManager instance;
private void Awake()
{
if (instance == null)
{
instance = this;
}
}
public void UpdateHealthBar(float _current, float _max)
{
//체력바의 크기를 조절하는 함수
//UIManager의 하위에 있는 체력바의 크기를 조절
}
}
이벤트 버스 패턴은 약속된 이벤트를 발행하고 해당 이벤트가 발생되면 정해진 로직을 수행하는 디커플링 패턴입니다.
잘 설명해드렸는지 모르겠습니다. ㅠㅠ
아.. ^^; 역시 제가 글을 잘 못쓰나 봅니다.
Player - MyEventBus - UIManager
형태에서 MyEventBus 를 현재 강의처럼 SO 로 만들 수도 있고,
그냥 일반적인 싱글톤으로 만들 수 있을거 같아서요.
UIManager 를 싱글톤으로 하자는 이야기가 아니었습니다.
이벤트버스 채널을 굳이 싱글톤 클래스가 아닌 SO 로 만들었을 때의
장점이 있는지에 대한 질문이었습니다.
아~~ 제가 질문의 요지를 잘못 이해했나봐요.
이벤트버스를 싱글턴을 구현하셔도 당연히 괜찮습니다. 개발자의 취향이나 선택의 문제입니다.
강의에서 초점을 맞추었던 부분은 이벤트버스 패턴을 SO로 구현해 보는 것이었습니다.
오! 그럼 SO 만의 특수한 장점이 있다기 보다는
SO 를 이용해서 이벤트버스 패턴을 구현할 수 있음을 보여주신거라 생각하면 좋겠네요.
말씀 감사합니다. 🙂
언젠가 시간되시면 RPG 게임의 인벤토리 시스템이나,
네트워크 멀티 게임,
몬스터 헌터와 같이 다중 피격 콜라이더가 있는 적에 대한 처리및 피격시 타격감을 위한 stop motion 같은
중/상급자 강의도 부탁드립니다.
즐거운 시간이었습니다. 감사합니다.
말씀감사합니다.
디커플링 관련해서 추가적으로 궁금한점이 있습니다.
[ Player - MyEventBus - UIManager ]
구조일 때
현재 제시된 예제는
Player 와 UIManager 가 직접적으로 연결되는 것을 막고 자 SO 를 활용하여 생성한 MyEventBus 라는 중계기를 사용하는 것으로 이해가 됩니다.
그렇다면 MyEventBus 를 통해 Player 와 UIManager 사이의 직접적인 연결만 끊을수 있으면
싱글톤 클래스나 SO 나 별 차이가 없는게 아닐까 하는 궁금증이 생겨서요.