Notice
Recent Posts
Recent Comments
Link
12-26 11:26
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

킹머핀의 제작 일지

게임 내 이벤트를 삽입하는 방법 본문

인디 게임 개발/개발 일지

게임 내 이벤트를 삽입하는 방법

KingMUffin 2020. 10. 26. 17:59

스토리가 존재하는 게임의 대표 장르는 RPG이고, 예전부터 지금까지도 그 장르의 게임을 누구나 쉽게 제작할 수 있도록 공헌한 게임 엔진은 단연 RPG Maker 이겠다. 나는 안 써봤지만 게임을 개발하지 않는 사람들도 '쯔꾸르' 게임에 관심이 있었다면 알 만한 프로그램이겠다.

내가 이전에 개발한 Illume 데모는 스프레드시트에 모든 대사와 이벤트 명령어를 작성하고, 그걸 scv 포맷으로 저장해 유니티 엔진으로 불러와 텍스트를 직접 읽어서 어떤 명령어를 넣었는지 확인하는 방법을 사용했다.

이 방법을 이용하기 이전에는 메모장에다 한 줄에 하나씩 대사는 별표로, 명령어는 해시로 구분해서 작성했었다. 가독성이 매우 떨어져서 불편한 이 방식에 비해 새로 고안한 위의 방법은 좋은 대안이었다고 생각한다. 다른 인디 개발자들의 예시를 찾아봐도 비슷한 방법을 사용하거나 다른 방식과 병행하여 사용하는 것으로 보인다(어떻게 병행하는지 정확히는 모른다). 더 좋은 방식이 있는지 많이 찾아봤지만, 이것에 대해 다루는 글이 별로 없었다.

그래서 참고할 만한 것들을 직접 찾아보기로 했다.


 

Stage/Curly.tsc

Stage/Curly.tsc (return to the script reference page) Korean Translation (Anonymous Author) #0090

www.cavestory.org

이건 '동굴 이야기'의 대사 파일 중 하나다. 아마 모든 스테이지마다 이런 파일이 하나씩 있는 것 같다. 해당 스테이지의 모든 대사가 들어있는 것으로 보아 정체불명의 문자들은 아마도 같은 스테이지의 모든 이벤트를 실행하는 명령어일 것으로 추정한다.

 

이번엔 이벤트를 자유롭게 이용하는 RPG Maker은 어떻게 이벤트를 만들고 삽입하는지 보자.

 

[기초] 07-0. 이벤트 커맨드 설명 (버튼 번역) - RPG Maker MV -

본격적인 이벤트 커맨드 강좌를 하기에 앞서서....이벤트 커맨드를 번역해보았습니다. 한글패치가 아직 안 ...

blog.naver.com

'RPG Maker MV'의 이벤트 종류는 아래와 같다.

  • Message : 입출력
  • Game Progression : 변수, 스위치, 타이머
  • Flow Control : 조건 분기와 이벤트 진행 구조
  • Party : 파티 상태 변경
  • Actor : 액터 상태 변경
  • Movement : 움직임 관련
  • Character : 캐릭터와 움직임 또는 효과 표시 관련
  • Picture : 그림 띄우기
  • Timing : Wait...
  • Screen : 화면 전환과 효과
  • Audio & Video : 말 그대로
  • Scene Control : 시스템 장면 처리
  • System Settings : 커스텀 리소스
  • Map : 커스텀 맵과 배경 리소스
  • Battle : 전투 관련
  • Advanced : Script... Plugin Command...

출처 : https://blog.rpgmakerweb.com/tutorials/make-your-own-game-tutorial-8

모든 이벤트는 개별 액터의 이벤트 편집 창에서 추가할 수 있다. 씬에도 이벤트를 편집할 수 있는지는 안 알아봤지만, 그것보다 더 중요한 것은 이벤트 삽입이 내가 맨 처음 구현했던 메모장 명령어와 유사한 방식이라는 것이다. 물론 삽입한 이벤트를 어떻게 읽어들이는지는 확실히 다르겠지만 말이다.

(실행 조건은 이미지에는 안 나와있지만 창 밑에 '동작'이라는 목록 상자에서 '플레이어와 어쩌구 했을 때'와 같은 조건을 선택할 수 있다.)

대부분의 이벤트는 해당 프로젝트의 데이터베이스를 이용한다.

 

[RPG Maker MV] 데이터베이스 - 스킬 설정

RPG Maker MV 도움말 스킬 설정 데이터의 역할 액터가 수행하는 액션을 정의하는 데이터입니다. 액터의 마법이나 특수공격과 같은 전투 중 공격과 방어행동을 정의합니다. 액션을 수행이 가능한

ini1982.tistory.com

RPG Maker의 이벤트 작동 방식을 알면 분기를 효율적으로 구현하는 방법 또한 알게 될 거라고 생각했는데, 그냥 단순한 처리일 뿐이었다.

 

그런데 쯔꾸르 말고도 이벤트와 분기를 자유롭게 만들 수 있으며 단순한 장르가 있다. 흔히 미연시라고 불리는 ADV(ADult Video)(농담이고, ADVenture)이다.

 

[유니티로 텍스트 ADV를 만들어보자] 발표자료 요약본

원본 : http://www.slideshare.net/nyaakobayashi/unite-japan2014-unitydetextadvUniteJapan2014 DAY...

blog.naver.com

