Top

[언리얼엔진5] VR 바텐딩 시뮬레이션 게임 제작 (1)

Daily Study/UE5

2023. 4. 24.

반응형

정말정말 간만에 블로그에 글을 올립니다.

 

작년 11월에 졸업전시 잘 마무리하고
졸업전시가 끝나고 얼마 안된 22년 11월 말부터 지금까지 계속

서울산업진흥원에서 운영하고 있는
청년취업사관학교에서
'언리얼엔진5를 활용한 VR/AR 컨텐츠 개발 과정'을 수강하고 있습니다.

 

실질적으로는 언리얼엔진과 C++를 활용해서
게임 개발하는 짧은 프로젝트들을 4번 정도 했습니다.
제가 게임을 만들고 싶었던 건 아니지만

 

게임을 만들면 그 외의 콘텐츠들을 만드는건 비교적 어렵지 않다고 하니

게임 외의 콘텐츠는 만들기 쉽다는 의미보다는
게임에서 상호작용을 덜어내면 영상이 되고
게임적인 요소를 덜어내면 시뮬레이션이 되고
하는 느낌의 언급입니다.

과정이 끝나면 제가 만들고 싶었던 것들도 차근차근
만들어 보고 블로그/유튜브에 공유할까 합니다.

 

11월 말부터 6월 초까지 882시간 과정이라
언제 다 듣나 걱정이었지만... 어느새 최종 프로젝트를 하고 있습니다.

 


저랑 팀원분들은 총 3명이서
바텐딩 시뮬레이션 VR게임을 제작하고 있습니다.

 

대략적인 기획도 다 마무리가 되었고
아직 프로토타입도 나오지 않은 상태라
블로그에서는 개발 과정을 간략하게 기록/공유해보려고 합니다.

 

저희 팀은 아무래도 액체/유체를 계속 다뤄야하는 장르다보니
가장 우선적으로 테스트해보고 구현했던 기능은
병에 담긴 액체를 기울여서 컵에 붓고
컵에는 흘러나온 액체가 담기는 기능이었습니다.

 

병 / 컵 등 액체와 관련된 파트는 다 제가 담당하고 있습니다.

Niagara Fluid Simulation

원래는 사실적인 유체 시뮬레이션 느낌을 위해서
위 움짤처럼 플루이드 시뮬레이션을 사용해보고 싶었는데

아무래도 플루이드 시뮬레이션은 시각적인 부분에 초점이 맞춰져 있다보니
다른 액터와의 충돌을 감지해낸다거나 이벤트를 발생시키기에는
부적합하다는 판단을 내렸습니다.

 

그래서 액체 표현, 유체 표현이 잘 된 콘텐츠가 뭐가 있을까? 생각을 해보니
역시...

하프라이프 알릭스가 가장 먼저 떠올랐습니다.

하프라이프 알릭스에서의 액체 표현

하프라이프 알릭스에 나왔던 액체 쉐이더를 만든 분 인터뷰도 참고했습니다.

그냥 플레이해보고 체험해봤을때는
이런 방식일거란 생각을 전혀 하지 못했는데
새삼 접근 방법을 알고나니 이런 방식이었기 때문에
가능했던 표현이라고 느껴졌습니다.

말이 좀 이상하지만ㅋㅋㅋㅋ

어쨌든.. 결론적으로는
사실 부피를 차지하는, 실제로 채워져있는 것이 아니라
텍스쳐로 표현이 되었다는 점
하프라이프 알릭스의 booze 쉐이더의 특징이었습니다.

저도 이 booze 쉐이더를 계기로
아예 이번 프로젝트에서는
플루이드 시뮬레이션을 사용한 유체 시뮬레이션을 포기하고

아예 머테리얼과 쉐이더로만 표현하는 방식으로
노선을 변경했습니다.

 

그래서 병부터 제작에 들어갔습니다.
병은 간단하게 액터 클래스로 제작해서

병 모양을 가질 스태틱 메쉬를 추가하고
병 상단에 꽂힐 푸어러 스태틱 메쉬를 또 별도로 추가해줬습니다.

액터가 기울어졌을 떄를 판단하여
일정 각도 이상 됐을 경우
푸어러의 끝 부분에서 물줄기 나이아가라 시스템을 재생시키고
컵과 상호작용할 방울방울 액터를 스폰시킬 계획입니다.

	float dot = FVector::DotProduct(GetActorUpVector(), upVector);
	float angle = FMath::RadiansToDegrees(FMath::Acos(dot));

간단하게 병 액터의 위 방향과 월드 기준의 위 방향의 내적을 구해서
병 액터의 tick 함수 안에 넣어서
매 틱마다 병 액터의 각도를 계산했습니다.

물줄기 나이아가라 이펙트도
푸어러를 사용하는 영상을 보면서 참고해서 뚝딱 제작해주고요
최대한 일정한 유량이 흔들림 없이 나오는 느낌을 내고 싶었습니다.

푸어러를 통해 나오는 액체를 표현한 나이아가라

그리고 병 액터의 각도를 조절해보면...

특정 축을 기준으로만 각도 판단을 하는게 아니기 때문에
어느 방향으로 돌려도 각도를 인식하고 물줄기를 만들어냅니다.

원래는 남은 양에 따라서 기울이는 각도도 같이 유동적으로 조절하려고 했는데
실제로 술병과 푸어러를 사서 관찰해보니
잔량에 상관없이 술병을 거의 수평으로 기울일때까지는
액체가 흘러나오지 않는 것을 알았습니다.


 

그리고 다음 고비였던
booze 쉐이더처럼 텍스쳐로
병의 내부를 표현하는 방법도 적용해봤습니다.

이 액체 머테리얼 같은 경우에는
제가 처음부터 끝까지 만든 머테리얼은 아니고

외국의 한 개발자가 만든
상업적 이용 / 수정 사용이 가능한 배포된 머테리얼을
이번 프로젝트에 맞게 수정해서 사용했습니다.

궁금하신 분들은 아래 링크로 접속하시면 프로젝트 파일 보실 수 있습니다.

https://www.artstation.com/artwork/rAeqOO

재밌는 점은 상업 사용이나 수정 모두 너그럽게 열어둔 대신
본인에게 머테리얼 관련된 질문은 하지 말라고 하더라고요ㅋㅋㅋㅋㅋ
쿨하게ㅋㅋㅋㅋㅋㅋㅋㅋ

덕분에 저도 이 분이 만든 머테리얼 노드 하나하나 뜯어보면서
멘탈도 오락가락 하면서도
많이 배울 수 있었습니다.

booze 쉐이더의 관건은
현재 카메라의 포지션과 실제 월드 포지션을 비교하면서
어느 선까지 수위가 차오를지를 정하고 관리하는 부분이었습니다.

저는 여러 형태의 병을 사용해야 하기 때문에
수위와 관련된 옵션들을 모두 수정했고

투명한 병 표현이 되어있지 않아
투명한 느낌도 더하는 방향으로 수정했습니다.

 

수정한 머테리얼을 적용하고 보면 이런 느낌입니다.

요번 글은 벌써 꽤 길어져서
여기까지 쓰는 걸로 하고

다음 글에 이어서 컵이 채워지는 부분과
섞인 순서와 양을 판단하는 부분에 대한
포스팅으로 이어가겠습니다.

반응형