독자적인 구성 요소의 실행 순서를 제어

업데이트: 2020/01/22

여기에서는 사용자 독자의 구성 요소에 대해 다른 Cubism 구성 요소 간의 실행 순서를 제어하는 절차를 설명합니다.
다음은 [SDK 가져오기~모델 배치]를 수행한 프로젝트에 추가하는 것을 전제로 한 설명입니다.

개요

Cubism SDK for Unity의 Original Workflow 구성 요소 중 일부는 실행되는 순서에 제한이 있습니다.

Cubism SDK for Unity에서는 CubismUpdateController를 사용하여 제어할 수 있으며 위의 구성 요소는 이를 통해 실행 순서가 제어됩니다.
CubismUpdateController가 제어하는 구성 요소는 Cubism 모델의 Prefab 루트에 연결된 구성 요소입니다.

CubismUpdateController를 사용하면, 유저의 독자적인 컴퍼넌트도 마찬가지로 실행 순서를 제어하는 것이 가능합니다.

여기에서는 예로서 다음 구성 요소에 대해 실행 순서 제어를 설정하는 절차를 설명합니다.

public class CubismExampleController : MonoBehaviour
{
    private void Start()
    {
        // CubismExampleController 초기화 처리
    }
    
    private void LateUpdate()
    {
        // CubismExampleController 업데이트 처리
    }
}

1. Prefab에 구성 요소를 연결

Hierarchy에 배치된 Prefab 루트의 GameObject에 CubismExampleController를 연결합니다.
또한 Prefab을 OW 형식으로 가져오지 않은 경우 CubismUpdateController도 연결합니다.

2. 컴포넌트에 ICubismUpdatable 구현

실행 순서를 제어하는 구성 요소에 ICubismUpdatable 인터페이스를 구현합니다.

CubismUpdateController는 실행 시에 ICubismUpdatable을 구현한 구성 요소를 취득하고 그 실행 순서를 제어합니다.

public class CubismExampleController : MonoBehaviour, ICubismUpdatable
{
    // Scene이 실행되지 않는 동안 실행 순서를 제어할지 여부
    public bool NeedsUpdateOnEditing
    {
        get { return false; }
    }
    
    // 이 컴포넌트의 실행 순서
    public int ExecutionOrder
    {
        get { return 0; }
    }
    
    // 실행 순서가 제어되는 업데이트 함수
    public void OnLateUpdate()
    {
    }
    
    // 실행 순서가 제어되고 있는지 여부
    public bool HasUpdateController { get; set; }
    
    
    private void Start()
    {
        // CubismExampleController 초기화 처리
    }
    
    private void LateUpdate()
    {
        // CubismExampleController 업데이트 처리
    }
}

여기서 구현한 ICubismUpdatable 인터페이스는 다음과 같이 되어 있습니다.

namespace Live2D.Cubism.Framework
{
    /// <summary>
    /// Cubism update interface.
    /// </summary>
    public interface ICubismUpdatable
    {
        int ExecutionOrder { get; }
        bool NeedsUpdateOnEditing { get; }
        bool HasUpdateController { get; set; }
        void OnLateUpdate();
    }
}

ExecutionOrder는 이 구성 요소의 실행 순서를 결정하는 값입니다.
이 값이 작을수록 다른 구성 요소보다 먼저 호출됩니다.
SDK와 함께 제공되는 구성 요소에 설정되는 값은 CubismUpdateExecutionOrder에 기술되어 있습니다.

HasUpdateController는 ICubismUpdatable을 구현한 구성 요소가 CubismUpdateController에 연결되지 않은 경우 Unity의 이벤트 함수로 호출하도록 하기 위한 플래그입니다.

    public static class CubismUpdateExecutionOrder
    {
        public static readonly int CubismFadeController = 100;
        public static readonly int CubismPoseController = 200;
        public static readonly int CubismExpressionController = 300;
        public static readonly int CubismEyeBlinkController = 400;
        public static readonly int CubismMouthController = 500;
        public static readonly int CubismHarmonicMotionController = 600;
        public static readonly int CubismLookController = 700;
        public static readonly int CubismPhysicsController = 800;
        public static readonly int CubismRenderController = 10000;
        public static readonly int CubismMaskController = 10100;

3. 컴포넌트를 CubismUpdateController에 대응시킨다

CubismExampleController를 다음과 같이 수정합니다.

public class CubismExampleController : MonoBehaviour, ICubismUpdatable
{
    // Scene이 실행되지 않는 동안 실행 순서를 제어할지 여부
    public bool NeedsUpdateOnEditing
    {
        get { return false; }
    }
    
    // 이 컴포넌트의 실행 순서
    public int ExecutionOrder
    {
        get { return 150; }
    }
    
    // 실행 순서가 제어되는 업데이트 함수
    public void OnLateUpdate()
    {
        // CubismExampleController 업데이트 처리
    }
    
    // 실행 순서가 제어되고 있는지 여부
    public bool HasUpdateController { get; set; }
    
    
    private void Start()
    {
        // CubismExampleController 초기화 처리
        
        // 모델의 Prefab에 CubismUpdateController가 연결되어 있는지 확인
        HasUpdateController = (GetComponent<CubismUpdateController>() ! = null);
    }
    
    private void LateUpdate()
    {
        // CubismUpdateController가 연결되지 않은 경우 CubismExampleController 자체의 이벤트 함수로 업데이트 처리
        if (!HasUpdateController)
        {
            OnLateUpdate();
        }
    }
}

LateUpdate()에서 수행한 업데이트 프로세스를 CubismUpdateController가 호출하는 OnLateUpdate()로 이동합니다.

이상으로 실행 순서를 제어하는 설정은 완료됩니다.
이 스크립트를 Cubism 모델의 Prefab에 연결하여 장면을 실행하면 이 스크립트의 업데이트 프로세스가 CubismUpdateController에 의해 호출됩니다.

이 기사가 도움이 되었나요?
아니요
이 기사에 관한 의견 및 요청사항을 보내 주시기 바랍니다.