초보 코린이의 성장 일지

UE4 FireBall 피격, 스킬 투척 본문

언리얼

UE4 FireBall 피격, 스킬 투척

코오린이 2023. 1. 30. 13:54

전에 스킬이 캐릭터 주변을 회전하는 스킬을 구현했었다 하지만 피격구현은 하지 않아 구현해볼 것이며, 그다음 만들어 볼 스킬은 손에서 직접적으로 던지는 스킬로 구현해 볼 것이다.

우선 맥락은 같고 손에서 나가는것도 동일하나 방향이 정면으로 나가고, 애니메이션만 바뀐다는것만 알면 된다.

 

스킬이 도는 모션만 구현했을뿐 피격까진 구현하지않아 HitData는 빼고 진행했었다. 이제는 피격이 필요하므로 엑셀표로 값들을 수정 할 것이다.

Weapon_Around로 가서 임포트해서 가져온 엑셀을 설정해준다.

 

이제 값들은 넣어줬으니 Skill_Around로 가서 피격에 필요한 행동을 넣어 줄 것이다.

 

충돌체 Sphere를 클릭 후 이벤트로 가서 On Begin Overlap를 눌러서 생성해준다. 스피어에 닿는 순간을 나타낸다.

사용할 변수추가 Hitted은 변수유형 Character로 지정해준다. 이유는 캐릭터 관련한 객체만 데미지를 받을 것이기 때문

그리고 여러개를 담아야 하므로 배열로 생성

번외) 캐릭터가 아닌 어느 특정 지형지물을 때렸을때 부셔지는 상황을 만들려면 변수유형이 당연하게도 바뀐다.

 

전체적인 흐름은 다음과 같다

1. 일단 닿는순간 리스트에 기록을 하고 닿은 객체가 나가면 리스트에서 뺀다.

2. 리스트에 있는 동안에는 일정시간 동안 계속 데미지를 줄 것이다.

Add = 그냥 add는 중복허용해서 넣어준다

Add Unique = Unique는 find는 명령이있어서 하나 찾아서 있으면 안넣고 그 한개만을 유지한다.

스킬이 충돌해서 충돌상태일때 계속 데미지를 주어야하므로 Unique를 사용

 

1. 소유자인 Character를 가져다가 같은지 우선 확인

2. Other Actor을 가져다가 캐스팅해본다.

3. Hitted를 가지고 add를 통해 확인

 

이제 끝이났으니 End Overlap로 작업을 진행 해준다.

 

1. 닿은 객체가 Character인지 캐스팅해본다.

2. Hitted를 돌면서 객체를 지워준다.

3. 사실 캐스팅할 필요가 없다 어차피 Hitted에서 지워질때 내부적으로 find를 해주기 때문에, 하지만 직관적이게 캐스팅해준다

Timer와 Delay의 다른점

Delay는 A를 거친 후 딜레이가 걸리고 B로간다

Timer은 A와 B가 연결되어있다면 그 사이가 지정된 시간 횟수만큼 반복되도록 바로 호출되버린다.

 

1. Set Timer by Function Name 이벤트를 생성해준다. 그럼 함수 이름을 정해 줄 수 있다.

2. Object는 자기자신이므로 self 연결

3. Name은 이제 데미지를 줄 이벤트 이름을 지정 (아래에서 만들것이다)

4. Time는 0.1초 마다 데미지를 주도록 설정 그럼 0.1초뒤에 콜이된다.

5. Looping 반복 할 것이므로 체크

6. False일때도 연결 시켜준다.

 

이제 직접적인 데미지를 가할 이벤트가 필요하므로 커스텀이벤트를 하나 생성해준다.

 

1. Hitted가 0보다 크다면 ture로 보내준다

2. Hitted로 for문을 돌려준다

3. 데미지 메시지를 콜해준다.

4. 공격자는 당연하게 Character, Causer은 자기자신 self 연결

5. Hit Data는 Weapon에서 불러놨기 때문에 Weapon통해서 불러준다.

6. Hit Data에는 Get으로 0번을 보내주면된다 어차피 1이니까

 

이제 스킬을 사용해서 돌면서 피격되는 순간 중첩되듯이 피격이 이뤄질 것이다.

 

이제는 스킬을 투척하는 형태로 만들어 볼 것이다.

전에 만들어 놓은 Around를 그대로 복사해서 이름만 변경해준다. 내부적인건 수정해 줄 것이다

 

엑셀 작업을 위해 동인한 파일을 복사해와서 이름만 수정해준다. 값은 이제 변경해 줄 것이다

 

우선 사용 할 애니메이션 몽타주를 생성해준다.

