乗算色・スクリーン色

最終更新: 2022年5月19日

乗算色・スクリーン色を利用して、モデルに色をブレンドして描画する方法を説明します。
ここで紹介する機能はSDK for Unity 4 R5 beta1以降の機能となります。

Cubism Editor 4.2以前に作成されたモデルなど、モデルに乗算色・スクリーン色が設定されていない場合も特に追加のコーディングを行うことなく利用可能です。
SDK for Unityでの詳しい仕様や利用方法についてはSDKマニュアルの 「乗算色・スクリーン色」をご覧ください。

事前準備として、「SDKのインポート」を参考に、モデルデータのインポートとプレハブの配置を行ってください。

初期状態では、モデルにあらかじめ設定された乗算色・スクリーン色を常に参照するように設定されており、モデルに乗算色・スクリーン色が設定されていない場合は以下の値が使用されます。

  • 乗算色では(1.0, 1.0, 1.0, 1.0)
  • スクリーン色では(0.0, 0.0, 0.0, 1.0)

インスペクタ上での利用

SDK側から乗算色・スクリーン色を操作出来るようにするには以下のフラグを有効にします。

乗算色:

OverwriteFlagForModelMultiplyColors、もしくは、OverwriteFlagForMultiplyColors

スクリーン色:

OverwriteFlagForModelScreenColors、もしくは、OverwriteFlagForScreenColors

OverwriteFlagForModelMultiplyColors 及び OverwriteFlagForModelScreenColors は全てのDrawableに対してSDK側から乗算色・スクリーン色の操作を可能とするかを決めるフラグです。
これらのフラグはUnityEditor上ではモデルのプレハブのルートオブジェクトにアタッチされている [CubismRenderController] のインスペクタ上からも操作することが可能です。

OverwriteFlagForMultiplyColors 及び OverwriteFlagForScreenColors は個々のDrawableがそれぞれSDK側から乗算色・スクリーン色の操作を可能とするかを決めるフラグです。
モデルの各Drawableオブジェクトにアタッチされている [CubismRenderer] のインスペクタ上からも操作することが可能です。

前述した [CubismRenderController] の持つ乗算色・スクリーン色のフラグが有効化されている場合は、それらが優先されます。

乗算色・スクリーン色の設定はスクリプト上からの制御はもちろんのこと、 [CubismRenderer] のインスペクタ上においても操作することが可能です。

スクリプト上での利用

アプリケーション上で利用する場合をはじめ、スクリプト上で制御する必要がある場合には次のようなコードが有効です。

下記のコードでは、全てのDrawableオブジェクトのスクリーン色を一定時間で一斉に変化させるような処理を施しています。

中身を以下のように書き換えたC#スクリプトを作成し、モデルのプレハブのルートオブジェクトへアタッチする形で利用することが出来ます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
using UnityEngine;
using Live2D.Cubism.Rendering;
public class BlendColorChange : MonoBehaviour
{
CubismRenderController RenderController { get; set; }
float[] _colorValues;
float _time;
void Start()
{
_colorValues = new float[3];
_time = 0.0f;
RenderController = GetComponent<CubismRenderController>();
RenderController.OverwriteFlagForModelScreenColors = true;
}
void Update()
{
if (_time < 1.0f)
{
_time += Time.deltaTime;
return;
}
for (int i = 0; i < _colorValues.Length; i++)
{
_colorValues[i] = Random.Range(0.0f, 1.0f);
}
var color = new Color(_colorValues[0], _colorValues[1], _colorValues[2], 1.0f);
for (var i = 0; i < RenderController.Renderers.Length; i++)
{
RenderController.Renderers[i].ScreenColor = color;
}
_time = 0.0f;
}
}
using UnityEngine; using Live2D.Cubism.Rendering; public class BlendColorChange : MonoBehaviour { CubismRenderController RenderController { get; set; } float[] _colorValues; float _time; void Start() { _colorValues = new float[3]; _time = 0.0f; RenderController = GetComponent<CubismRenderController>(); RenderController.OverwriteFlagForModelScreenColors = true; } void Update() { if (_time < 1.0f) { _time += Time.deltaTime; return; } for (int i = 0; i < _colorValues.Length; i++) { _colorValues[i] = Random.Range(0.0f, 1.0f); } var color = new Color(_colorValues[0], _colorValues[1], _colorValues[2], 1.0f); for (var i = 0; i < RenderController.Renderers.Length; i++) { RenderController.Renderers[i].ScreenColor = color; } _time = 0.0f; } }
using UnityEngine;
using Live2D.Cubism.Rendering;

public class BlendColorChange : MonoBehaviour
{
    CubismRenderController RenderController { get; set; }
    float[] _colorValues;
    float _time;

    void Start()
    {
        _colorValues = new float[3];
        _time = 0.0f;
        RenderController = GetComponent<CubismRenderController>();
        RenderController.OverwriteFlagForModelScreenColors = true;
    }

    void Update()
    {
        if (_time < 1.0f)
        {
            _time += Time.deltaTime;
            return;
        }

        for (int i = 0; i < _colorValues.Length; i++)
        {
           _colorValues[i] = Random.Range(0.0f, 1.0f);
        }
        
        var color = new Color(_colorValues[0], _colorValues[1], _colorValues[2], 1.0f);
    

        for (var i = 0; i < RenderController.Renderers.Length; i++)
        {
            RenderController.Renderers[i].ScreenColor = color;
        }

        _time = 0.0f;
    }
}

モデル側からの乗算色・スクリーン色の更新の通知を受け取る

モデルのパラメータに乗算色・スクリーン色の変更が結びつけられている場合、SDK側からの操作ではなく、モデルがアニメーションした際などにモデル側から乗算色・スクリーン色が変更される事があります。

この時に乗算色・スクリーン色が変更されたことを受け取る事が出来るプロパティ、 IsBlendColorDirty が [CubismDynamicDrawableData] に実装されています。

このプロパティは乗算色、もしくは、スクリーン色のいずれかがモデル側で変更された際にtrueとなり、乗算色とスクリーン色のどちらが変更されたかは判別しません。

詳細はSDKマニュアルの「乗算色・スクリーン色」をご覧ください。

この記事はお役に立ちましたか?
はいいいえ
この記事に関するご意見・
ご要望をお聞かせください。