본문 바로가기

Unity/Articles

Unity: 모바일 MMORPG 프로젝트 카야 Project Kaya 살펴보기

차례

서론

설치

프로젝트 구성

- 씬 (로비, 무브먼트)

- 캐릭터 (정보, 본, 무기)

- 셰이더 그래프 (PBR, PBR Skin, Hair)

- 렌더피쳐 (캐릭터 가려지는 부분 그리기)

- 플래너 리플렉션 (바닥 반사)

- VFX 그래프 (이펙트 파티클)

좋았던 점

아쉬운 점

바라는 점

서론

  2020년 유나이트 서울에서 발표된 세션에 등장했던 프로젝트 카야가 베일을 벗고 유니티코리아 GitHub 리포지토리에 공개되었습니다. 유니티 코리아 오피스 10주년을 기념하여 누구나 내려받아 실행시켜 볼 수 있게 오픈한 점이 고무적입니다.

 

  메인 캐릭터로 사용된 '카야'는 협력사에 외주발주를 통해 실제 게임 프로덕션 과정에 가깝게 제작되었다고 알려져, 적당한 더미를 사용해 실무에 큰 효용성이 없던 다른 테크 데모들과는 결이 다릅니다. 프리뷰 딱지를 달고 힙하게 등장한 기술 시연을 위한 데모가 아니라, 아무것도 없는 것에서 시작해 캐릭터 하나를 세팅한 프로젝트이기에 눈여겨 볼 곳이 군데군데 있습니다.

 

  아쉽게도 시간적 여유나 인력 등 여러가지 한계로 실제와 같은 빡빡한 외주관리와 폴리싱 과정을 거치지는 못했겠지만, 그에 최대한 가깝게 세팅되어 각 회사에서 R&D에 들어가기 앞서 한 번 쯤 둘러보기에 손해는 없을 콘텐츠라고 소개하고 싶습니다. 콘텐츠와 그것이 가지는 의미 위주로 둘러보는 과정을 글로 남기며, 코드에 대해서는 크게 언급하지 않습니다.

 

Disclaim : 제가 제작한 프로젝트가 아닌 결과물을 보고 분석 및 판단한 것이므로 제작자의 실제 의도와 상이하거나 구현된 사실과 다른 부분이 있을 수 있습니다. 관련하여 덧글남겨주시면 적극반영하겠습니다!

 

https://github.com/UnityKorea/ProjectKaya

 

GitHub - UnityKorea/ProjectKaya: Project Kaya for mobile game platform

Project Kaya for mobile game platform. Contribute to UnityKorea/ProjectKaya development by creating an account on GitHub.

github.com

 

 

설치

GitHub 홈페이지의 Download 버튼으로는 텍스춰 파일들이 내려받아지지 않으니, 다음 두 가지 방법 중에 선택하여 설치가 가능합니다. 만약 이미 설치했거나, 설치할 의사가 없다면 패스하면 됩니다..

 

방법 1. 커맨드라인으로 내려받기

git을 설치하고, cmd 또는 git bash를 열어 커맨드라인을 입력하여 다운받을 수 있습니다.

git clone https://github.com/UnityKorea/ProjectKaya

 

방법 1-1. LFS 관련 오류가 발생하는 경우

다운로드 가능한 용량 제한을 초과해서 발생하는 오류입니다. 

이 저장소를 fork 한 다음 내려받는 방법으로 우회할 수 있습니다.

fork후 마찬가지로 아래 커맨드라인으로 다운받을 수 있습니다.

git clone https://github.com/사용자아이디/ProjectKaya 

 

방법 2. 웹에서 다운받기

https://github.com/seonghwan-dev/ProjectKaya/tree/seonghwan-dev-remove-lfs

 

GitHub - seonghwan-dev/ProjectKaya: Project Kaya for mobile game platform

Project Kaya for mobile game platform. Contribute to seonghwan-dev/ProjectKaya development by creating an account on GitHub.

github.com

이 저장소에서는 웹에서 Code - Download Zip을 선택해도 내려받을 수 있도록 작업해두었습니다.

하지만 메인 저장소가 업데이트되면 즉각 반영이 되지 않으니 주의해야합니다.

 

프로젝트 구성

Scene

로비

