Object Channel 생성 및 Collider 상호작용
오늘은 콜리전 채널 추가 및 충돌 처리에 대해 다뤄보고 아이템 박스와 Player Weapon의 충돌을 시켜보겠습니다.

Object Channel : "충돌 대상의 타입"
Trace Channel : "Ray Cast시 사용할 필터 기준 "
이제 아이템 박스를 만들어보자
위에서는 PlayerWeapon 과 Item 채널을 추가해주었다.

다음과 같이 세부 설정을 한다 Object Type은 Item이고 Player Weapon만 충돌 처리를 할 수 있도록 설정하고
Event Graph에서는 원래 해당 Actor가 무엇인지 체크해야하지만 현재는 Player Weapon 하나만 검사하므로 그냥 Get Actor를 통해 받아온다 ( 원래 이러면 안됨!)
이제 박스와 충돌할 PlayerWeapon을 설정해보자

다음과 같이 Item만 충돌 검사를 하도록 설정한다.
마지막으로 아이템과 충돌했을때 아이템이 터지는 이펙트가 나오도록 EventGraph 설정

애니메이션 이펙트 추가해보기

추가하고 이펙트를 출력할 위치를 start와 end 장소 설정하기 ( Effect Start , Effect End )

다시 몽타주로 돌아와서

Trail이 나올 위치 설정을 Trail notify를 클릭 후 Detail에서 사용할 trail effect와 소켓 위치 설정해주기
파티클 이펙트 추가해보기



몬스터 추가 및 피격효과 추가해보기
우선 몬스터를 추가해주자
몬스터는 추가하는 과정은 다음과 같다.
- Character 클래스를 상속받은 Blueprint 생성
- 해당 몬스터가 사용할 Animation Blueprint 생성
- 해당 몬스터의 상태를 나타낼 Enum 자료형 Enumeration Blueprint 만들기
- PlayerWeapon과 충돌 체크 및 BP_Weapon에서도 Monster와 충돌 체크하기
해당 작업까지 마쳤으면, BP_Monster의 Animation의 Anim Class를 만들어준 Anmation Blueprint 설정해주기.

이제 다음 작업으로는 몬스터가 피격 당했을 시 충돌처리와 충돌 처리를 받았을 때 피격효과를 나타내 볼려고 한다.
우선 해당 몬스터의 Material로 들어가 현재 어떻게 노드 구성이 이루어 졌는지 확인해보자.

다음과 같이 나와있으며, 해당 노드에 이제 피격효과를 주기 위해서

Fresnel 효과를 통한 즉 외곽선만 빨간색으로 칠해주는 효과를 주어봤다.
잠시 효과를 확인하기 위해 HitValue의 Default Value을 1로 설정했으므로 다시 0으로 바꾸고 저장하자.
그리고 해당 Material을 Instance로 만들어 Parameter만 쉽게 따로 관리할 수 있도록 하자.


이제 해당 Material을 다시 적용하기 위해 BP_Bear로 돌아가준다.

빨간 박스를 유의 깊에 체크하면서 설정하자.
Paramet Name은 Material에서 설정한 해당 Parameter Name 으로 그리고 Material은 만들어준 Instance로 교체하자
여기서 HitEffect은 Add Timeline을 통해 추가한 Component로 더블 클릭하면 다음과 같은 창이 열린다

해당 창에서는 이제 Material Parameter에 설정한 HitValue 값을 1에서 0으로 감소하는 그래프를 만들어 줄 것이다 .
해당 점을 추가하는 방법은 마우스 우클릭을 통해 추가해주면 된다.
해당 component는 tick처럼 작동하여 해당 시간동안 계속해서 업데이트 되어 Value 값을 세팅해준다.

몬스터에게 데미지 전달하기
몬스터에게 데미지를 전달하기 위해서는 다음과 같은 순서가 필요합니다
- BP_Weapon의 Attack Collision의 OnComponentBeginOverLap 이벤트에서 Apply Damage 이벤트를 통해 데미지를 전달
- Apply Damage 이벤트를 받기 위해서는 Event AnyDamage 이벤트를 받아와야 한다.
- 따라서 데미지를 받을 BP_Bear에 Event Any Damage 노드를 추가
- 데미지를 받는다면 Monster의 Hp가 깍여야 하므로 몬스터에 Hp Component를 추가 하여 hp를 관리
- Hp를 담당하는 Actor Component ( BP_HpController)를 추가한다
- BP_Controller에서는 데미지를 받을 시 어떤식으로 hp을 깍을 지 계산하고 hp가 0보다 작다면 Dead 이벤트를 Call한다.
Monster Death 이펙트 ( Dissolve 표현해보기 )

일단 Dissolve Effect를 표현하기 위해서는 투명도를 설정하는 기능의 노드를 풀어줘야한다.
그 노드가 바로 Opacity이다.
우선 Opacity Mask를 사용하기 위해 왼쪽 Detail에서 Blend Mode를 Masked으로 바꾼다.
그래서 Opacity Mask 값이 1이면 완전 투명 0이면 불투명으로 바꿔준다.

Matreial을 다룰 때 Conver to Parameter 하여 Material Instance에서 다음과 같이 조절하면서 볼 수 있으니깐 잊지말자!.
위와 같이 노드를 설정하고 나서 BP_Bear에서 다음과 같이 Material Parameter 로직 처리를 진행한다.


