초보 코린이의 성장 일지

UE4 스킬 - FireBall 및 텔레포트 예외 처리 본문

언리얼

UE4 스킬 - FireBall 및 텔레포트 예외 처리

코오린이 2023. 1. 27. 16:03

텔레포트를 구현했지만 시야를 아래로 두고 사용하게되면 바닥에 몸이 끼는 경우와 벽 위로 쓰게되면 뒤로 떨어지는

버그아닌 버그가 발생한다. 이걸 잡아주고 스킬을 또 구현해 볼 것이다.

 

 

Begin_DoAction

1. Location을 핀분활을 하고, 일단 X, Y는 그대로 사용할 것이고 높이인 Z축만 설정해주면 된다.

2. 캐릭터 가지고 조종하면 되는것이므로 Character안에 Capsule Component를 받아 Get Scaled Capsul 함수로 연결한다. 함수 선언시 보면 Un이 존재 하는데 이건 순수한 값으로만 설정한다는 의미이고 안 붙은거는 변경이 가능할때 사용하면 된다.

3. 캡슐에 반 크기라는 의미는 곧 캐릭터에 반 크기와 동일하다 그만큼은 Z축으로 연결해서 위로 올려준다.

이러면 바닥으로 꺼지는 일은 이제없다 왜냐 위에서 나타나기 때문

 

다음 문제는 벽을 넘어서 바닥으로 떨어지거나 벽 위로 올라가는걸 막아줘야한다.

 

코드로도 막을 수 있지만 다른 방법도 존재한다. 볼륨으로가서 블로킹 볼륨을 끌어다가 해당 위치에 올려준다.

 

이렇게 객체로 막아주고 적당한 스케일 값과 위치를 정해주면 실행시 블로킹이 걸려 넘어갈 수 없게된다.

 

하다보니 새로운 버그가 있었다. 밖으로 스킬을 사용시 먹통이 되는 경우가 있는데 이거 또한 해결해 주겠다.

수정 전

수정 후 

이유 : Hit가 안된 상태에 검증도 안된 상태로 Action Mode로 바뀌기 때문에 풀릴수가 없다 그래서 순서를 바꿔주면 해결된다.

 

이제 다른 스킬을 만들어 볼 것이다.

 

 

DoAction

전에했던 Warp를 복사해서 만들었으므로, 수정해줄게 DoAction에서는 노드 몇개 지워주고 연결만 해준게 끝이다.

중요한건 나가는 시점인 Begin_DoAction이다.

 

이제 무기 등록도 해줘야한다.

Weapon Component로 가서 모드만 변경해줄 것이므로 위에 하나 복사해서 수정만해준다.

 

BP_Player로 가서 세팅은 매번 동일하다 위에꺼 복사해서 똑같이 수정만 해준다.

 

똑같이 오른쪽 설정란에 5번 Around 키입력 설정까지 해주면 끝

 

사용 할 스킬 애니메이션을 몽타주로 생성 후 노티파이 추가해 준다.

이제 엑셀 작업도 해줘야한다. 동일하게 2개를 복사해서 가져와 이름 변경 안에 값은 수정해 줄 것이다.

 

DT_Equip_Around

복사 후 가져온 상태 그대로 수정할게 없다.

DT_DoAction_Around

스킬 몽타주 레퍼런스 복사로 추가해주고  값 수정도해준다.

 

만들어진 엑셀 파일을 임포트해서 2개 가져와 준다.

 

그리고 다시 Weapon_Around로 돌아와서 데이터 테이블을 설정해준다.

이제 플레이어 애니메이션으로 와서 캐시포즈를 등록해준다. 다른 포즈와 다르게 간단한 모션이라 Unarmed로 해줬다.

 

 

스킬을 한개가 아닌 여러개를 만들것이기 때문에 Actor로 Skill 이라는 Class에 상속받아서 생성시킬 것이다.

변수는 Weapon, Character은 각 각 이름 그대로 변수유형도 동일하다.

 

