초보 코린이의 성장 일지

UE4 Bow 줌 선형보간, 조준점(CrossHair), 피격 본문

언리얼

UE4 Bow 줌 선형보간, 조준점(CrossHair), 피격

코오린이 2023. 2. 2. 15:39

줌을 했을시 자연스러운 동작이 아닌 각진 느낌으로 기능이 이뤄진다.

보간을 통해서 우선 자연스럽게 만들어 보고 조준점을 만들어서 피격까지 구현해 볼 것이다.

 

보간을 위한 커브를 하나 생성해준다.

 

CurveFloat = 일정시간동안 가게 하고, 한값만 가능하다

CurveLinearColor = 값 4개 동시에 가능

CurveVector = 값 3개 동시에 가능

 

1. 빈 곳을 아무곳이나 클릭해서 엔터를 누르면 지정을 할 수 있다. 

2. 0초부터 기본값인 90으로 지정해준다.

3. 빈 곳을 또 클릭해서 엔터를 누르고 지정을해줄 것이다. 

4. 그리고 시간을 0.1초동안 45까지 내려가도록 값을 바꿔준다.

부드러운 원하는 값이 설정된다.

 

1. 한글로나 영어로 타임라인이라고 치면 설정해놓은 커브를 가져다가 사용할 수 있다.

2. Return된 변수명을 FOV로 설정해주고, 외부커브를 눌러서 방금 만들어 준 커브를 선택해준다.

3. 가로 세로축을 0.00에 있는 버튼2개를 눌러 정렬시켜준다.

4. 길이가 5초로 지정되어있어 0.1초도 바꿔서 알맞게 잘라준다.

Pressed 뒷 부분

이벤트 Pressed 뒤에 부분에 추가한 상태이다

1. ZoomIn이라는 타임라인을 생성한 상태

2. 그냥 Play는 정지된 지점에서 플레이가 되지만, Play from Start 정지될거 말고는 처음꺼를 시작하겠다는 뜻이다.

3. Update는 매 프레임마다 변경되는 값을 전달해준다.

4. Finished는 지정했던 0.1초 시간이 다 지나면 빠져나온다.

Released 뒷 부분

위와 다르게 끝난 부분이므로 반대로 뒤집어줘야한다.

1. 동일하게 ZoomOut라는 타임라인을 생성해준다.

2. 이번에는 Reverse from End로 보내준다.  Reverse 처음부터 역방향으로 진행, Reverse from End 스탑된 지점부터 역방향으로 진행 될 것인가를 나타낸다.

 

 

이제는 조준을 했으니 조준동작이 나와야한다. 원래 있던 동작은 조준 동작이 아닌 원래 기본 모션에서 활만 당기는것이다.

사용할 변수들 기존에서 Bow_Aiming만 추가해줬다.

Then 2 내용

애니메이션 이벤트그래프에서 이제 동작을 위한 작업을 해줘야한다.

1. Weapon Component로 현재 있는 무기를 가져와준다.

2. cast Bow로 캐스팅을해서 확인을 해준다.

3. 캐스팅이 됐다면 Aim을 불러 검증된 Get으로 변환해준다.

4. 오른쪽 버튼을 누르면 줌이되면서 Aiming가 true가 되므로 안에 세팅해준다.

5. Aim이 검증된 상태로하지 않고 Get으로 불러서 사용하면 Null이 뜰 수 있다. 그 이유는 플레이어가 아닌 다른 객체는 사용할 수 없는 행동이므로 에러가 발생한다.

 

사용해서 섞을 동작
본마다 레이어로 블렌딩하는 설정 구
애니메이션 레이어에 있는 BowLayer

활을 든 상태에서 조준하는 모션을 섞어야하므로 어려운 부분이다. 

1. bool 포즈 블렌딩을 하나 생성해준다.

2. Aiming이 False라면 기본동작으로 연결

3. True라면 동작을 섞어서 사용할 것이다.