몬스터 행동트리 만들어보기
몬스터 Ai를 만들기 위해서는 3가지가 필요하다
- AIController
- Pawn을 조종하는 컨트롤러로 사람이 조종하면 Player Controller 이며 AI가 조종하면 AIController이다.
- 실제 역활로는 Behavior Tree 실행 및 Blackboard 값을 관리한다.
- behavior Tree
- 행동을 트리로 나눠서 관리하는 장소
- Root(시작점) 트리 시작 노드로 Blackboard와 연결된다.
- Composite(흐름 제어)로 어떤 행동을 실행할지 결정한다.
- Sequence ( 순차 실행 ) : 위에서 아래로 순차적으로 실행하며 다 성공해야 원활하게 움직이며 하나라도 실패하면 중단한다.
- Selector ( 우선 순위 ) : 왼쪽에서 오른쪽으로 조건 체크하면서 가능한 것 하나라도 성공하면 "OK"
- Task ( 실제 행동 ) : 진짜 실행되는 코드
- black board
- AI가 사용하는 공유 변수 저장소 ( 기억 공간으로 메모장으로 생각해도 좋다 )
- 즉, 판단하려면 데이터가 필요한데 이 데이터를 저장하는 곳이 Blackboard 이다.

그 다음 우선 데이터로 사용할 변수들을 blackboard에 만들어 주자

이러면 3개의 변수가 생성된다
그 다음으로는 해당 행동 트리를 동작시킬 AIController를 생성해주자

우선 Event on Possess를 블록을 만들어준다
Event On Possess란?
- AIController가 Pawn(캐릭터)을 점유하는 순간 호출되는 이벤트이다.
- 즉 AI의 초기화 이벤트라고 보면 될 것 같다
정확히 언제 호출되는가?
- 레벨 시작 시 (Auto Possess AI)
- Spawn된 Pawn을 AlController가 소유할 때
- Controller가 Pawn을 바꿔 탈 때

실행 명령 순서는 다음과 같다.
1. Sequnce Then 0 으로 Use Blackboard block을 실행하여 사용할 Blackboard을 설정해준다.
2. Sequnce Then 1 으로 Behavior Tree를 실행 시켜 준다.
3. Sequnce Then 2 으로 Blackboard에사 저장한 Home Location 키값을 통해 해당 변수에 값을 저장해준다.
(반드시 Default 값을 키 값으로 저장할 것 HomeLocation 으로 외부에 보이는 key는 내가 지어준 것 )
4. Sequnce Then 3 으로 Blackboard에서 마찬가지로 저장한 키값을 통해 해당 변수에 값을 저장해준다.

오른쪽 상단 위의 빨간 박스에서 디버깅 할 Controller을 설정해 주어야만 Behavior Tree또한 simulate과정이 진행된다.
여기까지가 Blackboard와 AIController을 설정한 것이다.
다음으로는 BehaviorTree을 생성하고 위에서 만든 것을 넣어서 연결해보자

행동트리 블루프린트를 만들면 일단 Root에서 어떤 Blackboard을 사용할 것인지 선택해주어야 한다.
다음으로는 Sequnce block을 만들어주고 다음으로는 3가지 Task가 있는데 왼쪽부터 살펴보겠다.
- Wait Blackboard Time
- 언리얼에서 기본 제공하는 Task 노드로 blackboard에서 시간을 가져온다

설정한 변수의 시간만큼 대기하다 FinsishExecute를 반환하여 다음 Task을 진행 시키도록 한다.
- BTTask_SelectPatrolLocation
해당 Task는 내가 만든 Task Node로 Blueprint 생성에서

다음 메뉴를 선택해주면 된다.

해당 블루프린트에서는 네비게이션을 기반으로 랜덤으로 이동 가능한 위치를 검색하는 Task를 담당한다.
간단하게 HomeLocation을 시작지점을 기준으로 반지름 400인 원의 범위 만큼 주위를 배회하도록 랜덤으로 값을 제공해주는 기능
이다.
- Move To Task
Move To Task는 AIController가 Navigation 시스템(NaviMesh)을 기반으로 목표 위치까지의 경로를 계산하고, Pawn의 Movement Component를 통해 해당 위치로 이동시키는 Task이다.
이렇게 하면 간단한 몬스터 AI가 완성되고 적용하는 방법은 다음과 같다.

NaviMesh 설치하는 방법

다음 사진과 같이 Navi Mesh를 설치하기 위해서는 Place Actors 에 Bolumes를 선택하고 Nav Mesh Bounds Volume를 드래그하면 된다.
드래그 한 후 크기를 넓혀 네비매쉬의 범위를 설정한다

해당 네비 매쉬를 바닥에 설치할때는 MainLevel에서 설치해주어야 한다.
또한 해당 사진처럼 영역을 보기 위해서는 Lit 옵션이나 혹은 p를 누르면 볼 수 있다.

Nav Build Paths를 하는 이유는 네비 매쉬를 배치한 이후 언리얼이 지형을 분석하고 이동 가능한 영역 판별하고 경사 및 장애물 체크를 하고 Nav Mesh를 최종적으로 생성하기 때문이다.