그리고 스킬을 만들때 소유자를 무기로 지정 할 것이다. 하나의 무기처럼 다루기 때문

Get Owner로 해당 무기를 불러준다 그리고 Weapon으로 형변환이 되었는지 확인해준다.

Weapon안에는 어차피 캐릭터가 들어있기 때문에 이 관계를 위해 불러서 셋팅해주면 된다.

만든 Skill를 자손 블루프린트로 만들어준다 그게 Skill_Around

 

스킬같은 움직임은 일반 무기에 충돌체와 느낌이 다른점이 있다. 무기같은 경우는 충돌체로 모든걸 판단하지만

스킬은 충돌체 밑에 표현하는 컴포넌트 따로 다룬다. 그게 ParticleSystem이다

 

이제 스킬이 돌아가게 만들것이다 거기에 사용할 함수, 변수, 로컬 변수

 

앞쪽
나머지 뒷부분

변수 Negative가 false면 양의 방향으로 시계방향으로 돌고 true면 음의 방향으로 시계 반대 방향으로 회전할 것이다.

그리고 Distance는 스킬이 나와서 주변을 돌때 얼마만큼의 거리를 두고 돌것인지 판단해 주기 위해 사용

Speed는 말 그대로 돌아가는 속도를 위한 변수

 

1. Negative가 false 양의 방향이므로 Speed를 가져다가 Temp에 넣어준다

2. 음이 방향이면 반대이므로 Speed를 뒤집어 주면된다 왜냐면 곱해줄 값으로 처음꺼 기준으로 반대로 -1만 해주면 된다.

3.이제 Angle를 구해줘야한다. 내부적으로만 사용할거라 private로 지정

4. Angle는 현재 돌각을 나타낸다 몇도인지 확인하는 이유는 정면을 바라봤을때 정면 기준은 0도이고 도는 방향에 따라 각이 변하기 때문 그래서 Set으로 넘길때 둘다 넘길수 있도록 노드 연결

5. 이동할거기 때문에 Delta Seconds를 Temp와 곱해준다 속도보정을 해줘야 하니까

6. 그 구한 값을 Angle와 더해서 Set Angle로 값을 보내준다. 그럼 점차 속도가 올라가면서 같이 올라간다.

7. 이제 Negative에 따라 갈리도록 if문 연결 로컬변수 Limit를 Set로 가져와서 연결 Negative가 false라면 360이고 반대면 -360이기 때문에 값을 설정해주기 위해 2개가 필요 값이 누적되면 회전이 빨라지는 문제가 생기므로 360이라는 회전값을 제한으로 걸어줘야한다 안그러면 넘겨서 오차값이 발생하는 순간 축이 사라지면서 랜더링이 안되면서 버그가 발생한다.

그걸 짐벌락이라 부른다. (360분법으로 다룬다는 기준하에)

8. 다시 if로 둘다 들어오게 노드 연결 

9. Angle하고 Limit를 Nearly Equal로 받아준다. 그래야만 위에 정한 값제한이 걸린다.

10. 결국 360과 -360은 0이되는 구조다 그래서 Angle를 0으로 다시 돌려준다.

 

다시 Weapon_Around로 돌아와서 아까 하지 못했던 Begin_DoAction도 값을 넣어줘야한다. 변수는 배열로 클래스 레퍼런스 Skill Around를 변수유형으로 받아서 사용할 것이다.

Skill_Around를 가져다가 자손 블루프린트를 생성해준다.

자손 블루프린트 생성 완료

내부로 들어와서 사용할 임팩트를 넣어준다.

 

그리고 본체 Weapon_Around로 돌아와서 만들어준 자손 객체를 담아준다.

 

Begin_DoAction

DoAction만 아까 값을 넣어줬고, 이제는 Begin으로 와서 작성해준다.

 

1. 배열로 만든 스킬을 배열 번호로 다룰 것이므로 -1을 해준다.

2. Random Integet in Range로 연결해주면 이 범위안에서 랜덤값이 나온다.

3. 다시 스킬을 get으로 연결해준다.

