본문 바로가기
게임개발/NEXON PROJECT MOD

멋쟁이사자처럼 X 넥슨 MOD Supporters Hackathon 5주차 회고

by tripleup 2022. 7. 1.
728x90
반응형

[MOD 강좌 Chapter  9] 컴포넌트의 활용1


 

충돌 : 충돌체를 포함하고 있는 엔티티의 충돌 영역이 서로 교차했을 때

충돌체는 TriggerComponent 또는 HitComponent와 같은 컴포넌트를 엔티티에 추가하면 자동으로 생성

HitComponent는 피격의 범위를 설정할 때, TriggerComponent는 충돌이 일어나는 범위를 설정할 때에 충돌체를 사용
ColliderOffset, BoxSize, CircleRadius 등의 프로퍼티로 충돌체의 속성 설정 가능

 

충돌체 크기, 위치 편집

세부적인 충돌체의 크기, 위치, 형태 등은 충돌체를 지닌 컴포넌트의 프로퍼티를 통해 설정

TriggerComponent나 HitComponent와 같이 충돌체를 지닌 컴포넌트에서 공통으로 제공되는 프로퍼티 목록

1. Collider

프로퍼티 에디터에서 "Edit" 버튼을 누르면, 해당 엔티티에 충돌체가 나타나며, 충돌체를 편집할 수 있는 상태가 됨

충돌체 자체를 마우스로 잡아 드래그하여 충돌체의 위치를 설정할 수 있고, 핸들러를 조절하여 충돌체 크기를 설정

 

2.BoxOffset과 ColliderOffset

충돌체의 위치를 설정

값 타입은 Vector2이며, 엔티티의 중심점으로부터 얼마나 떨어져 있는지를 설정

예) BoxOffset의 값이 (0, 0)이면 충돌체는 엔티티의 중심점에 위치하게 되고, BoxOffset의 값이 (1, 1)이면 충돌체는 엔티티의 중심점으로부터 x = 1, y = 1만큼 떨어져 있게 됨

 

3.BoxSize

ColliderType이 Box일 때, 충돌체의 크기를 설정


BoxOffset과 마찬가지로 값 타입은 Vector2이며, 충돌체의 가로, 세로 크기를 설정
x값은 가로 크기를 의미하고, y값은 세로 크기를 의미하며, 값은 0보다 큰 양수로 설정

4. CircleRadius

ColliderType이 Circle일 때, 충돌체의 크기를 설정
값은 충돌체의 반지름 값을 입력

5. ColliderType

충돌체의 형태를 선택
Box는 충돌체의 형태를 사각형으로, Circle은 원형으로 변경
Circle은 IsLegacy가 false일 때 사용 가능

6. IsLegacy

TransformComponent에 영향을 받을지를 설정
IsLegacy값이 true일 때는 TransformComponent에 영향을 받지 않지만, false일 때는 TransformComponent의 Scale과 Rotation에 영향을 받으며 Circle 타입의 충돌체를 적용

 

TransformComponent의 Scale과 Rotation에 따른 충돌체 변화

1. Transform.Scale 변화 예시

https://youtu.be/4Ri0CpWg6RY

 

2. Transform.Rotation 변화 예시

https://youtu.be/xox3H77CDNg

TriggerComponent를 활용한 충돌 이벤트 발생 시 액션 수행

이벤트에 대한 액션은 EntityEventSystem을 활용하거나 확장된 TriggerComponent의 함수를 오버라이드해서 추가

 

1. Entity Event System을 이용한 충돌 시 액션 추가

충돌 이벤트가 발생했을 때 액션을 수행할 핸들러(또는 리스너)를 Entity에 등록하고, TriggerComponent를 통해 이벤트가 발생하면 핸들러로 등록한 함수가 호출되는 구조

 

2. 확장 TriggerComponent 를 활용한 충돌 처리

TriggerComponent에는 엔티티에 충돌 이벤트가 발생했을 때 호출되는 자체 함수가 존재합니다. 따라서 해당 함수를 활용하면 엔티티가 충돌했을 때의 처리를 추가 가능

 

