프로그래밍/Unreal 부트캠프

TIL 2025.02.18 기록

Rozentea 2025. 2. 18. 23:17

0. 개요


오늘은 AI 구현 수업을 듣고, 계속 작업을 진행했다.

본격적으로 작업에 들어가면서 이런저런 문제가 발생했지만, 잘 해결되어서 다행이다... ㅠㅠㅠ

 

우선 오늘 작업은 Drone을 구현하는 걸 했는데, 기존에 Speed 기반으로 충돌 처리 구현을 직접했던 것에 제약사항이 많아 피직스 시뮬레이션 사용 + AddForce()로 움직임을 구현하는 방향으로 작업을 시작했다.

 

기본 구조 설계와 이동 구현 및 카메라 회전까지 마무리해둔 상태로 마무리할 수 있었다.

 

때문에 오늘은 겪은 문제와 작업을 어떻게 진행했는지 정리를 하고 마칠 것이다.

 

1. 팀 프로젝트


1. 컴포넌트 부착 및 변수 선언 & 생성자 구현

충돌 처리를 해줄 콜리전은 캡슐로 정해서 루트로 지정해주었고, 스켈레탈 메시와 스프링암, 카메라 컴포넌트를 추가해주었다.

피직스 핸들 컴포넌트는 나중에 Grab기능을 추가할 것을 생각해 미리 붙여주었다.

 

2. 스켈레탈 메시 적용 및 머티리얼 적용

<스켈레탈 메시>

기존 스켈레탈 메시는 레이저 부분과 총이 격발될 때 빛나는 부분까지 모두 메시가 생성되어 있는 형태였다.

저것을 제거할 필요가 있는데, 찾아보니 몇 가지 방법이 있었다.

  1. 3DMax 등 모델링 프로그램으로 모델을 직접 수정하기
  2. 머티리얼을 새로 만들어 적용해 안보이도록 수정하기
  3. 본의 스케일을 (0, 0, 0)으로 바꾸기

이중에서 나는 3번을 선택했다.

왜냐하면, 저번에 PC를 포맷하면서 모델링 프로그램들이 삭제되었고, 머티리얼 수정은 단지 안보이기만 할 뿐 콜리전은 그대로 남아있어서 충돌 처리시 문제가 발생할 수 있다고 한다.

때문에 임시방편적으로 스케일을 (0, 0, 0)으로 변경해주어 안보이도록 만들어 주었다.

(나중에 확인해보니 스케일을 (0,0,0)으로 설정할 시 경고 메세지가 나와서 다시 수정해야할 것 같다.. 음.. (1, 1, 1)에 머티리얼을 안보이는 것으로 설정하면 될것 같다.)

이때, 단순히 스켈레탈의 본 스케일만 변경하면, 적용이 안되기 때문에 스켈레탈 편집을 통해 스케일들을 변경하고 저장해주었다.

스케일을 줄여서 없앤 것들은 사실상 이펙트가 때에 따라 생성되어야 하는 것으로 보이고… Mesh로는 어떻게 사용해야 하는지 몰라서 (뿐만 아니라 첨부된 영상을 봐도 그것 보다 다른 이펙트를 적용하고 싶었다..)

따로 나이아가라를 이용해 만들어서 사용할 예정이다.

(아쟈뵤 b)

 

< 머티리얼 >

처음 임포트할 때, 머티리얼이 로딩되지 못해서 흰색 머티리얼만 생성되어서 함께 들어있던 Texture를 이용해 직접 머티리얼을 만들어주었다.

단, BumpMapTexture가 어떤 것인지 정확히 모르겠어서.. 정확히 연결하지 못한 것 같아 더 찾아봐야 할 것 같다.. ㅠ

ㄴ> NormalMapTexture와 유사한 것 같던데..

 

3. 테스트 레벨에 배치 후 확인

이제 준비를 마쳤으니 움직임을 구현해봐야겠다.

 

4. 입력 액션, 입력 매핑 만들기

우선 Grab 액션은 만들지 않고, 가장 기본적인 이동과 시점 회전을 위한 액션만 맵핑해두었다.

또한, 다시 Player로 컨트롤러를 변경하는 IA_DroneToPlayer 액션은 아직 맵핑해두지 않았다.

⇒ 즉, 우선 이동과 카메라 회전만 구현해볼 예정이다.

 

5. 드론 컨트롤러 만들기

<컨트롤러에 함수 바인딩하기>

우선 컨트롤러를 만들어 주었다.

이후에 각각 입력에 따른 동작을 해야하는 함수를 바인딩해주었다.

 

<이동 함수 구현하기>

어떻게 구현해야 자연스럽게 나올까 고민하다가 피직스 시뮬레이션을 사용하면서 AddForce()를 이용해 힘을 기반으로 드론이 움직이게 구현하면 좋겠다 생각했다.

