초보 코린이의 성장 일지

UE4 충돌 및 적과 충돌 본문

언리얼

UE4 충돌 및 적과 충돌

코오린이 2023. 1. 6. 15:25

플레이어가 들고 있는 무기와 객체가 충돌을 하게 만들어 볼 것이다.

 

화면에 보여줘야 하는 객체인 Actor로 생성해 준다.

 

충돌의 관한 Box Collision 컴포넌트를 추가해 준다.

 

각 각 구별을 위해 글자를 입력 할 수 있게 컴포넌트를 추가해 준다.

오른쪽 설정을 통해 적당한 크기를 맞춰주고 구별을 하기 위해 이름도 지어준다. 색상 또한 변경해줘서 구별하면 보기 편하다.

 

화면상에 충돌을 할 수 있는 구역이 하나 생기게 된다.

 

Box로 들어가서 -> 설정 -> 렌더링 -> Hidden in Game 체크되 있는걸 풀어주면 화면상에서 사라진다.

 

충돌할때 중요한 설정이 있다.

Generate Overlap Events = Overlap은 양쪽다 충돌체가 있어야하고 양쪽다 이 옵션이 켜져 있어야 겹침 연산을 하게된다.

 

겹첬을때 화면에 잘 뜨는지 확인하기 위한 노드 작업

충돌이 다 끝나고 나올 메시지 노드 작업

그리고 실행해서 충돌해보면 잘 되었음을 알 수 있다.

 

Actor Begin Overlap이나 Actor 겹침 연산은 잘 사용하지 않는다 다만 보여주기 위한 작업일 뿐 제일 기초적인 방법이므로 사용하지 않을 것이다.

 

다른 방법으로 충돌을 나타낼 것이다.

 

한개 더 Actor을 생성해준다.

 

On Component Begin Overlap = 충돌 받았을때

On Component End Overlap =  충돌이 끝났을때

On Component Hit = 객체와 부딪첬을때

Overlapped Component =  Box 자기자신을 나타냄

Other Actor = 충돌 하러온 객체

Other Comp = Actor 내에 있는 충돌체 

나머지는 나중에 다루게 될 것이다.

 

각 각 구역을 구별 해주기 위해 나눠서 노드를 연결해준다. 노드를 Append로 가져다 붙이면 자동으로 생성되며,

Begin과 End 두가지를 만들어준다.

 

Hit관련해서도 보여주기 위해 Actor 생성해준다.

 

Hit를 표시해주기 위해 노드들을 연결시켜준다. 위와 동일하다

Hit같은 경우는 객체 한쪽만 켜져있으면 된다. 예로 들자면 FPS게임에 총알이 날아가서 벽면에 부딪첬을때

큰 맵인 경우 하나하나 맵에 Hit 켜주게 된다면 프로그램에 있어 만든 연산을 하게 된다. 그래서 총알에 적용을 해준다면

하나의 객체로 계속 부딪치기 때문에 편하게 관리할 수 있다.

 

 그리고 아래 표시를 눌러서 옵션을 더 상세하게 열여서 설정도 해 볼 것이다.

 

 

콜리전 프리셋을 눌러보면 더 많은 설정들이 나오게 된다.

OverlapAllDynamic = 모든 애들에 대해 겹침 연산을 수해하게 된다. 그래서 Hit연산을 하지 않는다

근데 우리는 Custom으로 설정하고 우리가 원하는 방향으로 수정 할 것이다.

우선 콜리전 프리셋을 눌러보면 4가지가 나오게 된다. 단일충돌일때는 상관이 없으며 단일겹침, 단일블록이 아니라면 다른걸로 바꿔줘야한다. 

Collision Enabled = 여러개가 겹처있다면 이 옵션으로 바꿔줘야한다.

Query Only = 물리적힘(Hit)이 들어갔다면 변경

Physics Only = 블럭이 물리적힘의 막히는 상황

 

 

위 여러가지 옵션 중 플레이어로 가서 -> 콜리전 -> 콜리전 프리셋 -> Pawn을 블록으로 체크를 해준다면, 플레이어는 충돌 객체를 통과하지 못하고 벽에 부딪히면 충돌이 이뤄지게된다.

 

이번에는 복합충돌을 해볼것이다. 물리적힘을 가지고 있는 객체는 충돌을 막을 것이다.

큐브를 맵 아무곳에나 하나 생성해준다.

옵션에서 보면 Simulate Physics를 체크해 준다. 그러면 밑에 클리전 프리셋이 바뀌게된다.

이 옵을 적용하고 실행을 하면 아래와 같이 나온다.

물리적 힘을 받는 큐브 객체가 공중에서 중력의 힘을 받고 내려오고 충돌객체와 닿는 순간 메시지가 나온다.