로비 씬 (낮)
로비 씬 (밤)

 

Plane은 바닥 땅이고 평면 리플렉션 렌더링을 위한 컴포넌트가 붙어있습니다.

 

DaySetup에는 라이팅 관련 컴포넌트들이 붙은 컨테이너들이 있고 프리팹으로 저장된 상태입니다. NightSetup은 비활성화되어있는데 Day - Night 세팅을 따로 구성하여 저장해놓고 코드에서 스위치하는 방식으로 사용됩니다. 밤에 불 파티클이 너무 강렬해서 캐릭터가 잘 안보이지만, 끄면 되니까 크게 중요하진 않습니다.

 

캔버스에는 UI 관련 요소들이 포함되어있고 특이사항은 없습니다. 메인 카메라를 그대로 오버레이모드로 사용하고, 서브 캔버스는 없이 평면적으로 버튼들이 동작하고 활성화/비활성화됩니다. uGUI를 사용해 제작되었고, 버튼 중에 Movement 씬으로 넘겨주는 버튼이 있어 씬 이동이 바로 가능합니다.

 

카메라는 시네머신 패키지를 적극활용했습니다. Face, Body, Skill 캠 위치를 잡아두고 시네머신을 통해 트랜스폼을 블렌딩합니다.  카메라를 콘트롤해주는 스크립트 작성 없이도 목적대로 카메라 움직임을 구현했습니다. 마찬가지로 카메라 렌더링 옵션에도 특이사항이 없습니다. 

 

우측 상단의 아이콘을 통해 모션 재생 패널과 옵션 패널을 각각 열어볼 수 있습니다. 모션 패널의 아이콘의 히트박스를 조심해서 잘 눌러보면 모션이 재생됩니다. 이쪽 파트는 일단 기능 구현만 해 둔 정도로 느껴져서 아쉬웠습니다. 출시를 할 게 아니라면 그렇게 중요한 부분은 아니지만, 폴리싱이 덜 된 부분이라 시간이 많이 부족했다는 생각이 드는건 어쩔 수 없었습니다. 

 

스킬 버튼으로 사용되는 스킬 애니메이션은 애니메이터의 SetTrigger 함수를 onClick 이벤트에 등록해서 구현되었습니다. 스킬의 파티클 재생 역시 같은 방식으로 바인딩되어 재생됩니다. 

 

무브먼트 씬

무브먼트 씬

로비와 비슷한 구조이나 Night Setup이 존재하지 않습니다. 카메라도 움직임 위주로 캐릭터를 팔로우하는 모드만 제공합니다. 캐릭터는 로비에서 사용된 캐릭터의 프리팹 배리언트로, 전투 시스템 구현을 위한 컴포넌트가 추가로 몇 개 더 붙어 있고, 애니메이션 컨트롤과 스킬 시스템, 조작 등을 담당합니다. 

 

SettingPanel은 비활성화되어있는데, 열어보면 인게임 설정이 나타납니다. 이곳에서는 uGUI와 TMP가 동시에 혼용되어 사용되었는데,  의도한 장치는 아닐 듯 하고 촉박한 일정 아래 작업자가 달랐거나 다른 프로젝트에서 떼오는 과정에서 통일이 되지 않았던 것으로 추측됩니다.

 

캐릭터 움직임은 유니티 내장 컴포넌트인 Character Controller를 조작하는 PlayerController 클래스에서 담당합니다. 점프와 스킬 등 New InputSystem으로부터 입력을 받아 지정된 명령을 수행하는 방식입니다. 

 

머티리얼 데모 씬

머티리얼 데모 씬

이것저것 많이 깨져있습니다. 이래저래 Missing 머티리얼 다른 것으로 끼워놓고 조절해주었는데...

내부 테스트용 씬이었던 것 같습니다.

 

캐릭터

버텍스 : 13770개

인덱스 : 65427개

트라이앵글 21809개

서브메쉬 : 3개

 

본 세팅

프로젝트에 보면 2개의 캐릭터 메쉬가 포함되어있습니다. 하나는 _backup이라는 postfix가 달려있는 것으로 보아 조금 더 많은 데이터를 포함하고 있는 raw 메쉬로 추측됩니다. uv채널도 8개가 포함되어있고, 버텍스도 더 많습니다. 그 외적으로는 서브 에셋에서는 본 구조의 표기 방식에 차이가 있습니다.

