멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon 3주차 3일 회고

Jiwon Lee·2022년 7월 20일
1

MOD x Supporters

목록 보기
9/23

8. Event의 이해와 컴포넌트 확장

🍁 [ 공부 후기 ]

흐어엉 복잡하고 어렵구만 ……….. 뭔가 자바스크립트 같이 간단하게 만들 수 있는 이벤트 처리만 자주 하다가 이렇게 복잡한 거 하려니까ㅑ 진짜 힘든 것 같다.


📌함께 보면 도움이 되는 가이드


🤯 이벤트의 이해

Event = 개체와 개체 사이에 뭔가를 주고 받는 형식

WorkSpace의 BaseEnvironment / NativeScripts / MODEvent 에서 다양한 이벤트 종류 확인 가능

Native Component와 사용자 정의 Component 간의 소통을 가능하게끔 함

  • Event : 로직 상에서 사건의 발생을 의미 (Event의 종류의 식별 정보, 추가 정보 소유)

  • Handler : 해당 Event를 받았을 때 처리하는 행동의 주체

  • Sender : 해당 이벤트를 발송하는 객체

  • 장점

    • 다른 component나 기능 단위에서 결합성이 떨어짐
    • 행위에 대한 액션 추가 희망 시 행위 수행하는 곳 수정 없이 추가 가능
    • 다른 Component의 정보를 필요로 하지 않음
  • 단점

    • 사건 발생 시 전체적 플로우 찾기 어려움 → 디버깅이 어려움
      → 각각 처리하는 로직으로 인해 실행되는 시점에서 알 수 없음
    • 순차적 행위 수행이 어려움

이벤트 제어하기

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) 
		}
}

Entity Event

기본적으로 엔티티 안에 다양한 컴포넌트가 존재, 컴포넌트 안에서 Event Handler를 등록하게 됨 !

해당 엔티티에서 등록된 이벤트가 발생했음을 알려주기 위해서는 Entity:SendEvent를 이용함

이벤트 등록 / 발송은 같은 컴포넌트 내에서 이루어질 수도 있고 다른 컴포넌트끼리 이루어질 수도 있음

다른 엔티티 간의 이벤트 전달도 가능함 !

local rabbitEntity = _EntityService:GetEntity(entityID)
rabbitEntity:SendEvent(LogEvent)

다른 곳에서 이벤트를 받아올 수도 있음 → self 에서 변경 …

-- 유저 엔티티로는 다르게 접근 !! 
	local localEntity = _UserService.LocalPlayer
	localEntity:SendEvent(LogEvent)

🤒 다양한 이벤트 종류

이벤트 종류마다 이벤트를 누가 쏘는가가 달라짐

Service에서 오는 이벤트 처리하기

일반적으로 UI, Input 등에서 오는 이벤트를 처리할 수 있음

Self에서 오는 이벤트

rigid body 등에서 foothold 관련 이벤트 존재 …

TouchEvent의 경우 엔티티에 TouchRecieveComponent가 존재해야 함

HitEvent

피격 이벤트 ( Hit Event )를 발생시킬 수 있음

말풍선 띄우기

ChatBalloonEvent 사용하기

연결 접속 / 끊기

self.Entity:ConnectEvent()로 설정 가능 → 콜백 함수 사용 !


😌 Extend Component

기존 컴포넌트에서 확장한 형태의 컴포넌트를 만들 수 있음 ! ( 상속 같은 느낌 )

→ Event 사용 없이 Native와 Custom 연결 가능

일반 컴포넌트와 같이 새로운 함수, 프로퍼티 등 작성 가능

Overridabe Function → 앞에 override가 붙으며 몇 가지의 기존 함수를 재정의할 수 있음

profile
노는 게 제일 좋은데 공부는 하고 싶어요 😗

0개의 댓글