Event System의 구성
Event 기반은 기본적으로 "행동을 실행해야 할 주체"에서 행동을 관리한다. 즉, 행위가 일어난 주체에서는 행위가 일어났을 때 행동에 필요한 정보와 타이밍만 알려주고 뭘 해야 할지는 각각 행동을 실행해야 할 주체에서 결정.
- Event: 로직 상에서 어떤 사건의 발생을 의미
- Handler: 해당 Event를 받았을 때 처리하는 행동의 주체
- 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를 통해서 할 수 있습니다