HDRP Project setting은 개인적으로 굉장하다고 생각됩니다.(더 많은 옵션이 있으면 좋겠다는...)
URP에서의 Project setting는 뭐랄까 굉장히 제약이 많고 할수 있는게 별로 없다는 느낌이지만,
HDRP Project setting 정말 많은 부분을 직접 설정할수 있다는게 굉장히 매력적입니다.
Project Setting을 열어 초기 셋팅을 시작합니다.
HDRP는 기본적으로 Linear로 설정이 되어 있지만, 처음에 확인하는 것이 좋습니다.
이게 왜 중요한가는 화면에 보이는 방식과 Shader를 계산할때 수치적으로 정확하게 하기 위함이라고 생각하고 넘어가면 될 거 같습니다.
(감마와 리니어에 대한 장단점은 대마왕님 강의를 검색하셔서 보시는것을 추천합니다.)
그다음은 Graphics인데, 이게 개인적으로는 초기에는 Quality랑 좀 헛갈리는 부분이 있었습니다.
둘다 똑같이HDRenderPipelineAsset이라는 놈을 사용합니다.
그냥 두시면됩니다.그냥 기본적인 게임Quality셋팅이라고 할수 있습니다.
DefaultHDRPAsset을 임의로 설정할수 있는데, 어차피 Quality에서 설정하기 때문에 이부분은 구지 건드릴 필요는 없다고 생각됩니다.(이렇게 말하면서, 본인은medium HDRenderPipelineAsset을 여기에 바꿔놓았고..)
Quality에서 보면 이렇게 보이는것을 알수 있습니다.
그다음은 HDRP Default Settings로 넘어가서 대부분 그대로 두면되는데,
중요한 부분은 Light Layer names과 Volume Components를 설정하는 것입니다.
Light Layer name은 조명 레이어 설정할때 이름 변경하는 부분입니다.(기본으로 둬도 상관없는데, 은근히 헛갈리기 때문에 이름을 바꿔서 사용합니다. 레이어 이름을 어디서 변경하나 했더니...여기있었군요...)
Volume Components를 확인하면, 기본적으로 뭔가 많이 있습니다.
이부분은 Scene을 구성할 때 기본적으로 설정하는 포스트프로세싱입니다.
전체적으로 어떤 분위기를 잡기 위해서 설정하는 것인데, 스테이지마다 분위기가 다르고 설정해야 할 값이 다르다면
Scene에서 직접 구성하는 것 좋기 때문에 대부분 삭제하는 것 좋습니다.
전 개인적으로 Exposure를 제외하고 다 없애고 사용합니다. 어차피 Scene에서 Exposure(노출)를 따로 조정하기 때문에 이것도 의미가 크게 있진 않지만 통일된 기본셋을 하나는 넣어 두는 것이 좋다고 생각합니다.
(그외에 Shadows 처럼 크게 변경되지 않는 것들을 넣어두면 편리합니다.)
그리고, LookDev Volume이라는 것이 있는데, 이건 임시로 모델링에 포스트프로세싱을 볼 수 있게 해주는 별도의 툴인데, 게임 설정과는 아무런 상관이 없는 부분이라 무시하셔도 됩니다.(이게 뭔지 한참을 찾았다는...)
다음 제일 중요한 퀄리티 셋팅 부분입니다.
이부분을 어떻게 설정하느냐에 따라 고사양 컴퓨터와 저사양 컴퓨터에서 돌아가게 하는것을 결정하는 곳이기 때문입니다. 말그대로 퀄리티를 설정하는 부분인데, 각각 설정을 어떻게 하느냐에 따라서 포스트프로세싱이나 그림자의 퀄리티가 결정이 됩니다. 아래는 기본 HDRP 설정입니다.
근데, Quality 아래에 HDRP가 또 있습니다.
이게 뭐냐면 Quality에 있는 Very low, Medium, Ultra를 각각 컨트롤 하는 부분입니다.
일종에 세부 설정입니다.
근데, 이게 Inspector에서도 수정할수 있는 부분입니다.(편의상 이곳에 해놓은거 같습니다.)
이 퀄리티 파일은 Project에서 우클릭하여 아래처럼 생성할수 있습니다만, 아무래도 유니티에서 제공되는 기본을 가지고 변경하는것이 뭔가 맘이 편합니다.
아무리봐도 그다지 차이가 없는데, 풀 코드를 봐서도 그다지 두개의 차이점을 알아낼수가 없었습니다.
다만, 모바일에는 path를 주어서 path을 막아버릴수 있다는거 외에는 그래서 뭐가 정확히 다른가하고 문의한 결과.
Each shader in the UTS2 mobile version omits the FORWRD_DELTA pass. This pass functionally handles the toon processing of the real-time point light, but since the real-time point light itself is a heavy function in the mobile environment, we have omitted this pass to reduce the task of shaders.
라고 답변이 왔습니다.
짧은 번역 능력으로 해설하자면, 모바일은 FORWRD_DELTA pass가 빠져있어서, 리얼타임 포인트라이트가 영향을 받지 않도록 설계가 되어있다고....
해서 다시 코드를 보니.. 빠져있군요.. 아직 갈길이 멀었군요.. 이정도는 눈치챘어야했는데.ㅋ
회사마다 TA 역할이 다르다 보니 제가 하는 일이 무엇인가 하는 걸 좀 정리해 보았습니다.
제는 가장 많이 하는 일은 최적화 관련 일입니다. 거의 주된 업무라고 할수 있습니다. 새로운 오브젝트가 들어갈 때마다 최적화를 기본적으로 다룹니다.
캐릭터 초반설계시에는 셰이더도 만들어야 하고 본 세팅도 봐야 하고 여러 가지 시간이 좀 들지만 이후는 관리 작업이 주로입니다. 정기적으로는 새로운 배경이나, 캐릭터가 추가되었을 때마다 머터리얼 설정을 하고 필요에 따른 각종 설정을 추가하는 일입니다. 현재 제작되고 있는 캐릭터의 경우 아웃게임과 인게임의 머터리얼을 다르기 때문에 이를 분리하고 인게임의 경우 레이어로 라이트를 관리가 필요하여 이를 작업합니다. 복잡한 구조는 세팅에 대한 실수가 잦아 이를 방지하기 위해서 툴을 만들어서 관리를 하곤 합니다. 요즘에는 ChatGPT 덕분에 코딩이 익숙지 않은 저에겐 관리툴을 만들기가 훨씬 용의 해졌습니다.
애니메이터가 원하는 동작을 볼 수 있도록 간단한 툴을 만들기도 합니다. 이번 프로젝트는 다이나믹본을 사용하였는데(다이나믹본을 사용하자고 제시하는 일도 합니다.), 이를 확인하는 것은 유니티 내부에서만 가능했기에 이를 확인할 수 있는 간단한 Scene을 만들어서 새로운 모션을 넣어서 확인하는 기능과 다이나믹본이 문제가 없는지 확인하는 기능, 라이트를 받았을 때 캐릭터에게 어떻게 반영되는지 보여주는 등의 간단한 툴을 제작하기도 하였습니다.
가끔 기획적으로 추가되는 효과나 좋은 아이디어가 떠오르면 AD와 상의하여 추가적인 설정을 합니다. 얼마 전에는 캐릭터가 너무 창백해 보인다는 생각이 들어서 몇 번의 테스트를 거쳐서 sss 설정을 추가하였군요.
현재 저의 회사 특성상 캐릭터에 비해 배경에 많은 시간이 들곤 합니다. 배경 제작은 주로 외주라 최적화가 안된 경우가 많습니다. 아무래도 외부에서 제작되다 보니 알 수 없는 포퍼먼스 저하가 있곤 합니다. 하여 이를 필요에 따라 모델링을 다시 고치는 경우도 있고 머터리얼 설정을 다시 하곤 합니다. LOD가 필요한 경우 직접 제작하거나 외주에 맡깁니다. 가장 기억에 남았던 이슈는 알 수 없는 포퍼먼스 저하였는데 2주 정도 소비를 했던 거 같습니다. 원인은 아주 단순했는데 외주에서 카메라에 실수로 MSAA(안티엘리어싱)을 넣어 놨던 거였습니다. (그 이전에 프로그램팀에서 다른 원인을 발생시켜서 더 혼란을 주긴 했었습니다.ㅠㅠ) 아까운 2주가 소요되었지만 이게 TA 업무에서 가장 중요한 일중에 하나라고 생각합니다. 배경은 꾸준한 최적화가 필요해서 2주에서 한 달 정도 시간이 들기도 합니다. 그래서 가장 화면에 많이 띄워져 있는 것이 유니티에서 게임 배경인 경우가 많습니다.
다른 작업자들이 보기엔 저 사람을 도대체 무얼 하고 있는가 라는 의문이 들 수 있을 거라는 생각도 듭니다. 매번 같은 화면에서 무언가 계속 하지만 결과가 빠르게 나오지 않기 때문이겠지요.
제가 하는 TA로서의 업무는 AD와 PD의 신뢰를 기반으로 합니다. 이유는 정확히 언제 끝이 날지 모르는 일들이 꽤 많기 때문이고, 우리 게임에 맞는 좋은 아트를 위해서 제시할 수 있는 연구가 필요로 하기 때문입니다. 그래서 간혹의 경우 실패를 하는 경우도 있습니다. 결과를 도출했지만, 기대에 미치지 못하여 사용하지 못하는 경우도 생깁니다.(실패할 경우에는 이를 우회하거나 다른 차선책을 머릿속에 생각하곤 합니다.) 대부분은 우리 게임 속 요구하는 내용은 이미 구현된 것들이긴 하지만, 막상 내가 구현하려면 공부가 필요할 수밖에 없습니다.
제가 하는 일중 또 하나의 중요하다고 생각되는 일은 AD나 PD나 프로그램이나 아티스트나 이런 것이 되는가?라는 질문에 해결책을 내놓는 것입니다.(항상 방법은 있다고 생각하는 편입니다.) 가령 PD가 캐릭터가 저사양에서는 포퍼먼스 때문에 캐릭터에만 그림자만 적용하고 싶다고 했을 때, 이를 분리할 방법을 찾고 이를 적용하는 것입니다. 혼자 해결하기도 하고 아트팀이나 프로그램팀과 공조를 하기도 합니다. 그리고, 애매한 것들(아트에서 뭘 해야 하지? 프로그램에서 뭘 해줘야 하지?)을 정리하기도 합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NPC_Chair_Random : StateMachineBehaviour
{
// OnStateEnter is called before OnStateEnter is called on any state inside this state machine
//override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
// OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
//override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
// OnStateExit is called before OnStateExit is called on any state inside this state machine
//override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
// OnStateMove is called before OnStateMove is called on any state inside this state machine
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
// OnStateIK is called before OnStateIK is called on any state inside this state machine
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{
//
//}
// OnStateMachineEnter is called when entering a state machine via its Entry Node
override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
{
animator.SetInteger("MoveID", Random.Range(0, 2)); //""따옴표 때문에 에러가 나서 헤멤.
}
// OnStateMachineExit is called when exiting a state machine via its Exit Node
//override public void OnStateMachineExit(Animator animator, int stateMachinePathHash)
//{
//
//}
}