사용된 캐릭터는 UTK_TemplateCharacter01 입니다. 얼핏 보면 이 메쉬에는 본 구조가 드러나지 않아 _backup 캐릭터의 본 구조를 사용하는 것으로 오해할 수 있는데 Optimize GameObject 옵션을 활성화한 것입니다. Optimize GameObject 옵션을 키게되면 게임오브젝트를 통해 보여지던 본 구조가 하이어라키에 노출되지 않게 됩니다. 이를 통해 스크립트나 트랜스폼 이동을 통해 위치를 조정할 수 없게 제한하고 스킨메쉬 매트릭스 추출은 멀티스레드로 동작하도록해 성능상의 이점을 볼 수 있습니다. 

 

무기 어태치

그런데, 특정한 본의 트랜스폼 데이터를 가져와야 하거나 자식으로 다른 게임오브젝트를 달아야한다면 이 방법을 사용할 수 있는데요. 

노출시키고 싶은 구조를 선택하고 Apply하면 해당 본이 게임오브젝트 구조에 나타납니다.

(Expand All 버튼을 누르거나 Alt 키를 누른채로 삼각형을 누르면 모든 하위 구조를 열 수 있습니다)

 

빨간색 메쉬는 캐릭터와 별개인 검 메쉬입니다. 로비 씬 기본 Idle 애니메이션에서는 Weapon 트랜스폼이 벨트에 가 있기 때문에 트랜스폼에 Sword를 Attach만 해 두어도 애니메이션에 따라 이동하게 됩니다. 

 

DCC 툴에서 원활한 확인을 위해 Weapon 이라는 구조에는 큐브 형태의 더미메쉬가 함께 임포트됩니다. 프리팹 에디팅할 때 메쉬 렌더러와 메쉬 필터 컴포넌트를 떼어버리고 자식으로 다른 Sword 프리팹을 달아서 사용하면 됩니다. 이렇게 다양한 무기 메쉬를 캐릭터와 분리하여 따로 관리할 수 있습니다.

 

카야에서는 오른손에만 소켓을 붙였지만 이런식으로 오른손, 등 허벅지 등 필요한 위치에 더미 본 구조를 추가에 소켓으로 활용하게 되는 경우가 빈번합니다.

 

커스텀 셰이더

셰이더 그래프를 이용하여 제작되었습니다.

 

PBR 셰이더 (캐릭터 바디, 검)

(Assets/Shaders/UTKTemplatePBR.shadergraph)

부분적으로 나누어 살펴보겠습니다.

베이스컬로 모듈은 크게 복잡하지 않습니다. Albedo 텍스춰에서 RGBA 데이터를 받고 UV0 채널을 이용해 매핑합니다. TintColor를 곱해 적당히 색감을 조절할 수 있게 장치했고, A 채널은 알파테스트를 하는데 사용되도록 따로 빼어줍니다.

 

셰이더 프로퍼티인 AlphaCut Boolean이 켜지면 Albedo에서 받아온 알파를 사용하고, 그렇지 않은 경우 고정 값 0을 마스터 노드의 Alpha 값으로 넘겨줍니다(윗노드). 보이는지 여부를 구분할 임계점 역시 AlphaCut 프로퍼티에 따라 마스터 노드의 Alpha Threshold로 넘겨줍니다(아랫노드).

 

노멀은 알베도와 마찬가지로 UV0 채널로 샘플링하고, G 채널에 강도를 곱해 조절할 수 있게 수치를 가공합니다. 마스터 노드에는 탄젠트 스페이스 노멀로 넘겨줍니다. 

 

마스크맵은 메탈릭, 스무스니스, 앰비언트 오클루전을 모두 포함한 텍스춰입니다. URP에서는 크게 3개 채널만 사용하는 편이고 필요에 따라 나머지 빈 채널인 B에 Height맵을 넣거나 다른 마스킹을 위한 데이터를 넣는 식으로 활용하기도 합니다.

