카테고리 없음

[멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon] 4주차 회고 <Event와 컴포넌트 확장>

프로틴형님 2022. 7. 26. 21:11

Event System의 구성

Event 기반은 기본적으로 "행동을 실행해야 할 주체"에서 행동을 관리한다. 즉, 행위가 일어난 주체에서는 행위가 일어났을 때 행동에 필요한 정보와 타이밍만 알려주고 뭘 해야 할지는 각각 행동을 실행해야 할 주체에서 결정.

  1. Event: 로직 상에서 어떤 사건의 발생을 의미
  2. Handler: 해당 Event를 받았을 때 처리하는 행동의 주체
  3. Sender:해당 Event를 발송하는 객체

Event System의 장단점

장점

  • 다른 Component 나 기능단위에서 결합성이 떨어지므로 의존성을 배제할 수 있고 분산시스템이 용이.
  • 행위에 대한 액션을 추가 하고 싶을 때 행위를 수행하는 곳을 수정 없이 편하게 추가할 수 있다.
  • 다른 Component의 정보를 알 필요가 없다.

단점

  • 어떤 사건이 발생 시 전체적인 플로우를 찾기가 힘듬. 각각 처리 하므로 실행되는 시점에서는 알 수 없기 때문.
  • 위와 같은 이유로 디버깅이 힘들 수 있다.
  • 또한 순차적인 행위를 하기에 어려움이 있다. A → B → C→ D의 순으로 진행돼야 한다면 이벤트 시스템만으로는 힘듬.

EntityEventSystem

Component는 Entity를 중계자로 사용할 수 있다. 각각의 Component는 Entity를 통해 핸들러를 등록하고, 이벤트 발생도 Entity를 통해 할 수 있다. sender 역시 엔티티를 통해 이벤트를 발생하는 것이 가능하며, 이 때 엔티티는 Handler들에게 해당 이벤트를 전송하는 역할을 합니다.


엔티티 생성

  • SpawnByEntity맵에 배치된 엔티티와 동일한 엔티티를 생성하는 방법
void SpawnByEntity() 
{ local entity = _EntityService:GetEntityByPath("/maps/map01/monster-8") -- 배치된 엔티티 우클릭 - Copy Entity Path를 선택해 Path를 가져옵니다. 
  local name = entity.Name .. "Copy" -- 생성될 엔티티 이름 설정 
  local spawnPosition = Vector3(0,0,0) -- 생성될 위치 설정 
  local spawnEntity = _SpawnService:SpawnByEntity(entity,name,spawnPosition) 
  if isvalid(spawnEntity) == false then log("Spawn Failed") end }
  • SpawnByModelId
void SpawnByModelId()
{
    local id = "maplestorymonster$0108737afb9548309c03795430b20c05" -- Copy Model ID를 눌러 복사했던 ID를 붙여넣습니다. 앞에 "model://"은 제거합니다.
    local name = "SpawnedEntity" -- 생성될 엔티티 이름 설정
    local spawnPosition = Vector3(0,0,0) -- 생성될 위치 설정
    local parent = _EntityService:GetEntityByPath("/maps/map01") --생성될 엔티티의 부모 엔티티

    local spawnedEntity = _SpawnService:SpawnByModelId(id, name, spawnPosition, parent)
    if isvalid(spawnedEntity) == false then log("Spawn Failed") end

Workspace에 추가한 모델 중 한 가지 모델을 지정하여 엔티티로 생성


엔티티 제거

[server only]
void OnUpdate(number delta) 
{
    if isvalid(self.SpawnedEntity) == false then return end
    if self._T.time == nil then self._T.time = 0 end

    self._T.time = self._T.time + delta

    if self._T.time >= 3 then
    self.SpawnedEntity:Destroy() -- _EntityService:Destroy 대신 Entity:Destroy로 교체.
    end
}

Entity:Destory를 사용한 스크립트


엔티티 유효성 체크

[server only]
void OnUpdate(number delta)
{
    if isvalid(self.SpawnedEntity) == false then return end
    if self._T.time == nil then self._T.time = 0 end

    self._T.time = self._T.time + delta

    if self._T.time >= 3 then
        local isvalidValue = isvalid(self.SpawnedEntity)
        log("Before deletion : "..tostring(isvalidValue))
        self.SpawnedEntity:Destroy()
        isvalidValue = isvalid(self.SpawnedEntity)
        log("After deletion : "..tostring(isvalidValue))
    end
}

유효성 체크는 글로벌 함수인 isvalid를 통해서 할 수 있습니다