4. 본마다 레이어에서 설정을 통해 원하는 위치 Bone Name를 지정해주고, True로 보내준다.

이제 동작이 섞여서 줌을 당긴상태로도 걸어가는 모션 동작이 자연스럽게 이어진다.

 

 

3차원 UI를 보면 캐릭터 위에 아이디나, HP바 같은걸 나타낸다 이걸 월드상 UI이다.

스크린상 UI는 화면상에 딱 달라붙어있는 조준점 같은걸 나타낸다 이걸 HUD라고 부른다.

이 함수를 사용해서 하는 방법은 추천하지 않고, 캔버스라는 트리형태를 띈 방법을 사용한다.

 화면이랑 1:1 대칭이 되야 한다. 그게 조준점이 될 것이다.

 

 

이제 위젯을 하나 만들어서 사용해 볼 것이다.

위젯 블루프린트 생성

1. 처음 생성하면 Canvas Panel이 생성되어있는데 이 화면과 실제 게임화면이 1:1 매치가 되야한다.

2. 팔레트 Image를 눌러서 Canvas Panel에 추가해준다.

 

1. 원래는 왼쪽 상단위에 고정되어 있는 위치를 오른쪽 상단에 앵커를 눌러서 중앙으로 옮겨준다.

2. 이제 이렇게 화면이 편성되는데 오른쪽에 설정값을 수정해주고, 사용할 Image를 추가해준다.

3. 흰색으로 색을 만들고 시작하는 이유는 조준점이 처음에는 흰색이였다가, 적 위에 올렸을때 빨간색으로 바껴야 하기 떄문, 또 한 만들때 색을 나눠 2개를 만드는 방법보다 이 방법을 사용하는게 더 편하다.

4. 그리고 UI는 카메라에 붙는다.

 

사용 할 변수

1. Character에 있는 Controller을 불러 PlayerController로 형변환을 해본다.

2. 성공했다면 위젯생성을 처서 만들어준다.(한글로 입력해도 나온다). 그리고 Class에 만들어준 위젯 블루프린트를 지정해준다.

3. 위젯이 생성이 우선 됐지만 배치가 된 상태는 아니다. 

4. CrossHair에 저장을 시켜준다.

5. 이제 View Port에 1:1로 위에 띄어주기 위해 Add to Viewport로 연결해준다.

6. 조준을 했을때만 보이도록 하기 위해 Cross Hair를 끌어서 Set Visibility에 연결해주고, Hidden으로 숨겨준다.

이벤트 Pressed 뒷 부분 추가

1. 이제 위에서 세팅을 끝냈으니 언제 보여줘야 할까? 조준했을때만 보여줘야한다.

2. CrossHair을 검증된 Get로 바꿔주고, 있다면 Set Visibility로 연결해준다.

3. 그리고 Visible로 설정해준다.

이벤트 Released 뒷 부분 추가

1. 검증된 CrossHair을 위와 반대로 Set Visibility를 Hidden으로 숨겨주면 된다.

 

 

이제는 조준점을 목표 객체에 올렸을때, 맞출 수 있는 객체는 빨간색으로 아닌 객체는 하얀색으로 표기하게 만들것이다.

발사할때도 2가지 방식이 있다

Hitscan = FPS 구현방식, 약간 거리가 일정시간 거리가있다면 Hitscan을 하지 않고 탄도학 방법을 사용

하지만 우리는 다른 방법으로 해 볼 것이다.

 

아래에 Tick 이벤트를 하나 생성하고 시작한다.

1. Aiming이 ture일때만 진행 할 것이다 false는 등장조차 안하니까

2. LineTraceForObject를 선언 해당 오브젝트 타입을 추적하는 기능을 한다. 타입으로 여러개를 받을 수 도 있다.

3. Character안에 Mesh안에 Socket Location인 소켓 위치를 가져다가 부위를 지정해주고 Start에 연결