여기에서는 UV0 채널로 텍스처를 샘플링하고, 메탈릭과 앰비언트 오클루전은 강도를 조절할 수 있게 프로퍼티를 곱해 마스터노드로 넘겨줍니다. 스무스니스는 최소 값과 최대 값을 재지정하여 범위 내에서 Remap해서 마스터 노드로 넘겨줍니다.

 

PBR Skin (캐릭터 피부)

(Assets/Shaders/UTKTemplateSkin.shadergraph)

캐릭터 피부를 위해 제작된 셰이더입니다.

 

Albedo, Normal, Maskmap 모듈은 위 PBR 셰이더와 동일하게 잡혀있습니다. 큰 차이점은 AlphaTest 부분이 없어 항상 Alpha는 1이 들어가도록 세팅되어 있고, 스킨 표현을 위한 Emission 계산 부분(SSS)이 추가적로 구현되어 있습니다. 

 

월드 포지션에서의 메인 라이트의 정보를 받아와서 그 방향과 월드 노멀 벡터를 더해 노멀라이즈 해줍니다. 크기가 -1인 단위벡터를 곱해 반대 방향으로 돌려주고, View Direction과 Dot 연산으로 SubSurface Scattering을 위한 값을 구합니다. 보통 (라이트 방향 + 노멀 * 디스토션)으로 계산하는데 여기에서는 디스토션을 수동으로 조절해주는 부분이 생략되어있습니다. 

 

계산된 SSS 하프벡터에 새츄래이션과 파워 연산을 거쳐 강도를 조절해주고, Albedo 맵의 알파채널에서 Thickness 맵을 받아와 곱해줍니다. 마지막으로 컬러 값을 곱해 조절해준 다음 Emission에 꽂아 투과하는 피부를 표현해줍니다. 

 

Thickness Map

두께를 데이터화해 산란 계산에 활용할 수 있습니다. 보통 Substance Painter와 같은 툴에서 베이크 할 수 있습니다. AO를 활용해 로컬 Thickness 맵을 생성할 수도 있는데, 메쉬 면을 뒤집고 AO 맵을 구운 다음 텍스처를 반전시키면 됩니다. 

 

Main Light

MainLight 노드는 셰이더 그래프에 기본으로 포함되어 있지 않습니다. Assets/Shaders/CustomFunctions/Lighting_Function.hlsl 파일에 정의되어있는 커스텀 함수입니다. Custom Functions 노드로 파일에서 가져와 사용합니다.

 

Kajiya-Kay 헤어 셰이더

대망의 애니소트로픽 헤어 셰이더입니다. Kajiya와 Kay가 시그래프에서 발표한 애니소트로픽 비등방 셰이딩 모델에 기반하여 작성되었습니다. 

 

공사중...

분량이 많아 ... 작성중입니다.

 

URP 렌더 피쳐와 캐릭터 디더링

가려진 캐릭터를 그려주기 위해 레이어 마스킹과 드로우 타이밍을 조절합니다.

https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@10.3/manual/renderer-features/how-to-custom-effect-render-objects.html

 

Example: How to create a custom rendering effect using the Render Objects Renderer Feature | Universal RP | 10.3.2

Example: How to create a custom rendering effect using the Render Objects Renderer Feature The example on this page describes how to create a custom rendering effect with the Render Objects Renderer Feature. Example overview The example on this page demons

docs.unity3d.com

렌더 피쳐의 Render Objects 기능으로 가려진 캐릭터를 렌더링합니다. Assets/URPSettings/ForwardRendererData.asset 인스펙터에서 확인할 수 있고,  Character, Effect 레이어를 제외한 오브젝트를 그린 다음 Character, Effect 레이어와 Depth Test를 해서 가려진 Character 레이어의 오브젝트를 오버라이드된 Dither 머티리얼로 그립니다. 위 URP 예제에 잘 나와있어 자세한 내용은 생략합니다.

이름은 Dither로 되어 있으나 캐릭터를 가리는 메쉬를 디더링으로 투명도를 빼는게 아니라 가려진 부분의 캐릭터 만큼 오버라이드 머티리얼로 그려줍니다.

 

플래너 리플렉션

Assets/Scripts/PlanarReflections.cs

URP 예제 프로젝트로 유명한 Boat Attack의 Water System에서 가져온 모듈입니다. 디스토션이 들어가지는 않고, 카메라를 한대 더 위치시키고 렌더 텍스쳐에 Blit으로 그린다음 머티리얼 통해서 그리는 방식입니다.

 

