マテリアルをカスタマイズする
最終更新: 2017年9月19日
by Traitam
全体の概要
CubismモデルをUnity上で使用する方法を説明します。
また、モデルインポートの機能を活用し実例上でマテリアルのカスタマイズを行います。
CubismモデルがUnity上で使用できるまで
CubismモデルがどのようにしてUnity Editor上で表示されているか説明します。
概要
Unity Editor上では、通常Live2D/Cubism/Materials/Unlit*.matというマテリアルを用い、表示を行います。
モデルにマテリアルが適用されるタイミングは、モデルインポート時です。
詳細
Unity上でCubismモデルを表示するとき、通常はLive2D/Cubism/Materials/Unlit*.matのマテリアルを用います。
これによりCubism Editor上の表示に近い表示になります。
Cubismモデルにマテリアルが適用されるタイミングは、モデルをUnity Editor上にインポートしたタイミングです。
そのため、Unity Editorへモデルをドラッグ&ドロップしたタイミングで表示に必要なマテリアルが適用されます。
CubismモデルがUnityへインポートされたとき、CubismImporter.cs内のOnPickMaterialが呼ばれます。
ここではデリゲートを用いCubismBuiltinPickers.MaterialPickerが使われます。
このメソッド内でCubismモデルの各Drawableにマテリアルが適用されます。
そしてその後、プレハブ化されUnityEditor上で自由に扱うことができるようになります。
もし、スクリプトからマテリアルをカスタマイズしたい場合、OnPickMaterialはデリゲートのため、メソッドを別途作成し、そのメソッドをOnPickMaterialに適用すればマテリアルをカスタマイズすることができます。
次に、その実例としてスクリプトから指定Drawableのマテリアルをカスタマイズして、表示するようにします。
実例:指定Drawableのマテリアルをカスタマイズ
スクリプトからモデルインポートのタイミングで、指定したDrawableのマテリアルを変更します。
概要
指定したいマテリアルを作り、指定Drawableの名前を参照します。
指定Drawableの場合、指定したマテリアルを使用し、それ以外はカスタマイズせず、通常のマテリアルを用います。
上記の処理を行うメソッドを書き、OnPickMaterialに代入します。
詳細
Unity Editor上で指定するDrawable名は、Cubism Editorで確認できるアートメッシュのIDを指定します。


Unity EditorのDrawable名は、Cubism Editorで確認できるアートメッシュのIDと関連付けられているため、Unity Editor上で変更することができません。
そのため、Drawable名を変更するにはCubism Editor上でID名を変更する必要があります。
今回は髪全体の色を変更するので、髪のDrawableを使用します。
髪のDrawableにマテリアルを適用するとき、カスタマイズしたマテリアルを適用します。
次に、Unity Editor上でMaterialフォルダを作成し、新規マテリアルを作成します。
このマテリアル名をCustomMaterialとします。このマテリアルのシェーダーをSprites/Defaultに変更します。
ここでは、Tintの色を赤色に変更します。

最後に、Editorフォルダを作成し、そのフォルダ内に新規C#スクリプトを作成します。
ここではMaterialCustomizerという名前にします。
スクリプト内で、指定したDrawableを参照して、もし同名のDrawableの場合は先ほど作ったマテリアルを適用します。
それ以外のDrawableには通常のマテリアル(Live2D/Cubism/Materials/Unlit*.mat)を使用します。
その機能を入れたものが、以下のコードです。
using UnityEditor;
using UnityEngine;
using Live2D.Cubism.Core;
using Live2D.Cubism.Framework.Json;
using Live2D.Cubism.Editor.Importers;
using System.Linq;
namespace TraitamTutorials
{
/// <summary>
/// Customizes materials of Cubism models from code.
/// </summary>
public static class MaterialCustomizer
{
/// <summary>
/// IDs of drawables to customize.
/// </summary>
private static string[] _drawablesToCustomize = { "D_PSD_01" ,"D_PSD_02" ,"D_PSD_03" ,"D_PSD_04" ,"D_PSD_05" ,"D_PSD_68" ,"D_PSD_69" ,"D_PSD_70" ,"D_PSD_71"};
/// <summary>
/// Custom material to assign.
/// </summary>
private static Material _customMaterial;
/// <summary>
/// Make custom material available.
/// And select <see cref="Material"/> as custom material or model default material.
/// </summary>
[InitializeOnLoadMethod]
private static void RegisterMaterialInitialize()
{
_customMaterial = AssetDatabase.LoadAssetAtPath<Material>("Assets/TraitamTutorials/Materials/CustomMaterial.mat");
CubismImporter.OnPickMaterial = CustomizeMaterial;
}
/// <summary>
/// When <see cref="CubismDrawable.name"/> and <see cref="_drawablesToCustomize"/> the same, use custom material.
/// Otherwise, use model default material.
/// </summary>
/// <param name="sender">Event source.</param>
/// <param name="drawable">Drawable to pick for.</param>
/// <returns><see cref="Material"/> for using the model.</returns>
private static Material CustomizeMaterial(CubismModel3Json sender, CubismDrawable drawable)
{
//use custom material.
if (_drawablesToCustomize.Any(n => n == drawable.Id))
{
return _customMaterial;
}
//use default material.
return CubismBuiltinPickers.MaterialPicker(sender, drawable);
}
}
}
これでモデルインポート時に、指定Drawableのマテリアルをカスタマイズすることができるようになりました。