그리고 큐브는 통과를 못하지만 캐릭터는 겹침연산으로 자연스레 사이를 통과할 수 있다.

 

이제 플레이어가 들고있는 무기가 충돌을 하게끔 만들어 볼 것이다.

 

 

 

플레이어에서 칼을 생성할때 이미 Owner에 Self을 우린 줬을 것이다. 그래서 이미 칼에 존재를 알고 있기때문에 Other Actor에서 같지 않다면 DestoryActor을 해주면 된다.

DestoryActor = 제거하는 것

 

하지만 벽을 처도 벽이 사라지지 않을 것이다. 위에서 언급한것처럼 Generate Overlap Event가 체크가 되어 있지 않기 때문이다. 그럼 체크를 해준다면 이제 칼이 닿으면 사라질 것이다.

 

여기서도 문제는 칼이 닿으면 없어지는게 아닌 칼이 공격할때만 사라지게 만들어 줄 것이다.

BeginPlay를 사용해 충돌체를 기본으로 꺼놓고 시작하게 만들 것이다. 위에 보이는 바 Capsule를 가져와 처리해준다.

Set Collision Enabled는 아까 설정란에 보인것과 동일하다.

 

이제 노티파이를 하나 생성해준다.

 

셋팅을 동일하게 설정할 것 이다

Received_NotifyBegin

플레이어 안에있는 칼을 가져오고 그 칼안에 있는 충돌체를 가져온다. 그리고 Begin상태를 켜줘야한다.

기본적인 틀은 노티파이 만들어서 셋팅하는거와 동일하다. 그리고 New Type를 Collision Enabled로 바꿔줘야한다.

 

Received_NotifyEnd

End도 동일하게 해주고 New Type만 No Collision으로 변경해준다.

 

이제 애니메이션을 들어가 구간을 설정해줘야한다.

Attack_1
Attack_2

 

Attack_3

전 블로그 내용과 동일하며, 위에 노티파이 -> 트랙 -> 노티파이 트랙 추가를 눌러서 위와 같은 Collision 구간을 정해준다.

 

이제 칼을 뺀 상태로 객체에 닿아도 객체가 사라지지 않으며, 칼을 휘두를때만 사라지게 변경되었을 것이다.

이제는 객체인 적을 생성해서 동일하게 진행해보자.

 

Enemy라는 폴더를 하나 만들고 플레이어와 동일하게 Enemy 클래스를 만들어준다.

동일하게 설정해준다.

 

 

셋팅은 동일하다 플레이어를 복사하여 가져와서 만들었기 때문에 변수에 Player -> Enemy로 변경해준다

 

동일하게 BP_Enemy만 변경해준다.

아래에 노드도 플레이어꺼를 가져온것이기 때문에, Sword와 Move 등등 모션을 다 제거해준다. 그럼 위와 같은 노드가 나올것이다.

 

이제 만들어 놓은 Enemy를 올리고 설정값으로 알맞게 만들어주면 된다.

Ait 누르고 복사해서 여러 객체한테 실험해 봐도 된다.

Enemy 삭제가 잘 된다면 완성된 것이다.

 

이제 커스텀도 가능해 진다.

전에 만들었던 머터리얼을 인스턴스 생성으로 만들어주면 위에 사진과 같은 인스턴스가 만들어진다.

만들어진 Body_Inst는 몸통, Logo_Inst는 가슴팍에 있는 로고를 나타낸다. 그리고 이 인스턴스들 에디터 상에서만 현재 수정 할 수 있다.

 

BP_Enemy 노드를 연결했다.

Mesh에서 ->Get Mataerials를 가져와 -> 반복문인 For Each Loop를 생성해 이어준다. 

만든 배열 변수 Materials를 가져와 -> 추가해주기 위해 ADD를 써서 받아준다 -> Mesh를 다시한번 가져와서 -> Set Material에 연결해준다 -> 그리고 Set Material에 누구를 넣어줄 것이냐 -> Create Dynamic Material Instance를 연결해준다.

이 3가지는 배열로 만들고 받아줘야한다. For을 돌릴꺼기 때문

그리고 확인을 위해 머터리얼을 Set Vector에 연결해준다. Name는 BodyColor로 지어준다.

Enemy가 검은색으로 셋팅된다.

 

플레이어도 만든 머터리얼에 색상을 입혀서 넘겨주면 변하게된다.

이렇게 커스텀도 가능하다는것을 보여주고 싶었다.

 

 

- 이제는 전투 구현을 하게 될 거 같다

- 기능이 이렇게 잘 짜여져 있다는게 신기하다.

Comments