오르카의 아틀리에

작년 9월 건강검진 반년 만에 간 수치가 2배로 뛰어서 160을 찍어버리는 경험을 했다. 80도 3년 동안 금주해서 40 정도 낮춘 수치였는데...

 

때문에 건강상의 이유로 퇴사하고는 줄곧 프로그래밍을 잠깐 내려놓았다. (그동안 취미로 영상편집으로 덕질이나 했음)

그러다 요즘 재활을 핑계로 설렁설렁 다니고 있긴 하지만 복학도 했고, 건강도 어느 정도 회복이 돼서 최근 프로그래밍 재활에 들어갔다.

 

팬 게임을 제작하는 중인데 UniRx + Zenject를 기반으로 시스템을 만들고 인게임 콘텐츠는 Bolt를 이용해 기획자에게 작업을 넘길 수 있도록 구성하는 중이다. 물론 기획도 내가 하지만... 개인적인 생각이지만, 병특으로 일을 하면서 성능과 타협할 수 있을 정도의 게임이라면 이렇게 역할을 분리할 수 있는 구조가 좋다고 느꼈기 때문이다.

 

UniRx + Zenject를 기반으로 Meta 시스템은 구조를 거의 잡았고 Bolt를 이용해 콘텐츠 구조를 작성 중 InGame Root에서 콘텐츠 내부의 Prob들이 User와 인터렉션을 취한 결과를 통보받고 싶어 졌고 Bolt의 Custom Event를 이용하기로 생각했다. 그런데 여기서 마음에 들지 않는 부분이 있었는데 Custom Event Unit이 바로 다음 사진처럼 구성되어 있다는 점이다.

 

argment 이름이 숫자야...

마음에... 안 든다... Argument 이름이 숫자고... 타입도 알 수 없다. 이벤트 이름이 string인 것도 마음에 들지는 않는다. 충분히 오타를 통해 의도치 않은 버그가 나올 수도 있고 분명 찾는데 한참 걸릴 거다. 물론, 이 부분은 enum을 사용한다든지, 이름을 글로벌로 미리 정의한다든지 하는 방법으로 어느 정도 해소할 수 있다.

 

하지만, Argument의 네이밍과 Type은 용서할 수 없다. 나는 옛날의 자신을 믿을 수 없으므로 분명 실수할 것 같다.

 

다행히도 Bolt 유저 중 이런 고민을 했던 사람들이 있었다. 해당 부분을 포함한 다른 여러 기능들을 묶어서 Addon으로 만들어서 공유하고 있는데 해당 레포에서 자세한 기능을 확인해 볼 수 있다.

 

 

RealityStop/Bolt.Addons.Community

A community-driven project for extending Unity Bolt - RealityStop/Bolt.Addons.Community

github.com

 

이 플러그인에서 가장 주목하고 싶은 기능들은 DefinedCustomEventRoute이다.

(Collections나 Math에 관한 기능도 흥미롭지만 그 두개를 다루는 정도가 되면 코드로 기능들 빼서 Unit을 만들어 사용할 수 있는 수준은 되지 않을까...)

 

 

 

1. DefindedCustomEvent

이 기능은 쉽게 말하면 이벤트를 미리 정의해서 사용할 수 있게 도와주는 Unit이다. Event에 사용할 Argument의 이름과 타입을 미리 지정할 수 있고, 해당 타입과 이름으로 Unit에 노출되기 때문에 Argument의 순서나 타입을 잘못 판단해서 사용할 일이 없을 것이다. 이 정도면 대. 만. 족 사실 이런 플러그인이 없으면 Custom Event를 상속해서 이벤트를 하나하나 만들어 쓸까도 했지만 리플렉션을 잘 이케이케 써서 Generic 하게 만들어서 공유하다니 역시 세상은 아직 살만한가 보다.

 

그리고 또한, 추가적으로 Global Event도 가능하게 도와준다. 성능에는 영향이 있겠지만, Bolt의 Graph에서 다른 Graph로 이벤트를 전달하려면 타겟을 지정해야 하고, 이걸 복수의 대상으로 뿌리려면 귀찮은 면이 있다. 

 

아쉬운 점이 있다면 도큐먼트가 딱히 따로 있지가 않다. ReadMe에도 설치법과 어떤 기능이 있는지 설명하는 정도, Wiki도 작성중인 느낌? 다행히 Release Note에는 버전별로 새로 추가된 기능에 대한 설명은 작성되어 있었다.

 

DefindedCustomEvent의 설명은 다음 링크를 참조 하면 된다.

 

Release V2.4 - Defined Events · RealityStop/Bolt.Addons.Community

New Units! Defined Event Trigger Defined Event Global Defined Event Trigger Global Defined Event Log Some Value Release video here: Covers most of the information below. Defined Events Defined ...

github.com

 

 

 

2. Route

사실 위 기능 하나만으로 이렇게 다양한 기능이 있는 플러그인을 도입하는 것은 고민이 될 수밖에 없다. 감자튀김을 먹기위해 버거킹 세트메뉴를 시키는 꼴이니까. 그렇게 고민하던 중 이 기능을 보고 바로 도입을 결정했다. Defined Events와 더불어 이 기능과 Collections 기능도 좀 사용한다면 감자튀김과 와퍼 정도는 먹는 기분이 들 수 있을 거다.

 

자신이 Visual Scripting 툴을 좀 이용해봤다 하면 'Node Hell'이라는 것을 겪어보거나 적어도 들어봤을 것이라 생각한다. 이런 녀석인데 보는 것 만으로 속이 안 좋아진다.

 

Unreal Blueprint Hell - 우욱...

우리가 코드를 정리하는 것처럼 이런 거 정리하지 않으면 나중에 읽을 수가 없다. 게다가 점프 기능도 없고 마우스로 따라가야 한다. 이거 겪고 나면 진짜 PTSD 온다.

 

Bolt.Addons.Community는 이런 이런 걸 좀 정리할 수 있게 Route라는 Unit을 제공한다.

 

Value Route Unit의 사용 예제

사진에 보이는 작고 귀여운 Unit이 Route Unit이다. 최단 거리로 연결되는 노드 엣지를 Route를 통해 정리하면서 마지막 Unit의 위치를 움직이지 않고도 ItemKey의 edge가 노드 뒤로 숨어버리지 않도록 만들 수 있다. 또한, Comment나 Todo 같은 Unit도 제공하기 때문에 정리하기 수월할 거다.

 

물론, 시스템이 정말 비대해지면 모든 Node Hell을 정리할 수는 없겠지만 정리할 수 있다는 게 어디야...

 

 

 

3. 기타

최신 3.0부터 AOT에서도 큰 문제없이 돌아가는 것으로 보이고, 유니티 최신인 2021 버전에서 Bolt에서 이름이 바뀌어 들어간 Unity Visual Scripting에도 대응한 모양이니 여러모로 도입했을 때 메리트가 플러그인 관리비용보다 좋은 것 같아서 도입해서 사용하고 있다. 팬 게임을 다 만들고 나면 포스트 모템도 할 겸 Subsystem으로 사용하는 Bolt 강좌도 진행해 봐야겠다.