SRP의 카메라 렌더링 시작 델리게이트에 플래너 리플렉션을 생성할 함수를 등록해줍니다.

리플렉션 생성 함수에서는

 

1. 리플렉션 카메라 위치를 업데이트하고

2. 리플렉션를 저장한 렌더 텍스처를 세팅하고

3. 디더링 렌더피쳐를 끄고

4. 렌더 텍스쳐에 그리고

5. 디더링 렌더피쳐를 키고

6. 머티리얼에 텍스쳐를 끼워넣습니다.

 

6번에서 Shader.SetGlobalTexture도 호출하고 있고, sharedMaterial에도 SetTexture를 해 주고 있는데, 구현된 셰이더는 한 쪽만 사용하고 있을거라 셰이더에서 사용하는 쪽을 찾은 다음 한 쪽만 호출해줘도 될 것으로 예상됩니다. 

 

다른 파트는 특이점이 없으나, 1번의 카메라 위치 세팅은 약간의 코드가 포함되어 있습니다.

반사되는 장면은 메인 카메라가 바라보는 곳이 아닌 곳에서의 화면도 그려야 하기 때문에 스크린 스페이스 리플렉션이 아닌 리얼 카메라를 생성해 반사 평면을 기준으로 메인카메라와 수평으로 대칭되는 앵글에서 촬영하여 렌더 텍스처에 그려넣어야 합니다. 그래서 수동으로 리플렉션 매트릭스를 계산하는 코드가 포함되어 있습니다. 자세한 내용은 Boat Attack 관련 자료에서 확인할 수 있습니다.

 

플래너 리플렉션 텍스처 생성 과정에서 렌더피쳐를 건드려주는 트릭이 들어가 있습니다. 위 코드의 3번과 5번 작업을 해주지 않으면, 반사되는 곳에서 가려져 있는 캐릭터도 디더링이 된채로 보이게 됩니다. 

 

이펙트 VFX 그래프와 셰이더

Shield (Assets/Shaders/VfxShaderGraphs/Shield.shadergraph)

쉴드 모양의 이펙트입니다. Visual Effect Graph를 사용해 제작되었습니다. 머티리얼은 셰이더 그래프로 작성되었는데, 텍스처에 컬러를 곱해주고 알파를 조절해주는 정도만 구현되어있습니다. 셰이더 그래프를 열어보면 노이즈 관련 여러 노드가 구성되어있지만 실제로 사용되고 있는 노드는 간단합니다. 

텍스처를 UV0로 샘플링하고, VFX에서 사용할 수 있도록 Alpha와 Color를 프로퍼티로 노출시킵니다.

 

 

Debris (Assets/Shaders/VfxShaderGraphs/Debris.shadergraph)

 

쉴드 이펙트가 끝나고 부스러기가 흩어지는 모습의 이펙트입니다.

마찬가지로 셰이더 그래프가 있어 확인해보았더니 간단한 플립북 셰이더입니다.

 

이 부분은 vfx graph와 shader graph 조합 사용 경험 부족으로 인한 개인적인 삽질기록입니다...

 

개인적으로 개발하고 있는 에셋 레퍼런스 파인더를 이용해 이 셰이더 그래프를 사용하고 있는 파티클을 찾아 어떻게 사용하고 있는지 확인하려고 했지만...

그러나 해당 VFX 에셋에서 guid는 검색이 되지만 실제로는 데이터가 사용되고 있지 않은 상태 처럼 보였습니다. 직접 파일을 텍스트 에디터로 열어 guid를 찾아 확인해보았지만, 과거에 사용되었으나 현재는 사용하지 않음에도 클린업이 안되고 에셋에 링크되어 있는 상태가 아닌가 싶었습니다.

셰이더 그래프를 지워도 보았지만 런타임에서 파티클은 잘 재생되었습니다. 뭔가 이상해서 셰이더에서 사용되는 텍스쳐까지 지워보니 빈 쿼드 파티클이 렌더링 되었습니다. 다시 VFX 에셋을 열어 컴파일 후 저장을 하니 삭제된 셰이더 그래프 데이터가 없어 파티클이 깨지는 것을 확인하고, VFX 그래프 상에서 보이지 않을 뿐 어떻게든 링크해서 사용하고 있을 것이라 판단해 이런저런 문서를 뒤져가며 모든 노드와 세팅을 찾아 헤메었지만, 직접적인 링크는 어디에도 보이지 않았습니다.