때문에 힘 변수를 추가해 얼마만큼의 힘을 가해줄 것인지 정해두고, 입력에 따른 방향을 구해 해당 방향으로 이동할 수 있도록 구현해주었다.

이때, GetActorForwardVector()가 아닌 Scene→GetForwardVector()를 사용한 이유는 물리 시뮬레이션의 결과로 액터 회전 발생과 카메라 회전 때문이다.

 

  1. 물리 시뮬레이션 회전
    이때, 스프링암(카메라)이 Actor에 부착되어 있어 함께 회전해 굉장히 어지러운 화면을 보게 된다.
    때문에 처음에는 스켈레탈 메시에 스프링암을 부착해주었다.
    드론이 충돌하게 되면, 구형태의 충돌체로 인해 X,Y,Z축 회전이 발생하게 된다.
  2. 카메라 회전
    지금 스켈레탈 메시의 피벗이 0,0,0이 아니기 때문에 Actor를 회전하면 스켈레탈 메시에 붙어있는 스프링암이 이상하게 회전하게된다…

이러한 문제들로 인해서 SceneComponent를 이용해

CapslueComp

     ㄴ> SceneComp

          ㄴ>SkeletalMeshComp

          ㄴ> SpringArmComp

               ㄴ> CameraComp

로 구조를 변경해주었다.

이러면 마우스 회전에 따라서 SceneComp를 회전시켜 액터를 회전 시킬 수 있게 된다.

 

<양력 및 공기 마찰 구현>

또, 지금 물리 시뮬레이션을 활성화해 중력이 적용되고 있기 때문에 드론이 공중에 떠 있을 수 있도록 반중력(양력..?)을 추가해 주었다.

(뿐만아니라 지금 AntiForce의 값만 수정하면, 조금씩 아래로 떨어지도록도 가능하다. 단, 자연스럽게 떨어지게 하기 위해서는 추가적인 작업이 필요하다.)

또, 공기 마찰을 적용해 드론이 점차 정지하도록 구현해주었다.

(해당 값은 계속 실험해보면서 최대한 자연스럽게 조절했다.)

 

6. 카메라 회전 함수 구현

마우스 회전에 따른 카메라 회전을 구현해주었다.

이 작업에서 어려움이 있었다면, 드론 컨트롤러 만들기 쪽에 작성했던, 액터 회전 때문에 애를 먹었다.. ㅠ

 

7. 드론 움직임 구현 영상

 

 

2. Git 관련 문제사항 발생 및 해결


우선.. 드론 작업을 모두 마치고, Git에 Push하려고 하니.. push가 안돼는 문제가 발생했었다.

이유는 드론 에셋을 가져오면서 .hdr, .fbx, .blend, .obj 파일등이 추가가 되었는데, .gitattributes에는 해당 파일들에 대한 내용이 적혀있지 않아 lfs로 에셋들을 올릴 수 없었기 때문이었다.

=> 즉, 기존 처럼 50mb로 제한된 상태로 올렸어야 했다.

 

하지만 더 큰 문제는.. 드론 에셋을 추가한 저 부분의 커밋은 저~~ 밑에 있는 것이었다..

사진은 안찍어서 남기지 못하지만..

이미 드론 구현을 모두 마친 상태에 중간중간 커밋한 기록들이 있어서 다시 작업할 생각에 머리가 아파졌었다.

 

심지어 저 상황에서 .gitattributes에 해당 확장자들을 추가한다고해도 아직 .gitattributes 변경점 시점의 Commit에서 파일들을 추가해두었기 때문에 상황이 해결되지 않았다..

 

결국 프로젝트를 복사해둔 뒤, 다시 커밋을 되돌려 에셋들을 다시 옮기고, cpp파일 및 BP를 다시 만들어주는 걸로 결론을 내렸다..

=> 다행히 미리 복사해둔 프로젝트의 코드 복붙으로 시간을 많이 단축시킬 수 있었다.

 

<커밋을 되돌리는 방법>

Reset Commit을 하면, 해당 커밋까지 되돌릴 수 있다.

이때, Soft를 선택하면 변경했던 변경점들은 그대로 두고, 커밋 기록만 취소해준다.

Hard의 경우 변경점까지 모두 되돌려 해당 커밋까지 되돌려준다.

 

3. 마무리


이전에 구현했던 Drone을 더 자연스럽게 움직일 수 있도록 다른 방법으로 구현해보면서 여러 생각을 많이 했던 것 같다.

결과적으로는 아직까지 만족스러운 움직임이 구현되어서 다행이었다. ㅎㅎ

 

거기다가 Git 관련 문제도 발생했었는데, 시간이 조금 걸리긴 했지만 그래도 금방 해결되어서 다행이었다.. 1시간 정도..?

 

내일은 Tilt 추가와 움직임을 조금 다듬고, AI 작업에 들어가려 한다.

내일도 화이팅!!