유니티 렌더링 뎊스 : UI 사이에 오브젝트 그리기

2017. 5. 18. 16:10프로그래밍/Unity

반응형
SMALL

유니티 렌더링 순차는 여러가지로 나뉜다.


1.카메라 뎊스

유니티 를 사용하면 보통 NGUI로 UI를 많이 처리하는데,

보통의 경우 카메라를 따로 사용하며, 게임화면 과 UI화면을 분할해서 순차적 렌더링을 하고 있을것이다. 

카메라의 뎊스를 다르게 줌으로서 UI를 게임화면 위에 붙일수 있는것이다.


이것은 camera 를 여러개 두고 인스펙터 상에서 뎊스만 조정하면 돼는 간단한 작업이므로 패스한다.

(카메라에 어떤 것을 비출것인지 레이어를 구분하는 작업은 나중에 하려고 하면 복잡하고 귀찮을 수 있다. 처음부터 용도에 맞게 구분하여 사용하도록 하자.)



2. sort order

활용하다보면 UI 위에 이펙트, 캐릭터,  GUI, Mesh 등등 어떤 것들이 올라와야 하는 경우가 생긴다. 


이펙트 파티클시스템을 예로 들면 세부 사항중에 renderer가 있고, 그 안에 order in layer(= sort order,= sorting order ) 라는 항목이 있다.





어떤 레이어에서 주문순서를 정해놓는 것으로 해당 레이어를 렌더링할때 낮은 번호의 것부터 렌더링 하여 그 위에 순차적으로 덮어씌워 그려지는 형태로 이해하면 됀다.


NGUI의 UIPanel 에 있는 depth는 NGUI끼리의 주문순서이고, 그아래 있는 SortOrder가 해당 레이어의 주문순서(좀더 상위)인 셈이다.


즉 NGUI 상에서 패널의 위아래를 구분하기 위해 사용하던 depth를 활용하던 방식으로 , 다른오브젝트나 이펙트를 포함하여 SortOrder를 이용해 위아래를 구분지으면 됀다. (SortOrder를 조정했는데 이펙트가 UI위로 안올라온다면 UI와 이펙트가 동일 레이어인지 확인하라)


이 sortOrder로 UI 사이에 이펙트를 끼워넣을수 있을것이다.



3. 렌더큐

모든 렌더링오브젝트에는 메테리얼이 작용한다. 그리고 메테리얼에는 쉐이더가 작용하고, 랜더큐를 제공하고있다.

material.renderQueue 변수는 전체 메테리얼의 주문순서라고 이해하면 됀다.


NGUI의 랜더큐는 보통 3000근처로 지정되어있다.(베이스가 3000이고 NGUI 뎊스 등에 따라 변하는걸로 추정)

(유니티 레퍼런스를 통해서 유니티 내부적으로 시스템이 활용하는 렌더큐 범위를 볼수 있는데, 정확한 수치는 기억나지 않지만 1000단위로 끊어져 있다, 1000,2000,3000,4000구역별로 시스템, 기즈모, UI, 오버레이 순으로 되어있던걸로 기억한다)

무엇으로 되어있는지가 중요한것이 아니고, NGUI는 유니티 렌터큐 설정에 따라서 3000정도로 맞춰놓은 듯한데, 

해당 UI의 랜더큐를 구하는 함수를 짜서 결과랜더큐값에 +1하는 식으로 구하든 , 그저 높은 숫자로 3500이나 4000정도로 적어넣든 

UI위로 올릴수 있다.



이 랜더큐 수치를 통해 위아래를 정할수 있을것이다.

이때 주의할점은 렌더큐보다 sortorder가 상위개념이라는 점이다.


A 위에 B 위에 C 순서로 랜더를 하고싶었는데,


A:  sortorder = 1 , renderQueue =300,

B : sortorder = 1 , renderQueue =301,

C : sortorder = 0 , renderQueue =302,


라면 렌더큐상으로 맞아도, sortorder 가 낮은 C부터 그려지고 A,B순으로 그려질것이다.

sortorder 가 동일한 상황에서 renderQueue 로 세부조정하는 것이라고 생각하면 됀다 (NGUI는 패널 뎊스로 조정하고 내부에서 스프라이트나 라벨의 위젯뎊스가 세부조정하는 것처럼 동일하게 이해하면 됀다)





결론===이펙트,스파인렌더러,메쉬 등등등 너무 다양한 것들이 있기 때문에 각각의 어떤 부분을 조정하면 됀다고 얘기하기는 어렵다.


하지만, 기본적으로 모든 랜더객체들은 


1.유니티오브젝트로 구분되어 레이어로 구분되어지고 

2.랜더러를 보유하고 있다면 sortingOrder 를 가지고 있을것이며,

3.메테리얼을 보유하고 있으므로 renderQueue를 가지고 있다는 점이다.


그러므로


1. 레이어구분으로 위아래를 정할수 있다

2. 동일레이어 상에서 sortingOrder 순서로  위아래를 정할수 있다

3. 동일레이어 ,동일 sortingOrder 에서 renderQueue로 위아래를 지정한다.


로 결론을 내릴 수 있겠다.






위 내용에 포함되어 당연한 이야기지만 

sortingOrder 에 접근하려면 MeshRenderer클래스를 찾아가고, renderQueue에 접근하려면 메테리얼 클래스를 찾아가라.

(레이어는 유니티 프로그램 내에서 구분가능)


예를 들어 위처럼 스파인 스켈레톤 애니메이션 스크립트에는 order in layer가 친절하게 붙어있다.

하지만 인스펙터가 아닌 코드상에서 위에 접근하려면 


SkeletonAnimation SA_Cha;

SA_Cha.gameObject.GetComponent<MeshRenderer>().sortingOrder = -1;




SkeletonAnimation 클래스에서 찾을수 없고, 매쉬랜더러를 통해 찾아 들어가야 한다. 

해당클래스가 친절하게 제공하고 있지 않다면 이 포스팅의 활용을 위해서,

랜더러와 메테리얼을 찾아 들어가면 됀다고 이해하고 있는 것이 중요할것이다.




반응형
LIST