분명히 Output Particle Quad에 셰이더 데이터가 있어야 할 것 같이 생겼습니다. 하여 Output Quad 노드를 새로 생성했더니 전혀 다른 모양의 노드가 생성되었고 여러 옵션을 만져봐도 원래의 노드처럼 보일 기미가 없었습니다.

뭔가 이상함을 깨닫고, 프로젝트 세팅과 프리퍼런스를 다 뒤진 끝에 의심가는 옵션을 발견했고 활성화 했습니다.

Experimental Operators/Blocks

Show Additional Debug Info

하지만 여전히 별 바뀐것은 없어 포기하려던 사이 Blend Mode 위쪽 빈 공간에 인터랙션 가능할 것 같은 박스가 자꾸만 하이라이트 되어 여러차례 눌러주니 노드가 리페인트 되면서 셰이더 그래프 오브젝트 필드가 노출되었습니다. 

 

???

 

이게 무슨 경우인지는 모르겠지만... 잃어버린 셰이더 그래프 레퍼런스 포탈을 발굴했습니다.

Preference에서 옵션을 활성화 하고 나면 우측 상단 Advanced 옵션에서 Refresh UI 버튼으로 일괄적으로 리페인트 할 수 있습니다.

여기까지 삽질 파트 종료입니다

 

쉴드 VFX 그래프는 크게 2가지로 구성되는데, 쉴드 파티클 1회 생성과 부스러기 여러개 생성으로 나뉩니다.

쉴드 생성 체인부터 살펴보겠습니다

Shield

1개의 파티클을 생성하겠다는 뜻입니다.

딜레이가 0이므로 재생 즉시 생성합니다.

 

생성될 파티클이 최대 128개 까지만 존재할 수 있도록 Capacity를 제한합니다.

스케일은 1,1,1 기본으로 생성하며,

0.61초 이후에는 파괴되도록 설정합니다.

 

왼쪽부터, Age Over Lifetime은 이 파티클이 생성되어 유지되는 시간동안을 비율로 나타내줍니다.

0.61초가 총 생명길이이므로 나이가 0초일 떄는 0, 나이가 0.305초일때는 0.5, 나이가 0.61초일때는 1을 넘겨줍니다.

이 수치를 가지고 Curve의 높이값을 샘플링해서 Alpha에 할당해줍니다.

 

그래서 이 Output 노드는 Shield 셰이더를 사용하고, Additive로 렌더링 되며, 컬러는 2, 0.8, 0인 HDR 노란색상이며, alpha값은 0에서부터 서서히 높아지다가 재생시간이 끝날때 1이 되고 뿅 사라지게 됩니다.

 

Debris

파티클을 Count 개수만큼 생성할 것입니다.

Count의 기본값은 300으로 지정되어있고, Particle 인스펙터에 노출되어 값을 인스턴스별로 지정해줄 수 있습니다.

Delay는 0.6초이므로 앞선 쉴드 파티클이 없어지기 0.1초전에 Count 수만큼의 부스러기(Debris)가 생성됩니다.

 

Capacity는 5000개로 전체 생성가능한 부스러기 수를 제한합니다.

바운드 스케일은 3이고, 각 생성 컴포넌트별 사이즈는 0.01~0.05 사이에서 생성됩니다.

수명은 0.8초입니다. 

 

포인트캐시 데이터를 기반으로 초기 위치를 지정합니다. 적용되어 있는 포인트캐시는 어떤 도구로 어떤 리소스를 기반으로 생성되어있는지는 파악하지 못했지만, 후디니에서 제작할 수도 있고 유니티에서도 Visual Effect에서 간편하게 베이크할 수 있는 도구(Window/Visual Effects/Utilities/Point Cache Bake Tool)를 사용하여 제작이 가능합니다. 보통 어떤 메쉬를 기반으로 파티클을 생성해야 할 때 포인트 캐쉬를 생성하여 사용하게 됩니다. 

 

