초보 코린이의 성장 일지

UE4 카메라 시점 고정, Fist 충돌 본문

언리얼

UE4 카메라 시점 고정, Fist 충돌

코오린이 2023. 1. 20. 14:22

카메라 시점 연산 및 Fist 충돌, Shake 추가를 해보겠다.

 

Sphere 총 4개의 충돌체가 필요하다 양손, 양발 Mesh 소켓에 추가해 주게 될 것이다.

소켓을 알맞는 부위 4군데에 적용해준다.

 

다시 Combo_Fist로 돌아와서 이벤트그래프 작성을 해준다.

부모에 있는 Collisions를 가져와서 for문을 돌린다.

Array Element가 컴포넌트이며, 충돌체기 때문에 붙이려면 AttachComponent To Component로 선언해줘야한다.

Character의 Mesh에 붙여야 하므로 가져와서 붙여 준다.

Attach 안에 Nmae 부분 보라색은 이름을 표기해주는 부분이며, 상수(가변) 문자열이라 대소문자 구분을 안해줘도 된다.

Get Object Name으로 연결해주면 String에서 바뀌게 된다.

 

다시 Weapon_Combo로 간다

 

사용할 변수
OnBeginOverlap

구현방법 - 배열을 하나 만든다 충돌을 하면 배열에 추가하고 또 다시 충돌을 했을때 배열에 이미 있는 Enemy라면 추가를 안하고 충돌이 끝날때 OffCollision일때 리스트를 날려준다. 그 다음 동작에 Hit는 다시 시작되니까 하나의 동작에는 한개의 데미지만 들어가게 되는 구조

 

변수 Hitted를 선언하고 변수 유형은 데미지를 받을 유형이 캐릭터이므로 Character로 받아준다. 그리고 배열로 설정

other를 Hitted에서 찾아야 하므로 Find로 연결 하지만 0 보다 작으면 못찾는다고 조건을 걸어준다.

못찾앗으니 내부적으로 for문을 한번 돌아서 있는지 체크한번 해주는 Addunique로 중간에 확인해준다. 앞에 find를 사용해서 그냥 add를 사용해도 되지만 예외처리를 깔끔하게 해주기 위한 방법

 

그리고 이제 리스트를 날려줘야 하므로 OffCollision으로 돌아간다.

Hitted를 clear로 날려주면 완료. 

이제는 한대 이상 피격이 되지 않을 것이다.

 

이제는 주먹을 내지를때 빗겨친다면 앞으로 나가는 모션이 생긴다. 그러면서 적을 지나치게 되는데 콤보를 넣는다면 포커스를 하나의 두고 공격을 취해야한다. 그래서 Player 정면에 있는 Enemy를 지정하고 플레이하게 만들어 볼 것이다.

방법은 Player 카메라를 이용해서 구현해 볼 것이다. 

카메라를 Hit가 들어가는 시점부터 Player을 고정되도록 만들면 된다

 

사용할 변수, 함수
Get Fixed Camera

return 전용이라 퓨어 체크해줘야한다.

Enable Fixed Camera
Disable Fixed Camera

이름 그대로 반대로 bool 변수 체크

 

이제 플레이어도 이동

만들어 놓은 MovingComponent를 가져다가 Get으로 선언 그 후 안에서 Get Fixed Camera를 연결

Fixed Camera가 false일때만 양쪽다 움직이도록 조건 설정

 

이제 매크로로 사용하는 Weapon으로 이동

중간부터 노드를 생성했다.

Moving를 가져다가 if 조건을 걸어준다. ture때는 이미 가고 있는거라 false에서만 체크해준다.

FDoActionData에 있는 Fixed Camera를 가져와서 if에 연결해준다.

Moving가 true일때만 Enable Fixed Camera로 연결

 

EndDoAction

고정된 상태로 좌우가 안풀리기 때문에 Weapon으로도 와서 마지막 부분에 Moving를 받아 Disable Fixed Camera와 연결해준다. 그러면 좌우로도 다시 이동가능

 

기능들을 도와주기 위한 함수 라이브러리를 하나 만들어준다.

이 안에서는 전역에 쓸수 있는 static 함수가 된다.

 

사용할 변수, 함
GetNearlyFrontAngle 입력, 출력 설정

중요한건 InArray를 참조전달로 체크해주기 그냥하면 복사전달이 되므로 체크 꼭 필요 대신 const는 못붙인다

 