함수 오버라이드

확장된 TriggerComponent에서 함수를 추가할 때, 다른 스크립트 컴포넌트와는 달리 선택할 수 있는 함수가 늘어나 있음
이 함수들이 충돌 이벤트가 발생했을 때 호출되는 함수들로, 추가 시 해당 함수의 정의부를 편집하여 오버라이딩

원하는 이미지 갖고오기
이미지 불러오기

1. Workspace - MyDesk에서 마우스 오른쪽 버튼을 눌러 컨텍스트 메뉴를 열고, Import From - Import Image를 선택

2. 사용할 이미지를 선택해 이미지를 불러옴(MyDesk 엔트리 아래에 불러온 이미지 파일이 개별로 생성)

3. 원하는 방식으로 이미지를 활용

 

이미지 활용 방식

1. Workspace - MyDesk에서 사용할 이미지를 누르고 컨텍스트 메뉴를 열어 Place To Scene Maker를 선택

2. Workspace - MyDesk에서 사용할 이미지를  Scene에 끌어다 놓음

3. Workspace - NativeModel에서 필요한 모델을  Scene에 배치하고, Sprite RUID/Image RUID를 변경해 사용


[MOD 강좌 Chapter 10] 컴포넌트의 활용2


InputService를 활용한 입력과 액션
InputService 작동 원리

유저가 키를 누르거나, 혹은 모바일의 화면을 터치하는 등의 입력이 들어오게 되면 InputService에서는 유저의 입력에 대한 이벤트를 발생시키게 되는데, 우리는 이 이벤트에 대한 핸들러를 추가하여 이벤트에 대한 액션을 수행
유저의 입력에 대한 이벤트는 클라이언트에서만 발생하기 때문에, 각 이벤트 핸들러 역시 클라이언트에서만 실행

공격에 대한 이해와 구현

공격이라는 행동을 정의 ( `캐릭터로 Ctrl 버튼을 눌렀을 경우 발동하는 Attack 상태로 정의)

 

공격과 피격의 관계

공격을 담당하는 Attack 컴포넌트는 반드시 피격을 위한 Hit 컴포넌트가 있어야 충돌 가능


충돌을 발생했다 하더라도 명중 여부는 분리해서 판단
예를 들어 플레이어가 슬라임을 공격할 때 명중시키는 경우와 헛치는 경우

여기서 명중에 실패한 케이스라면 공격자의 IsAttackTarget에서 false를 반환하고 더 이상의 절차를 생략


명중에 성공했다면 기본 리턴 값을 그대로 사용하고 피격자의 IsHitTarget에 나머지 역할 맡김
-> 공격자 입장에서 공격을 명중했다 하더라도 피격자 입장에서 그 공격을 피할 가능성이 있기 때문

절대 명중 개념을 사용하고자 한다면 공격자의 IsAttackTarget을 true로 반환
-> 피격자의 IsHitTarget은 호출되지 않고 무조건 데미지를 입히는 절차로 진행

공격자의 IsAttackTarget을 true로 반환했거나 피격자의 IsHitTarget이 true를 반환하면 데미지를 피격자에게 적용


먼저 공격자 입장에서 CalcDamage 함수를 이용해 적용하고자 하는 데미지를 반환
원작의 메이플스토리에서 물리 공격력과 무기 공격력 등을 참고하여 데미지를 결정하는 상황처럼 사용
피격자의 OnHit 함수는 이 데미지를 인자값으로 전달받아 변환


(예를 들어 공격자의 공격력을 참고한 데미지가 전달됐지만 방어자의 물리 방어력 등을 적용해서 차감시키는 상황)

이 모든 과정이 완료되고 OnHit 함수의 리턴 값이 최종 데미지가 됨


OnHit 함수는 호출될 시 HitEvent를 발생 시킴

이 HitEvent를 받아 처리할 수 있는 HitEvent 함수도 기본적으로 제공

728x90
반응형

댓글