Turbulence 노드는 바람에 날리는 듯한 효과를 줄 수 있습니다. 

Age Over Lifetime에서 수명 데이터를 받아오고 커브에 매핑합니다. 

강도는 시간이 지나면서 줄어들고 선형 드래그의 수치는 커져 시간이 지나면서 움직임이 둔해집니다.

Perlin 노이즈 타입이고 생성위치로부터 Relative한 움직임을 가집니다.

 

셰이더로부터 쿼드를 그리는 파트입니다.

Alpha는 수명에 따라 커브의 감쇠만큼 줄어들고, 

4컷짜리 플립북 Debris 텍스처 중에 랜덤하게 하나를 선택하여 그리게 됩니다.

컬러는 8.5, 2.7, 0의 밝은 HDR 노란색상이 고정입니다.

 

Spiral Skill 이펙트

이 이펙트는 셰이더 그래프를 사용하지 않고 VFX 그래프에서의 노드를 활용해 구현되었습니다. Fire VFX Graph를 베이스로 구현되어 있고, Shield 와 마찬가지로 크게 2가지 모듈로 구성되어있습니다. 


 

프로젝트 카야의 방향성에 대한 고민

좋은 점

가장 먼저 꼽고 싶은 점은 오픈소스라는 점입니다. 리소스가 공개되어있고, 일반 사용자들의 개선 요청이나 기여를 허용해 여럿이 집단지성으로 발전해 나갈 수 있는 잠재력을 부여한 케이스가 될 거라는 기대감도 생깁니다.

 

또, 양질의 리소스가 포함되어 있다는 점 역시 매력적입니다. 에셋으로서 사용하기는 쉽지 않겠지만, 그래도 실제 게임 출시를 위해 제작하듯 발주된 캐릭 모델이라는 점에서 기존에 공개되었던 그 어떤 예제 프로젝트보다 실무 R&D에 가깝게 다가갔다는 점에서 큰 의미가 있습니다. 마지막으로는 최소한의 빌드테스트가 가능한 상태라는 것이 반갑게 느껴졌습니다.

 

의외로 데모 프로젝트, 테크데모 예제로 공개되거나 에셋 스토어에 템플릿으로 올라오는 프로젝트들이 빌드 테스트가 불가능한 상태인 케이스가 많습니다. 그런 상황을 겪을수록 과도하게 '허술하다' 또는 '실무랑은 동떨어져있다'는 느낌을 많이 받게되고 그 결과 당장 개발 파이프라인에 있어 써먹어볼만한 무언가는 아니라는 평을 받게 됩니다. 그러나 카야는 모바일 플랫폼 Vulkan에 대해 빌드 테스트까지 깔끔하게 되어있다는 점에서 꽤 신뢰를 줍니다.

 

아쉬운 점

프로젝트의 시작 동기는 존재했으나 나아갈 목표점이 모호해 오픈소스로서 의미가 퇴색되는 듯해 아쉽습니다. 조금 더 구체적으로는, 이 프로젝트로 어떤 것을 하고자 하는지가 불명확하다고 느낍니다. 준수한 퀄리티의 캐릭터와 리소스 관리, 셰이더 구현과 내장 렌더피쳐 사용, VFX 이펙트를 두루 사용했지만, 특정한 목표를 향한 구성이라기보다는 필수적으로 있어야 할 것들 중 일부를 스탠다드하게 포함시킨 정도로 보입니다. 이 부분은 아무래도 제 욕심과 기대가 커서 아쉬움을 더욱 느끼는 것 같습니다.

 

카야프로젝트는 에셋 제공 목적이라고 하기엔 애매하고, 샘플 구경 정도에 헤어셰이더그래프와 PBR 셰이더의 구현일 뿐 디테일하게 들어간다면 DCC-Unity 파이프라인을 공개하거나 제안한 것도 아니여서 제로베이스에서 이 파이프라인을 구성하기까지는 상당한 보이지 않는 노력이 동반되어야 할 거라 생각이 들었습니다. 예를 든다면 헤어 셰이더에서 사용된 후디니에서 뽑은 플로우맵 프로젝트 파일이라던가 로우 리소스가 있다면 그것대로 도움이 될 수 있고, Thickness Map이 생성 방식이나 캐릭터 로우리소스에 대한 정보가 더 포함되는 것(DCC 로우 프로젝트 파일이 아닌 리소스 기획 디테일이나 모델링 버텍스 버젯 등)도 큰 도움이 될 것 같습니다. 

 