4. 방향은 이제 Character안에 Get Controller를 불르고, 전방 방향 Foward에 3000만큼 곱해준다.

5. 그리고 그 곱해준 값을  위치값과 더해줘서 End값에 넣어준다.

6. Object Tpye는 make로 배열을 만들어준다. 추적할 충돌 오브젝 타입은 캐릭터로 Pawn 으로 잡아준다.

7. lgnore 연결해줄 make로 배열을 만들어주고, Character를 넣어준다 (자기자신 캐릭터는 추적하면 안되니까)

8. Draw Debug Type는 보여주는 곳이므로 For One Frame로 설정

9. Break로 Hit가 되었다면 어차피 Character가 걸리겠지만 확인하고자 한번더 형변환을 해준다.

10. 이제 정해준 조줌점 색 2가지로 나눠준다. 하얀색은 타겟이 아닌 상태니까 if 조건에서도 연결해줘야한다.  

 

For One Frame = 매 프레임 마다 콜해지도록 Tick라 생각하면 된다.

For Duration = begin play 같은 곳에서 한번만 콜했을때 몇 초 동안 지속할 것인 

Persistent = 한번 그리고 게임 내내 유지되도록 만드는 것

 

아까 조준점을 지정해 줄때는 디자이너 영역이였지만, 이제 작업은 그래프 영역에서 해줘야한다.

 

1. 이벤트 이름 그대로 레드와 화이트 조준점 상태를 알려준다.

2. Cross Hair로 Brush Tint로 지정한 색으로 조정해준다.

3. make로 만들기를 하면 SlateColor이 나온다 색 지정을 해준다.

4. 그리고 다시 위로 돌아가서 뒷 부분에 추가해준다.

 

타겟 조준 전

 

타겟 조준 상태

알맞게 색이 들어가는게 보일 것이다.

 

 

이제 화살이 충돌되게끔 만들어 볼 것이다.

충돌체인 화살에 있는 Sphere 작업

 

1. 우선 Other Actor이 캐릭터와 같지 않아야 하므로 확인해준다.

2. Other Actor를 IDamage 형변환을 해준다.

3. 조건이 맞다면 데미지를 콜해주고 알맞은 객체를 연결해준다.

4. HitData는 Weapon -> Hit Datas를 가져와 배열로 확인해준다.

5. 그리고 화살이 관통되는게 아니므로 Projectile Movement를 사용하여 맞으면 꺼준다.

6. 일정 시간이 지나면 자가자신 객체가 사라지도록 만들어준다.

 

 수명주기를 다룬 표이다. 이중 SpawnActor에 해당하는 상태로 이것에 대해 설명해 보겠다.

SpawnActorDeferred는 블루프린트에서는 사용이 불가능하고, 언리얼 c++에서 사용이 가능하다

그리고 점차 아래로 내려갈 수록 끝이나면서 멀티 쓰레드인 가비지컬렉터가 기능을 수행하면서 소멸한다.

 

 

1. End Play에 있는 End Play Reason이 위에 표에서 말한 어떤 방법으로 종료되었냐를 나타낸다.

2. 부모 End Play에 설정에 보면 그 표에 나타낸 6가지 방법이 들어가있다.

3. End가 호출되면 이벤트 디스패처를 호출 되도록 만들어줬다.

4. 이 부분을 연결해 줄 곳은 Weapon_Bow가 된다.

 

 

CreateArrow로 들어가서 작업해준다.

 

1. 원래 있던 노드 뒤에 추가만해준다.

2. Arrow를 가져다가 On Arrow Destroyed 바인딩으로 연결해준다.

3. 이벤트 생성으로 정해준 함수 콜해준다.

 

On Arrow Destroyed로 온다.

1. 배열로 화살을 다 Remove item으로 소멸시킨다.

 

이제 조준, 피격이 완성됐다.

 

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

 

- 애니메이션에 대한 이해도가 조금은 높아졌다

- 날아가는 객체를 다루는 방법은 어려운 편이다

Comments