흐어엉 복잡하고 어렵구만 ……….. 뭔가 자바스크립트 같이 간단하게 만들 수 있는 이벤트 처리만 자주 하다가 이렇게 복잡한 거 하려니까ㅑ 진짜 힘든 것 같다.
📌함께 보면 도움이 되는 가이드
Event
= 개체와 개체 사이에 뭔가를 주고 받는 형식
WorkSpace의 BaseEnvironment / NativeScripts / MODEvent 에서 다양한 이벤트 종류 확인 가능
Native Component와 사용자 정의 Component 간의 소통을 가능하게끔 함
Event : 로직 상에서 사건의 발생을 의미 (Event의 종류의 식별 정보, 추가 정보 소유)
Handler : 해당 Event를 받았을 때 처리하는 행동의 주체
Sender : 해당 이벤트를 발송하는 객체
장점
단점
create EventType을 눌러서 새로운 이벤트 제어 스크립트를 만들 수 있음
-- LogEvent
LogEvent {
Property: -- property는 사용하지 않기도 함
number message = 0
Function:
-- 여기서 직접 함수를 정의/호출해 처리해줘도 되지만,
-- 이벤트를 통해 받는 곳과 보내는 곳을 분리해 모듈화, 캡슐화 할 수 있음
}
-- MyComponent
MyComponent {
Property:
Function:
void OnBeginPlay() {
for i = 1, 10 do
local LogEvent = LogEvent()
LogEvent.message = toString(i)
self.Entity:SendEvent(LogEvent)
wait(1)
}
Entity Event Handler:
HandleLogEvent(LogEvent event) {
local message = event.message
log(message)
}
}
기본적으로 엔티티 안에 다양한 컴포넌트가 존재, 컴포넌트 안에서 Event Handler
를 등록하게 됨 !
해당 엔티티에서 등록된 이벤트가 발생했음을 알려주기 위해서는 Entity:SendEvent
를 이용함
이벤트 등록 / 발송은 같은 컴포넌트 내에서 이루어질 수도 있고 다른 컴포넌트끼리 이루어질 수도 있음
다른 엔티티 간의 이벤트 전달도 가능함 !
local rabbitEntity = _EntityService:GetEntity(entityID)
rabbitEntity:SendEvent(LogEvent)
다른 곳에서 이벤트를 받아올 수도 있음 → self 에서 변경 …
-- 유저 엔티티로는 다르게 접근 !!
local localEntity = _UserService.LocalPlayer
localEntity:SendEvent(LogEvent)
이벤트 종류마다 이벤트를 누가 쏘는가가 달라짐
일반적으로 UI, Input 등에서 오는 이벤트를 처리할 수 있음
rigid body 등에서 foothold 관련 이벤트 존재 …
TouchEvent의 경우 엔티티에 TouchRecieveComponent가 존재해야 함
피격 이벤트 ( Hit Event )를 발생시킬 수 있음
ChatBalloonEvent 사용하기
self.Entity:ConnectEvent()로 설정 가능 → 콜백 함수 사용 !
기존 컴포넌트에서 확장한 형태의 컴포넌트를 만들 수 있음 ! ( 상속 같은 느낌 )
→ Event 사용 없이 Native와 Custom 연결 가능
일반 컴포넌트와 같이 새로운 함수, 프로퍼티 등 작성 가능
Overridabe Function
→ 앞에 override가 붙으며 몇 가지의 기존 함수를 재정의할 수 있음