SDK for Unity에서의 마스크 사용 상한에 대하여
업데이트: 2023/05/25
개요
Cubism SDK for Unity의 디폴트에서는 표시되는 모든 모델이 하나의 마스크용 텍스쳐를 공유합니다.
따라서 각 모델이 마스크의 사용 상한 수를 초과하지 않아도 모델을 여러 개 화면에 배치하면 마스크용 텍스쳐의 사용 상한 수에 도달하여 클리핑 표시가 무너질 가능성이 있습니다.
이것을 피하는 방법은 3가지가 있으며, 각각 특징이 다릅니다.
- 모델별 마스크용 텍스쳐 설정
- 마스크용 텍스쳐에 할당을 등록/삭제하는 타이밍 변경
- 마스크용 텍스쳐 내부의 텍스쳐 수 늘리기
Unity의 마스크용 텍스쳐 특성에 대한 자세한 내용은 「각 Cubism SDK 비교」를 참조하십시오.
모델별 마스크용 텍스쳐 설정
이 방법은 마스크용 텍스쳐를 모델별로 준비함으로써 다른 배치된 모델에 영향을 받지 않고 클리핑을 표시할 수 있습니다.
다만, 마스크용 텍스쳐를 복수 준비하게 되기 때문에 그만큼 성능에 영향을 줄 가능성이 있으므로 주의해 주세요.
모델별로 마스크용 텍스쳐를 설정하려면 다음 절차를 실시하십시오.
- 전용 마스크용 텍스쳐 생성
- 생성한 마스크용 텍스쳐를 모델의 프리팹에 연결된 CubismMaskController의
Mask Texture
에 설정
전용 마스크용 텍스쳐 생성
모델 전용 마스크용 텍스쳐의 인스턴스를 만듭니다.
만드는 방법은 여러 가지가 있습니다.
다음 방법 중 하나로 생성하십시오.
- Cubism SDK for Unity와 함께 제공되는 GlobalMaskTexture를 복제
- CubismMaskTexture 클래스의 인스턴스 생성
- 모델을 가져올 때 생성된 것을 사용
Cubism SDK for Unity와 함께 제공되는 GlobalMaskTexture를 복제
모델이 공유하는 마스크용 텍스쳐는 SDK를 가져온 프로젝트의 다음 위치에 있습니다.
/Assets/Live2D/Cubism/Rendering/Resources/Live2D/Cubism/GlobalMaskTexture
이것을 선택 상태로 하고 Ctrl+D를 누르는 등의 방법으로 복제해 주십시오.
CubismMaskTexture 클래스의 인스턴스 생성
Cubism SDK for Unity와 함께 제공되는 에디터 확장에는 CubismMaskTexture 클래스의 인스턴스를 만드는 것이 있습니다.
생성하려면 Unity Project 창을 오른쪽 클릭하거나 + 버튼에서 [Create] > [Live2D Cubism] > [Mask Texture]
를 클릭합니다.
모델을 가져올 때 생성된 것을 사용
Cubism 4 SDK for Unity R7 이상에서는 모델을 가져오면 .model3.json과 같은 위치에 전용 마스크용 텍스쳐가 생성됩니다.
생성된 마스크용 텍스쳐를 모델의 프리팹에 연결된 CubismMaskController의 Mask Texture에 설정
모델의 프리팹을 선택 상태로 만들고 Inspector 창의 Mask Texture로 마스크용 텍스쳐를 드래그 앤 드롭합니다.
마스크용 텍스쳐에 참조를 등록/삭제하는 타이밍 변경
이 방법은 화면에 표시되는 모델이 적고, 총 마스크 수가 사용 상한에 도달하지 않았지만 표시가 무너지는 경우에 실시합니다.
Cubism SDK for Unity에서는 장면에 모델의 프리팹이 생성될 때 마스크용 텍스쳐에 자신의 참조를 등록하고 마스크용 텍스쳐는 등록된 모델에서 얻은 정보로 마스크를 생성합니다.
이 마스크용 텍스쳐에 등록된 참조가 삭제되는 타이밍은 그 모델이 삭제되었을 때입니다.
따라서 모델을 숨기기만 한 상태에서는 마스크용 텍스쳐에 참조가 남아 있습니다.
이로 인해 화면에 표시되는 모델이 적어도 숨겨진 상태의 모델이 복수 존재하면 마스크의 사용 상한을 넘어 버려 표시가 무너질 수 있습니다.
이 방법에서는 모델이 참조를 마스크용 텍스쳐에 등록/삭제하는 타이밍을 표시 시/비표시 시로 변경합니다.
또한 텍스쳐 수를 늘리는 다른 방법과 비교할 때 가장 부하가 걸리지 않습니다.
단, 표시된 모델의 총 마스크 수가 사용 상한에 도달한 경우에는 대응할 수 없습니다.
이 경우 다른 방법을 시도하십시오.
마스크용 텍스쳐에 참조를 등록/삭제하려면 CubismMaskController의 이벤트 함수를 변경합니다.
- 참조를 등록하는 처리의 이벤트 함수 변경
- 참조를 삭제하는 처리의 이벤트 함수 변경
참조를 등록하는 처리의 이벤트 함수 변경
CubismMaskController
클래스의 Start()
를 OnEnable()
로 변경합니다.
private void OnEnable() { // Fail silently. if (MaskTexture == null) { return; } MaskTexture.AddSource(this); // Get cubism update controller. HasUpdateController = (GetComponent<CubismUpdateController>() ! = null); }
참조를 삭제하는 처리의 이벤트 함수 변경
CubismMaskController
클래스의 OnDestroy()
를 OnDisable()
로 변경합니다.
private void OnDisable() { if (MaskTexture == null) { return; } MaskTexture.RemoveSource(this); }
마스크용 텍스쳐 내부의 텍스쳐 수 늘리기
Cubism SDK for Unity R7 이상에서는 마스크용 텍스쳐가 내부에 유지하는 텍스쳐의 수를 임의로 늘릴 수 있습니다.
스펙이 허용하는 한 무제한으로 늘릴 수 있기 때문에, 1개의 모델이 사용 가능한 마스크 수의 상한을 넘은 경우에도 정상적으로 클리핑을 표시하는 것이 가능합니다.
또 이 방법은 위의 다른 두 방법과 병용하는 것도 가능합니다.
마스크용 텍스쳐가 유지하는 텍스쳐를 늘리려면 마스크용 텍스쳐를 선택하고 Inspector에서 RenderTextureCount의 값을 원하는 수로 설정합니다.
이 값에 0이 설정되어 있을 경우 종전과 같이 1개의 마스크용 텍스쳐가 내부에 유지됩니다.