自定义材料

最終更新: 2017年9月19日

by Traitam

全体概述

将说明如何在Unity上使用Cubism模型。
之后,使用模型载入功能在实际示例中自定义材料。

直到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的材料。

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。