Day 4 Work
오늘의 과제
자신만의 레벨 디자인으로서
다양한 에셋과 함께 창의적인 레벨디자인을 만드는 것이다
마침 예시에 ‘굴러오는 거대한 공’이라는 부분이
인상 깊어서 경사로에서 공들이 마구 굴러오고
그걸 피하거나 버텨서 위로 올라가는 느낌의 레벨을 만들고 싶었다
이런 느낌?
(해당 폴가이즈 맵은 협동이지만)
구현해야 할 것
먼저 World에 LandScape 기능을 통하여 Ramp 기능을 이용하여
적절한 경사로 느낌을 제작하였다
이후 노션에서 공유된 에셋들을
이용하여 맵에 적당히 배치하였다
플레이어 자체는 강의에서 나온 것을 migrate(이주)한 다음
움직임을 일부 수정한 후(폴가이즈에 가깝게?)
shift 에 대쉬 기능을 넣어 이동속도를 향상하였다
이후 해야하는 일들은
- 굴러가는 공 구현
- 1의 공을 생성하는 Spawner를 구현
굴러가는 공 구현하기
가장 간단한 방법은 static mesh가 물리의 영향을 받도록 하는 것이라
생각하였기에 Physics - Simulate Physics 를 체크하였다
그 이후 조금 공을 무겁게 하기 위하여 mass scale을 3으로 늘렸다
원래는 static Mesh에 Hit 이벤트를 사용하려 하였으나
Player 자체도 static mesh에 가깝기에
Hit 이벤트가 다소 ‘간헐적’으로 발생하는 듯 하여
Sphere Collision 컴포넌트를 추가하고
Begin Overlap 이벤트를 사용하였다
부딪히는 경우,
‘플레이어 위치 - 공의 위치’를 통해 ‘공 -> 플레이어’ 의
방향을 찾은 후, normalize 하여
가속도나 무게의 영향을 제거하였다
(normalize 안하니까 예측하기 힘든 수준으로 날아가기도 했다)
그리고 대부분 공이 플레이어보다 ‘큰’ 상황이므로
z축 값은 포함시키지 않고 100을 넣어 위쪽으로 튕기게 하였다
Ball Spawner 구현
단순하게 위에서 구현한 ball을 계속 일정 시간마다 생성해주는 액터이다
Set Timer by Event 노드를 통하여
일정시간(초) 마다 Spawn 이벤트를 호출시키고
Spawn Actor 를 통해 공을 스폰시킨다
-
스폰 반경을 주어 x,y 방향으로 조금 랜덤한 위치에 스폰시킨다
-
공이 너무 오래 살아있으면 게임에 지장이 가니
life span을 1분으로 주어 공이 알아서 삭제되도록 하였다
원래는 class 용 변수가 있었으나 디버깅 중 삭제
Begin Overlap이 정상적으로 작동하지 않네??
거의 다 구현한 줄 알았는데 문제가 발생하였다
Spawn으로 생성한 Ball의 Begin Overlap 이벤트가 정상적으로 작동하지 않았다
그래서 BP Ball을 직접 에디터에서 배치하여 테스트 하였는데
이건 ‘정상적’으로 작동하였다
그렇기에 내가 생각하기로는
- Spawner 를 통해 생성하는 클래스가 이상한가?
-> 동일 클래스라면 이벤트가 잘 작동해야 하므로 - Collision Preset 문제인가?
-> Overlap 관련하여 문제가 발생할 때의 고질적인 원인 중 하나이므로 - 엔진 내부가 꼬여서 가끔씩 발생하는 문제인가?
-> 가끔씩 알게모르게 껐다 키면 문제가 해결되므로 - 피직스 관련 문제인가?
-> 이전 Begin Overlap 관련해선 피직스 옵션을 따로 설정하지 않았으므로
중 하나일 것 같았다
처음에는 Ball에서 수정된 내용이 Spawner에서 적용되지 않는 줄 알았으나
‘class’ 타입이며, 별도로 저장한 이전 타입 것이 아니라 에디터에서
클래스를 지정한 것이므로 아니라 판단하였다
Collision Preset은 매우 자주 보이는 문제이지만
f8을 통해 PIE 환경에서 보았을 때, 별다른 차이가 없어서
이 문제도 pass
관련 과정 중에서
에디터를 재시작하였음에도 문제는 그대로 였기에
엔진 상에서 가끔 보이는 버그도 아니였다
따라서 Physics 관련 문제라 생각하고
PIE에 생성된 액터를 눌러보았는데…
…??
액터의 위치와 static mesh가 따로 논다…?
Default SceneRoot와 그걸 부모로 삼는 Collision은
생성된 위치에 그대로 있었다
생각해보니 나는 Static Mesh 컴포넌트에만 Physics를 넣어놓았고
별다른 설정 없이 나머지 요소들이 Static Mesh를 따라 이동한다고
착각하고 있었다
문제 수정
따라서 Static Mesh를 Scene Root로 삼고
이후 Collsion을 Static Mesh에 붙여
위와 같은 계층 구조로 바꾸었다
모든 요소들이 정상적으로 이동하였으며
플레이어와의 Begin Overlap 이벤트도 잘 작동하게 되었다
오늘의 주의점이자 배운점
-
Default Scene Root는 별도의 ‘Transform’을 가진다
-
자식 요소는 ‘부모’를 따라 좌표를 형성하게 된다
(World Transform)
(자식은 부모를 기준으로 ‘상대적’ 위치를 가짐
Local Position)
=> DefaultSceneRoot가 움직이지 않았는데 Collision이 어디가리오?
Physics의 사용을 고려한다면 물리 법칙이 통용되는 컴포넌트를 root로 삼는 것이
안정된 결과를 보일 수 있음
결과물
만들고 여러 에셋을 배치하니 조금 더 그럴듯 한 모양이다
댓글남기기