projectile 총 쏘는 거 트레이스 채널 확인 / attack 채널 확인 / 데미지 프레임워크 확인 //

 

콜리전과 트레이스 채널에 대한 메모

물리 엔진의 활용을 위해서는 콜리전Collision이라는 물리적 충돌 영역을 설정해야 함 
언리얼 엔진에서 콜리전의 제작 방법은 다음과 같음.
- 스태틱메시 애셋: 스태틱메시 애셋에 콜리전 영역을 심을 수 있음. 에디터에서 설정 가능. 설정 시 스태틱메시 컴포넌트에서 비주얼과 충돌 두 가지 기능을 설정하여 관리할 수 있음.
- 기본 도형Primitive 컴포넌트: 구체, 박스, 캡슐 등의 기본 도형으로 충돌 영역을 지정함. 스켈레탈 메시를 움직일 때 주로 사용함.
- 피직스 애셋: 특정 상황에서 캐릭터의 관절이 흐느적거리는 Ragdoll 효과를 구현할 때 사용함 (일반적으로 캐릭터의 이동은 캡슐 컴포넌트를 사용). 스켈레탈 메시에만 사용 가능함.

플레이어의 상호작용을 가능하게 하려면 물리 설정을 알아야 함. 
1. 콜리전 채널과 기본 반응
2. 콜리전 채널의 용도
3. 다른 콜리전 채널과의 반응

 

충돌체에는 반드시 하나의 콜리전 채널을 설정해야 함. 콜리전 채널은 액터의 종류에 따라 부여되는 컴포넌트가 달라짐.
- WorldStatic: 움직이지 않는 정적인 기본 액터에 사용함. 주로 스태틱메시 액터에 있는 스태틱메시 컴포넌트에 사용함.
- WorldDynamic: 움직이는 액터에 사용함. 블루프린트에 속한 스태틱메시 컴포넌트에 사용함. 
- Pawn: 플레이어가 조종하는 물체에 사용함. 캐릭터의 충돌을 담당하는 캡슐 컴포넌트에 설정.
- Visibility: 배경 물체가 시각적으로 보이는지 탐지하는 데 사용함. 탐지에서 폰은 제외됨. 마우스롤 물체를 선택하는 피킹Picking 기능을 구현할 때 사용함.
- Camera: 카메라 설정을 위해 카메라와 목표물 간에 장애물이 있는지 탐지하는 데 사용함. (GTA 방식의 뷰를 쓸 때 장애물이 캐릭터를 가리면 카메라를 장애물 앞으로 줌인하는 기능에 Camera 채널이 사용되었음)
- PhysicsBody: 물리 시뮬레이션으로 움직이는 컴포넌트에 설정함.
- Vehicle: 탈 것에 사용
- Destructible: 부서질 수 있는 액터에 사용

 

폰의 CapsuleComponent > Collision Enabled 에서
- Query: 두 물체의 충돌 영역이 서로 겹치는지 테스트하는 설정. 충돌 영역이 겹치면(오버랩Overlap) 관련 컴포넌트에 BeginOverlap 이벤트가 발생함. 지정 영역에 물체가 충돌하는지 탐지하는 레이캐스트Raycast와 스윕Sweep도 Query에 속함. 
- Physics: 물리적인 시뮬레이션을 사용할 때 설정.
- Query and Physics: 두 기능을 모두 사용하는 설정.


액터마다 필요한 기능을 파악해 Query와 Physics 설정을 구분하여 지정하는 것이 효과적임. 
콜리전 채널 간의 반응은 다음과 같음
- 무시Ignore: 콜리전이 있어도 충돌 X
- 겹침Overlap: 물체가 뚫고 지나갈 수 있지만 이벤트 발생 X
- 블록Block: 물체가 뚫고 지나가지 못하도록 막음

 

오브젝트 채널: 콜리전 영역에 지정하는 콜리전 채널 (WorldStatic,WorldDynamic, Pawn, PhysicsBody, Vehicle, Destructible)
트레이스 채널: 어떤 행동에 설정하는 콜리전 채널 (Visibility, Camera)
공격이란 공격 애니메이션이 일어나는 특정 타이밍에 공격 범위 안에 위치한 액터가 있는지 감지하고 감지된 액터에게 대미지를 전달하는 행위라고 할 수 있음
어떠한 행동에 대한 물리 판정이 필요할 때도 물리 엔진을 활용 가능함
행동 판정을 위한 트레이스 채널이 제공됨.


트레이스 채널의 활용 예시)
프로젝트 설정 > Collision > 트레이스 채널에 Attack을 추가, 기본 반응을 무시로 설정 
Preset 설정 > 앞서 제작한 콜리전 프리셋 ABCharacter에서 Attack 트레이스 채널과의 설정은 블록으로 지정하면
Attack 트레이스 채널을 사용하는 액터의 물리적 행동은, 캐릭터의 캡슐 컴포넌트에 설정한 ABCharacter 콜리전 프리셋에만 반응하게 됨.