for문을 돌려준다 배열로 만든 InArray와 연결 다 돌려주면서 내적을 해야하기 때문

일단 내적을 해야하므로 방향을 만들어줘야한다.

GetActorLocation와 Character에 GetActorLocation을 빼주고 노멀라이즈 해준다. 그럼 방향이 하나 만들어진다.

다른 방향을 만들어줘야한다.

카메라의 정면 GetControlRotation을 불러서 Get Forward Vector을 dot로 내적한 결과를 비교하면 된다.

이중에 가장 큰 값을 사용한다 왜냐 1에 제일 근사치 값이기 때문

큰 값을 비교하면서 해당 객체도 저장해줘야 하기 때문에 Candidate(뜻 : 후보)를 Character 변수유형으로 만들어준다.

내적한 결과가 Angle보다 >= 크거나 같다면 들어가게 만든다.

dot한 결과를 true일때 Angle에 넣어준다. 그럼 가장 큰값을 찾게된다.

이제 해당 객체를 저장

큰값이 곧 바라볼 방향이 되므로 return로 Candidate를 연결

 

 

 

다시 Weapon으로 돌아와서 OffCollisions 노드 설정해줘야한다. 중요!!

OffCollisions
OffCollisions 앞 부분
OffCollisions 뒷 부분

1. Set Collision Enabled 하기전에 Moving안에 Get Fixed Camera가 걸려 있기때문에 가져와 if에 연결 카메라가 걸려있을때만 콤보를 가능하게 하기 위해 

2. false라면 clear로 비워준다.

3. true라면 Character와 Hitted를 방금 만든 함수 라이브러리 Nearly Front Angle에 연결 후 Null인지 체크해준다.

4. 유효하지 않다면 배열을 clear 시켜준다

5. 유효하다면 돌려줘야 한다 무엇을? Charcater에 있는 Camera를 돌려준다. Get Controller에 Set Contorl Rotation를 연결 카메라를 돌려주게 된다.

6. 이제 돌려줄 각을 구해야한다. 방법은 Character에 위치에서  Candidate에 위치를 받아 가게 하면 된다. 그리고 Find Look at Rotation을 해주면 회전각도 구해졌다.

7. 각도는 Yaw만 사용할 것이므로 Make Rotator 연결해준다.

8. 이제 다 사용했으므로 Hitted를 clear해서 비워준다.

 

이제 전방에 있는 타겟을 때리게 되면 카메라 시점이 고정되고 Hit가 다 처리되야 카메라 시점이 풀리게 된다.

여기서 중요한게 하나있다 카메라 시점이 객체와 겹처졌을때 돌리면 겹치게되면서 잘못되게 된다.

Do Collision Test를 해제해주면 된다. 그럼 돌려도 아무 이상이 없어진다.

 

이제 공격모션 3번째 동작이 나갈때 Hit가 되던 안되던 카메라를 진동 시키게 만들 것이다.

 

Shake를 적용시켜주면 된다. 옵션창은 위와 같다 Y, Z축을 사용하므로 위아래로 흔들리게 될 것이다.

 

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

Matinee Camera로 만들어준다.

 

이 몽타주가 적이라면 카메라가 흔들려야 한다? 아니다 플레이어만 흔들려야 한다 그래서 플레이여인지 아닌지 구분부터 지어줘야한다.

Player안에 Controller안에 CameraManager이 있다. 이 구조를 통해서 가져온다면 무조건 Player가 되게 되는것이다.

그럼 자연스레 다른 객체들은 걸러진다.

 

1. Get Owner이 Null인지 체크해주고 Character인지 확인해줘야한다. Pawn이 들어오면 에디터 모드일것이고, Character이하가 들어와야 런타임 모드이다.

2. Camera Shake는 런타임 모드에서만 실행된다.

3. 이제 플레이언지 아닌지 확인하기 위해 다시 한번 PlayerController로 체크해준다. Get Controller와 연결

4. 그럼 형변환이 됐다면 안에 Player Camera Manager이 들어있다.

5. Start Camera Shake와 연결 후 클래스를 설정해줘야 한다. 동작에 따라 카메라 할당이 다르게 되야하니까

6. 이때 만든 변수 ShakeClass를 사용해서 연결

 

이제 적절하게 모션에 맞춰서 Shake를 올려준다.

 

https://www.youtube.com/watch?v=M6uwmJYdFRg 

- 타격감이 엄청나지고 있다.

- 카메라의 중요성

Comments