일본의 유나이트2014에서 소개한 '우타게'는 ADV 게임을 쉽게 만들기 위한 유니티 에셋이다.

https://youtu.be/fu1hZI5HFPc

이 에셋은 시나리오를 스프레드 시트로 작성할 수 있게 만들어졌는데, 일본어를 알아볼 수는 없지만 중요한 것은, 내가 두 번째로 구현했던 CSV를 이용한 방식과 매우 유사한 방식이라는 것이다.

모지? 나 꽤 잘 하고 있던건가? 그런 걸지도 모른다. ㅋㅋㅋㅋ

 

그래도 더 살펴보자. 처음에 얘기했던 '다른 방식과 병행하여 사용하는' 방법은 어떨지 알아보자. 어떻게?

마침 얼마 전에, 내가 작년부터 응원하고 있는 'Frostory'의 개발 일지에서 비슷한 내용을 봤던 기억이 있다!

 

Frostory 트리거 시스템 - 인디 게임 개발 갤러리

안녕하세요!오늘 BIC랑 경기게임오디션 서류를 아슬아슬하게 제출하고 오랜만에 개발일지를 씁니다ㅋㅋ이번에는 저희가 트리거 시스템을 만들면서 겪었던 문제들과, 그 해결에 관해 써보려 합

gall.dcinside.com

이 게임 개발자분들이 엄청난게, 유니티를 개조하다시피 다루고 있습니다. 커스텀 에디터만 팔아도 게임 판매량 만큼 나올 것 같습니다.

저 글에서는 트리거(이벤트) 작동 시점과 순서를 'tr_'로 시작하는 이름의 오브젝트와 다양한 이벤트를 추가/삭제하고 편집할 수 있는 에디터로 관리합니다. 순차적으로 호출하는 트리거는 자식 오브젝트로 분류하고, 특정 단계에서 실행하는 트리거끼리 분류해서 에디터에 표시하는 방법으로 수많은 트리거를 쉽게 관리하도록 만드셨습니다. (솔직히 트리거 이름이 영문에서 한글로 바뀐 것만으로 가독성이 엄청나게 좋아졌다는 것을 알 수 있다. ㅋㅋㅋ)

즉 제가 지금까지 구현했던 '모든 이벤트의 작동 시점과 순서를 대본에서 관리하는 방식'과는 다릅니다.

출처 : https://gall.dcinside.com/m/game_dev/24705

Frostory의 대본은 이렇게 생겼고(지금은 또 다를지 모르겠네요), 명령어의 역할은 대사를 가져오기 위한 key와 대사 앞의 오브젝트 이름(말풍선의 종류인가?) 뿐인 것 같습니다. 그러니까 대사는 스프레드 시트에서, 이벤트는 게임 엔진에서 편집하는 것이죠.


 

[UNDERTALE] 분석글 번역 : f/Fun Theory

원문: https://docs.google.com/document/d/1xvxyX2dxkzDiy2TxRjPq4ryBDrvFG2Hk2q_F-6yLuNg/p...

blog.naver.com

분기 하면 언더테일이죠. 하지만 지금 알아볼 것은 선택 분기이자 확률 분기입니다. 게임을 새로 시작할 때마다 Fun 변수가 무작위 수(1~100)로 바뀌고, 이에 따라 (진행에 영향을 주지 않는) 숨겨진 이벤트를 볼 수 있어요. 그리고 이 변수는 선택 분기에 따라 증가하기도 합니다.

이 Fun 수치에 대해 심층 분석한 글이 있습니다. 뭐하는 사람일까요. 그리고 저 출처는 그 글을 번역한 블로그입니다.

정확히는 fun이라는 변수의 값에 따라 특정 이벤트를 볼 수 있고, 변수의 이름이 Fun으로 변화했을 때 fun에서 경험할 수 있는 모든 '재미있는' 이벤트를 포함해서 게임 내 정체 불명의 캐릭터인 '가스터'와 관련된 이벤트를 볼 수 있다.

하지만 Fun 수치만으로 모든 특별한 이벤트를 작동시키지는 않는데, 예를 들어 Fun이 66일 때 워터폴에 복도가 나타나지만, 그 복도의 벽에 가스터로 추청되는 캐릭터가 존재하는 방으로 들어갈 수 있는 회색 문이 나타날 확률은 50%이다. 게다가 플레이어가 그 복도에 들어서는 것만으로 Fun은 0이 된다(이건 사실 그리 대단한건 아님).

Encountering “Fun” events is sometimes dependent upon your choices and “progression” through the timeline. This leads me to believe that “Fun” serves as a sort of “divergence target”. Your current position in the timeline is your starting point, and your “Fun” value is the amount of divergence from that starting point. If your starting point is too far away from the divergence point, it can no longer be reached. Think of it like attempting to hit a large target with a ball while blindfolded, with your only assistance being the general direction of the target and how hard you should throw. If your starting position is too far from the target, hitting it at all becomes impossible to do.
If your current position in the timeline is near enough to the relative position in this fork, it establishes a point of convergence between the two timelines. This allows you to observe people and places that no longer exist in your timeline.

블로그나 파파고나 구글 번역기의 번역이 분명하지 않아서, 이 부분이 무슨 뜻인지 정확히 모르겠다. 중요한 단락인 것 같은데.. 나중에 영어 전공한 사람 만나면 이 글을 들이밀며 떠먹여달라고 부탁해야지.