공격 판정을 내리는 로직을 위해 트레이스 채널을 사용해 물리적 충돌 여부를 가리는 함수인 SweepSingleByChannel을 사용.
기본 도형을 인자로 받은 후 시작 지점에서 끝 지점까지 쓸면서sweep 해당 영역 내에 물리 판정이 일어났는지 조사함.
위 함수의 인자로 넣은 요소들
- HitResult: 물리적 충돌이 탐지된 경우 관련된 정보를 담을 구조체
- Start: 탐색을 시작할 위치
- End: 탐색을 끝낼 위치
- Rot: 탐색에 사용할 도형의 회전
- TraceChannel: 물리 충돌 감지에 사용할 트레이스 채널 정보
- CollisionShape: 탐색에 사용할 기본 도형 정보. 구체, 캡슐, 박스 사용
- Params: 탐색 방법에 대한 설정 값을 모아둔 구조체
- ResponseParams: 탐색 반응을 설정하기 위한 구조체


언리얼 엔진은 게임에서 활용할 수 있도록 총 32개의 콜리전 채널을 제공함.
32개 중 8개는 언리얼 엔진이 기본으로 사용, 6개는 엔진에서 다른 용도로 사용하도록 예약되어있음.
게임 프로젝트에서 우리는 18개만 사용 가능함. 
게임 프로젝트에서 새로 생성하는 오브젝트 채널과 트레이스 채널은 ECC_GameTraceChannel 1번부터 18번까지 중 하나를 배정받음.
이는 프로젝트의 Config 폴더의 DefaultEngine.ini에서 확인 가능함.

콜리전 채널 지정 > FCollisionShape::MakeSphere 함수로 탐지에 사용할 도형 제작 > 도형의 탐색 영역 지정 > 탐색 방법 설정 > 탐색 반응 설정 > 액터 충돌 탐지 시 해당 액터에 대한 정보를 얻기 위해 구조체를 넘겨줌

언리얼 실행 환경은 메모리에 떠 있는 언리얼 오브젝트가 사용 중인지 아닌지를 주기적으로 검사한 후 사용하지 않는 물체는 메모리에서 자동으로 제거함 (가비지 콜렉션Garbage Collection)
오브젝트의 사용 여부는 다른 오브젝트가 해당 오브젝트를 참조하는지로 판단함.
FHitResult의 멤버 변수 Actor의 선언이 일반 참조로 선언된다면 해당 함수에서의 참조로 제거되어야 할 액터가 메모리에 그대로 남아있는 문제가 발생함.
해당 문제를 방지하기 위해 FHitResult는 참조로부터 자유롭게 포인터 정보를 전달해주는 약 포인터TWeakObjectPtr 방식으로 멤버 변수를 선언함.
약 포인터로 지정된 액터는 IsValid 함수를 사용해 해당 액터가 유효한지 점검한 후 사용해야 함.

디버그 드로잉Debug Drawing을 활용하여 공격 범위 파악 등의 디버깅을 로그를 보지 않고도 할 수 있음.

언리얼 엔진이 제공하는 대미지 프레임워크를 사용하면 대미지에 관련된 여러 기능을 처리할 수 있음.
언리얼 엔진의 액터 클래스 AActor는 TakeDamage 함수가 구현되어 있음.
- DamageAmount: 전달할 대미지의 세기
- DamageEvent: 대미지 종류
- EventInstigator: 공격 명령을 내린 가해자
- DamageCauser: 대미지 전달을 위해 사용한 도구
대미지 전달 행위에는 피해를 입히는 주체인 가해자와 대미지를 받는 피해자가 있음.
대미지를 가한 진정한 가해자는 폰이 아니라 폰에게 명령을 내린 플레이어 컨트롤러이므로 EventInstigator에는 컨트롤러의 정보를 보내야 함.

액터 설정의 Can be Damaged 속성을 해제하면 대미지의 결과가 모두 0이 되는 무적 상태가 됨.

무기는 캐릭터에 트랜스폼으로 배치하는 것이 아니라 메시에 착용해야 애니메이션에 따라 움직임.
언리얼 엔진은 캐릭터에 무기 등을 부착하기 위해 소켓 시스템을 제공함.

액터에 고정으로 무기를 장착하지 않고 필요에 따라 무기를 교체할 수 있게 하려면 무기를 액터로 분리해 만드는 것이 좋음.

 


 

Projectile은 기본 반응이 블록으로 되어 있음

 

대충 추가한 것들...

 

'[햄] 작업일기' 카테고리의 다른 글

230805  (0) 2023.08.06
230804  (0) 2023.08.04
230725 DataTable을 출력하기  (0) 2023.07.25
230721  (0) 2023.07.21
0718 대화 내용을 엑셀 데이터로 불러오기  (0) 2023.07.18

+ Recent posts