CubismUpdateController

업데이트: 2020/10/21

개요

CubismUpdateController를 Prefab에 연결하여 Cubism SDK for Unity의 각 컴포넌트의 실행 순서를 제어할 수 있습니다.

OW 방식에서는 각 컴포넌트의 실행 순서가 중요하므로 CubismUpdateController를 사용해 사양에 따르는 것이 필수가 됩니다.
실행 순서를 제어할 필요가 없는 등의 이유로 CubismUpdateController를 사용하지 않는 경우 컴포넌트의 실행 순서가 Unity 측에서 결정되므로 실행 순서에 따라서는 Expression 등과 같은 기능이 제대로 처리되지 않을 수 있습니다.

사용자가 직접 만든 컴포넌트의 실행 순서를 제어하려면 해당 컴포넌트에 ICubismUpdateable을 구현합니다.

ICubismUpdateable 구현

실행 순서의 제어 대상이 되는 컴포넌트로 ICubismUpdateable 인터페이스를 상속합니다.

CubismUpdateController가 연결되어 있지 않으면 OnLateUpdate 처리가 실행되지 않으므로 다음 스니펫에서는 해당 컴포넌트 단독으로도 동작하도록 했습니다.

public sealed class CubismRenderController : MonoBehaviour, ICubismUpdatable
{
    public bool HasUpdateController { get; set; }
  
    public bool NeedsUpdateOnEditing
    {
        get { return true; }
    }
  
    public int ExecutionOrder
    {
        // 이 컴포넌트의 실행 순서
        get { return CubismUpdateExecutionOrder.CubismRenderController; }
    }
  
    public void OnLateUpdate()
    {
        if(HasUpdateController)
        {
            // LateUpdate 처리 구현
        }
    }
  
  
    private void OnEnable()
    {
        // CubismUpdateController가 연결되어 있는가
        HasUpdateController = (GetComponent<CubismUpdateController>() ! = null);
    }
  
    private void LateUpdate()
    {
        if(!HasUpdateController)
        {
            // CubismUpdateController가 연결되지 않은 경우 자체 LateUpdate에서 처리를 수행한다.
            OnLateUpdate();
        }
    }
}
public sealed class CubismEyeBlinkController : MonoBehaviour, ICubismUpdatable
{
    public bool HasUpdateController { get; set; }
  
    public bool NeedsUpdateOnEditing
    {
        get { return false; }
    }
  
    public int ExecutionOrder
    {
        // 이 컴포넌트의 실행 순서를 돌려준다.
        get { return CubismUpdateExecutionOrder.CubismEyeBlinkController; }
    }
  
    public void OnLateUpdate()
    {
        // LateUpdate 처리 구현
    }
  
  
    private void OnEnable()
    {
        // CubismUpdateController가 연결되어 있는가
        HasUpdateController = (GetComponent<CubismUpdateController>() ! = null);
    }
  
    private void LateUpdate()
    {
        if(!HasUpdateController)
        {
            // CubismUpdateController가 연결되지 않은 경우 자체 LateUpdate에서 처리를 수행한다.
            OnLateUpdate();
        }
    }
}
  • HasUpdateController
    • Prefab에 CubismUpdateController가 연결되어 있는지 여부를 설정합니다.
  • NeedsUpdateOnEditing
    • Unity에서 장면이 실행되지 않는 동안에도 업데이트를 수행해야 하는지 여부를 반환합니다.
      CubismUpdateController는 에디터 모드에서도 실행되므로, 그 컴포넌트가 비실행 중에도 갱신할 필요가 없는 경우는 false를 돌려줍니다.
  • ExecutionOrder
    • 그 컴포넌트의 실행 순서를 돌려줍니다.
      이 값이 작은 컴포넌트일수록 먼저 호출됩니다.
      Cubism SDK for Unity의 각 컴포넌트의 실행 순서는 CubismUpdateExecutoinOrder에 정의되어 있습니다.
    •  유저가 실행 순서를 제어하는 컴포넌트를 추가했을 경우 CubismUpdateExecutoinOrder의 정의를 참고로 하여 여기서 반환하는 값으로 어느 타이밍에 호출되는지 주의해 주세요.
      • 예(독자적인 컴포넌트를 CubismLookController와 CubismPhysicsController 사이의 타이밍에 호출하려는 경우):
        • CubismLookController는 700, CubismPhysicsController는 800이 설정되므로 독자적인 컴포넌트는 750을 반환하도록 설정합니다.
  • OnLateUpdate()
    • CubismUpdateController에 의해 실행 순서가 제어되고 호출되는 함수입니다.
      그 컴포넌트가 실시하는 갱신 처리를 기술합니다.

실행 중에 컴포넌트를 추가 및 삭제할 때의 주의사항

CubismUpdateController가 실행 순서를 제어하는 컴포넌트는 OnEnable()의 타이밍에 실시합니다.
모든 컴포넌트가 미리 Prefab에 연결된 경우는 문제 없지만, 장면 실행 중 동적으로 컴포넌트를 추가 또는 삭제했을 경우 명시적으로 CubismUpdateController.Refresh()를 호출해 다시 읽어들여야 합니다.

gameObject.AddComponent<MyComponent1>();

var component = gameObject.GetComponent<MyComponent2>();
DestroyImmediate(component);

// CubismUpdateController로 제어하는 컴포넌트를 다시 읽기
var updateController = gameObject.GetComponent<CubismUpdateController>();
updateController.Refresh();
이 기사에 관한 의견 및 요청사항을 보내 주시기 바랍니다.