UpperBody로 바꿔주고, 스킬을 짧게 바로 쓸수 있도록 노티파이 간격은 짧게 준다.

DT_Equip_FireBall
DT_DoAction_FireBall
DT_HitData_FireBall 앞부분
DT_HitData_FireBall 뒷부분

엑셀표 수정해준 상태, 마지막 Hit에 Effect만 효과를 위해 레퍼런스 복사해서 추가해주었다.

 

폴더로 가져와서 알맞게 임포트 해준다.

Weapon_FireBall로 가서 알맞은 자리에 엑셀값 넣어준다.

행동이 변해야 하므로 Weapon_Component로 가서 함수 추가해주고 모드를 설정해준다.

 

플레이어로 와서 입력의 대한 모드 변화를 넣어주고, 6번키에 지정

 

플레이 애니메이션으로 가서 Fire Ball 포즈에 Wizard Pose 연결해준다.

 

이러면 이제 던지는 모션으로 투척형태에 스킬이 완료된다. 하지만 던져보면 곡선의 형태를 띄면서 중력의 영향을 받아 떨어지게된다. 이 방향을 일직선으로 나가도록 만들어 줄 것이다.

 

다시 Weapon_FireBall로 돌아온다.

함수와 사용하게 될 변수를 만들어준다.

DoAction

전에 있던 Around와 동일해서 수정할게 없다.

투사체를 나타내는 스킬로써, 물리적인 힘이나 바람 등등 영향을 받아 날아가는 탄도학을 구현해주는 함수가 있다

하지만 지금은 어렵게 생각은 안하고 투사체를 관리해주는 컴포넌트를 하나 추가해준다.

ProjectileMovement는 반드시 객체가 충돌체가 되여야한다 스피어나, 캡슐 등등

ProjectileMovement 설정 란에 보면 Inital Speed는 시작속도를 나타낸다.

Max Speed는 가속을 나타내는데 사용을 하진 않을 것이다.

Gravity도 직선으로 나가게 하기 위해 0값

그리고 아래 쭉 내려오면 Velocity가 있다

이건 위에 있는 Inital Speed에 곱해져서 나갈 방향이자 속도를 나타낸다 우리는 전방이므로 X축값만 준다

 

하지만 이대로 발사하면 0. 0 지점에서 나오기 때문에 발사될 지점 위치와 방향을 설정해 줄 것이다.

 

소켓은 플레이어 오른손으로 지정해주고 자연스럽게 위치를 수정해준다. 

 

아까 Begin_DoAction으로 다시 돌아와서 작성해 줄 것이다.

Begin_DoAction

이제 생성을 하고 발사를 할때

 

1. 우선 생성을 해줘야하므로 SpawnActor 선언 Class 선택해주고 Make로 연결해주고 Owner은 self 연결

2. 플레이어의 카메라 방향이므로 Character을 가져와서 Get Component by Class 연결 후 Camera Component 선택

3. 만약 이미 무기를 가지고 있는게 적이라면 없는것이므로 Is Valid로 확인해준다.

4. 이제 전방 Forward Vector을 구해주기 위해 Make Rot from x로 Z값만 사용할 것이다.

5. Z값으로 다시 Make Rotator에 연결해 전방을 만들어 쓸 것이다. Vector 상태로는 전방을 구하기가 복잡하기 때문

6. 이제 발사하는 위치를 구해줘야한다 발사 위치는 플레이어 손이다.

7. Character로 캐릭터 안에 있는 Mesh를 불러준다 그리고 그안에있는 Socket를 불러서 변수 Location에 연결 (소켓 이름도 넣어줘야한다)

8. 이제 만들어진 위치 Location과 Direction을 가져다가 Spawn 될때를 기점으로 값을 연결해준다.

 

여기서 중요한건 SpawnActor Skill Fire Ball에 있는 Collision Handing Override에 있다

Default = 상황에 따라 

Always Spawn, lgnore Collisions = 무조건 있든 없든 Spawn 시키고 Collision 체크 안한 

Try To Adjust Location, But Always Spawn = 일단 충돌이 되있으면 위치를 어떻게든 조절해서 Spawn 시킨다.

Try To Adjust Location, Don't Spawn if still Colliding = 충돌했는데 몇번을 보정해도 Spawn 될 위치없으면 안생긴다.

Do Not Spawn = 충돌하면 아에 안생긴다.

그래서 우리가 사용할건 Always Spawn, lgnore Collisions 이다.

 

 

https://www.youtube.com/watch?v=xupp-f0YIRA 

 

- 스킬이 구현될수록 완성도가 높아지는거 같다

 

Comments