Skip to content

Develop document : Event

Sol Lee edited this page Aug 16, 2023 · 5 revisions

이벤트

개요

게임을 진행하면서, 특정 확률에 따라 특정 기간동안 특정 효과가 발생하는 기능입니다.

기능

이벤트는 유저에 의해 추가, 변경(모딩) 이 가능한 시스템입니다.

기본적인 사항은 다음 문서들에 기술되어 있습니다.

개발 : EventManager

Event는 EventManager와 Event로 구성됩니다.

그 중, EventManager에 대한 설명입니다.

Begin play

EventManager는 GameMode에 의해 게임 시작 시 레벨에 스폰됩니다.
스폰 된 EventManager는 Lua스크립트 파일을 읽어 Event객체를 초기화 하여, 배열로 저장합니다.
그 후 일일 확률 계산을 위해 DailyTask함수를 Timer의 Delegate에 Bind합니다.

Game loop

EventManager는 Timer에 의해 매일 0시에 이벤트 발생을 시뮬레이션 합니다.
0시에 호출되는 함수는 DailyTask입니다. 이 함수는 상황에 따라 Day카운터를 조정합니다.
이후 DailyTask가 SimulateProbability를 호출하여 시뮬레이션을 수행합니다.
호출된 SimulateProbability함수는 Day값을 기반으로 이벤트 발생을 시뮬레이션 합니다.
이벤트가 발생되어야 하는 경우 UpdateEventWeight와 OccurEvent함수를 호출합니다.
UpdateEventWeight는 이벤트들의 발생 확률(가중치)을 업데이트합니다.
OccurEvent는 이벤트 발생 확률에 따라, 랜덤한 이벤트를 발생시킵니다.

DailyTask

이벤트는 매일 0시를 기점으로 생성 여부가 결정됩니다.
따라서 Timer에 의해 Broadcast되는 DailyTask함수를 가집니다.
이 함수는 이벤트의 발생 확률을 결정하기 위해 Day값을 이용합니다.
Day는 이벤트 EventOccurProbability의 인덱스가 되어, 확률 값을 가져옵니다.
이벤트가 발생중일 때에는 추가적인 이벤트가 발생하지 않기 때문에, Day값이 증가하지 않습니다.
현재 이벤트의 발생 여부를 확인하는 것은 EventPeriod 변수를 이용합니다.
해당 변수는 Event시작 시, 이벤트 진행 기간만큼 초기화되며, DailyTask에서 1씩 감소됩니다.
또한, 해당 변수가 0이하일 때 즉, 이벤트가 발생중이지 않을 때에는 EventEndTask를 Broadcast합니다.

SimulateProbability

이벤트는 정해진 발생 확률이 존재합니다.
0~14일은 0%로, 이벤트가 발생하지 않습니다.
이벤트의 발생 확률은 15일의 33.33%로 시작하여, 35일에 최대치인 100%가 됩니다.
해당 발생 확률은 마지막 이벤트의 종료 시점에서 초기화됩니다.
즉, 각각의 이벤트 사이에는 최소 14일의 공백기간이 존재합니다.
공백 기간은 DailyTask에서 이벤트가 발생중일 때 Day값이 증가하지 않는 식으로 구현되어 있습니다.
이벤트가 발생되었다면 Day카운터를 0으로 초기화하고, UpdateEventWeight와 OccurEvent함수를 호출합니다.

UpdateEventWeight

각각의 이벤트는 발생 가중치가 존재합니다.
[개별 이벤트의 가중치 / 모든 이벤트의 가중치의 합]이 특정 이벤트의 발생 확률이 됩니다.
해당 가중치들은 게임 내 다른 요인(정책 등)에 따라 변화할 수 있기 때문에, 이벤트의 발생 전 업데이트가 필요합니다.
해당 함수는 Event객체의 가중치를 점검하여, 가중치 배열에 대한 업데이트를 수행합니다.

OccurEvent

이벤트의 발생을 수행하는 함수입니다.
해당 함수는 호출 시 아래 역할을 수행합니다

  • 가중치를 기반으로 이벤트를 선택하여 발생시킵니다.
  • EventPeriod를 초기화하여 이벤트 지속 기간을 설정합니다.
  • 이벤트 UI등에 이벤트의 발생을 알리기 위해 EventOccurTask를 Broadcast합니다.

발생한 이벤트는 EventLog구조체에 기록되어 EventManager의 배열 변수에 추가됩니다.
추가되는 Log는 UI의 업데이트에 사용됩니다.
또한, 이벤트의 지속 중에는 다른 이벤트가 발생될 수 없습니다.
따라서 해당 함수는 Event의 발생과 동시에 해당 Event의 지속시간 값 만큼 EventPeriod값을 초기화합니다.
해당 값은 DailyTask에 의해 감소합니다.

EventOccurTask

이벤트의 발생에 대한 알림은 유저에게 UI의 형태로 제공되어야 합니다.
EventOccurTask에는 Event UI의 업데이트 함수가 바인딩 되어있습니다.
OccurEvent에서 EventOccurTask가 Broadcast되는 것으로, Event UI의 팝업 알림 및 리스트 업데이트 함수가 호출됩니다.

EventEndTask

이벤트는 게임 내 시스템의 확률 및 가중치에 변동을 줍니다.
해당 변동은 지정 기간만 작동하고, 이벤트가 활성화중이 아닐 때에는 0의 값을 가집니다.
따라서 이벤트가 활성화 중이 아닐 때 EventEndTask를 지속적으로 Broadcast하여 이벤트에 의한 변동값을 초기화시킵니다.

개발 : Event

Event는 EventManager와 Event로 구성됩니다.

그 중, Event에 대한 설명입니다.

CreateEvent

Event는 EventManager에 의해 생성됩니다.
생성되는 Event는 액터가 아닌 UObject의 상속체이기 때문에, 레벨에 스폰하지 않습니다.
따라서 World Referencing이 불가능하여, EventManager에 의해 World및 기타 참조를 의존합니다.

InitEvent

Event객체의 상세 정보는 각각의 Lua스크립트에 작성되어 있습니다.
각각의 인스턴스가 어떤 Lua스크립트를 참조할지는 EventManager에 의해 결정됩니다.
InitEvent에서는 지정된 스크립트를 읽어, 객체의 정보를 초기화합니다.
초기화되는 정보는 다음과 같습니다.

  • Id : Id는 스크립트의 파일명에 의존합니다. (Event.{Id}.lua)
  • Title : Event의 제목을 나타냅니다. Lua스크립트에 스크립팅 되어 있습니다.
  • Message : Event의 영향에 대해 UI에 표시될 메시지를 나타냅니다. Lua스크립트에 스크립팅 되어 있습니다.
  • Period : Event의 지속 기간을 나타냅니다. Lua스크립트에 스크립팅 되어 있습니다.

EventStart

EventManager에 의해 호출되는, Event를 발생시키는 함수입니다.
Lua스크립트의 Start함수를 호출하며, 함수의 반환값으로 이벤트의 지속 기간을 반환합니다.

GetEventPeriod

Event의 지속 기간을 반환합니다.

GetEventWeight

Event의 발생 가중치는 상황에 따라 변할 수 있습니다.
해당 조건은 Lua스크립트의 Weight함수에 정의되어 있습니다.
GetEventWeight는 해당 함수를 호출하여, 지정된 가중치를 반환합니다.

GetEventData

InitEvent에 의해 초기화 된 EventData구조체를 반환합니다.

Clone this wiki locally