4. SpawnActor From Class 선언 Transform은 tick에서 계속 위치를 잡아주고 있으므로 생성 위치는 기본으로 잡아준다.

5. Owner은 자기 자신이 될 것이고 무기를 Owner로 잡아줬기 때문 self로 연결

 

Skill_Around로 와서 아까는 회전을 구해줬으므로 이제 위치를 설정해줘야한다.

 

1. 일단 Distance 거리를 가지고 make Vector로 연결 전방 기준으로 하기 때문에 X축으로 이어준다.

2. 해당 공간으로 방향을 전환해줘야 하기 때문에 RotateVectorAroindAxis로 연결해주고 몇도로 전환시켜야 하는지 판단하기 위해 Angle을 넣어주면된다. 그리고 Axis는 어느 방향으로 회전시킬지를 결정하므로 Z축의 1값을 넣어준다.

3. 그래서 이렇게 나온 Vector값이 Character 위치에서 가야하므로 Location과 더해준다. 방향 벡터는 노멀라이즈를 해줘야하지만 거리를 쓰기위해 사용은 하지 않았다.

4. 더 해진 값을 이제 Set으로 넘겨준다.

5. 위치를 잡아줬으니 이제 회전도 잡아주면된다. 스피어는 돌려놓은 상태에서 실제는 밑에 파티클이 돌것이기 때문

6. 시작 기준을 잡아놓고 다른 객체가 돌리게 만드는게 좋다 그 이유로는 만약에 기준없이 돈다고 가정하고 - 방향이 나오게되면 또 -를 곱해줘야한다 유동적으로 값 변화가 너무 자유롭다 그러므로 이미 부모에서 한번만 정해주고 Begin Play 시작지점에서 한번만 돌려놓으면 상대간격이 유지되므로 편하게 변경이 가능하다. 그러면 밑에서 매번 돌려줄 필요가 사라진다. 그래서 Sphere를 돌리는 것이다.

7. 파티클을 다시 Angle를 Z축값으로 받아와서 Set Relative Rotation을 Z축을 회전시켜주면 된다.

 

회전에 따라 돌려줘야 하므로 Begin에서 코드를 작성해 줄 것이다.

1. 정방향이면 나 자신한테 오는 방향이고 역방향이면 반대로 도는 방향이다 그래서 회전을 돌려 줄 것이다.

2. Negative에 따라 정방향이면 안돌리고 그냥 나두고 역방향이면 Z축을 -180도 돌려준다.

3. 이럴때는 파티클 임팩트를 돌리는게 아니다 충돌체 부모를 돌린다 그럼 부모를 따라서 돌게된다 그리고 필요하다면 자식에서 재 고정을 시켜주면된다. 

4. 돌린값을 정해줬으니 바로 위에 Tick 노드뒤에 값을 전달해줘서 연결

 

스킬을 하나 더 추가해보겠다.

들어가서 셀프를 누르면 부모께 나온다. Negative 체크해주고 값을 준다.

그리고 Weapon으로 돌아가서 배열에 스킬 하나 더 추가해준다.

 

Fire가 아닌 Ice로도 2개 더 만들어서 실험해 보겠다. 똑같이 만들어서 추가만 해줬다

 

그럼 이제 스킬이 총 4개가 나가게 된다. 근데 스킬이 계속 생성은 되는데 자연스럽게 사라지게 만들 필요가 있다 그래서 설정을 하나 해준다.

 

Skill_Around로 들어가서 설정칸 Actor에 보면 Inital Life Span이 있다.

시간을 정해주면 그 시간에 따라 지나면 자동으로 소멸하게 만들 수 있다. 

충돌체는 내일 하게 될 것이다.

 

 

영상처럼 4개의 스킬이 랜덤으로 방향이 결정되면서 나가다가 5초뒤 소멸하는걸 볼 수 있다.

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

 

- 스킬 만드는거 재밌다.

- 하지만 구조를 이해하는데 시간이 걸릴거 같다

Comments