실제 출시할 프로젝트도 아니고, 여러 사정으로 폴리싱 여유가 없는건 이해하지만 프로젝트가 좀 더 정돈될 여지가 있다는 점도 아쉬운 부분입니다. 사용되지 않는 리소스나 씬, 코드들도 꽤 있지만 프로젝트의 구체적인 목표와 기여 가이드, 철학 등이 공개되어 있지 않아 작업중인 파트인지, Deprecate되어 지워져도 되는 리소스인지 분간이 되지 않습니다.

 

바라는 점

오픈소스로서 메인테이닝이 지속되려면 러프한 펀더멘탈, 필로소피, 로드맵이라도 있어야 프로젝트에 녹이 슬지 않을 거라 최소 타겟 기기 사양정도라던가, OpenGL ES 3.0 Compatible, 셰이더그래프-HLSL 양쪽 동시 구현 임플리멘테이션을 한다던가...하는 꽤 멀리있지만서도 여러 기여를 독려할 수 있는 목표가 필요하다고 봅니다. 

 

일반적으로 모바일 MMORPG 개발에서 겪는 페인포인트(옷갈아입기, 장비세팅 등), 많은 캐릭터가 씬에 등장해야 할 때를 대비한 LOD 등에 대한 부수적인 구현에 대한 고민도 있다면 좋을 것 같습니다. 그렇다고 다양한 모든 케이스의 이슈상황에 대한 솔루션을 제안하고 구현해야한다는 것은 아니고, 어떤 방식으로 트러블슈팅을 해 볼 수 있을지 실마리 정도만 두는것으로도 많은 개발자들의 기여를 불러오지 않을까 기대해봅니다.

 

같은 맥락에서 현재는 프로젝트 자체가 단일 캐릭터와 텍스춰 및 렌더링 관련 리소스에 초점이 맞춰진 느낌인 까닭에 '게임'에 필수적으로 들어갈 에센셜한 요소들이 없는 상태입니다. 콘텐츠로서 하나의 개념이 추가될때마다 적어도 한 개 이상의 시스템이 추가되어야만 하고, 그 시스템은 다른 대부분의 시스템에 영향을 끼치게 됩니다. (예시, 갑옷 갈아입기 시스템 -> 전반적인 캐릭터 제작 파이프라인이 다 영향을 받음) 대부분의 구현상의 이슈나 리소스 최적화는 이 과정에서 병행하여 생겨나기 마련인데, 문제가 생길 수 있는 요소가 전혀 없는 깔끔한 바닐라 상태의 프로젝트이므로 뭔가 더 추가하거나 구현하려고 해 봐도 개발자들이 뾰족하게 기여할 요소를 특정하기가 어려워하는 상태라 느껴집니다.

 

궁극적으로는 러닝타임이 5분이내더라도, 혹은 미니게임이더라도 최소한의 플레이어블 프로토타입이 되는게 모바일 mmorpg 페인포인트를 찝어줄 수 있는 프로젝트가 될 수 있을거라 기대해봅니다.

 

개인적으로 시도 해 보면 좋겠다 싶은 작업

애니메이션 리깅을 활용한 IK 무기 핸들링 (등, 벨트에 무기를 붙이는 작업)

공격 모션에서 무기가 상대에 타격함을 감지하여 Inverse로 풀바디 콤보 애니메이션에 영향을 줄 수 있는 시스템, 패링 등

 

마무리

혹시나, 기여에 관심이 있으시다면!! 함께하시죠~

 

 

참고한 외부 사이트

https://zhuanlan.zhihu.com/p/363829203

 

Anisotropic Rendering (2) Kajiya Kay Hair Rendering

IntroductionBased on the results of the previous anisotropy, we can extend it to hair rendering. Kajiya Kay hair rendering is an empirical model. It models the hair into thin tubes. Then use the mat…

zhuanlan.zhihu.com

 

https://web.engr.oregonstate.edu/~mjb/cs519/Projects/Papers/HairRendering.pdf