ランタイムでモデルを読み込む

最終更新: 2020年1月30日

ここでは、スクリプトからモデルを初期化し、表示する方法の説明を行います。

概要

2.1ではInit,loadModel,setTextureを用いてモデルの初期化・モデルのロード・テクスチャの設定を行っていました。
3.0以降のバージョンではLoadAtPath,ToModelを使えば、モデルの初期化・モデルのロード・テクスチャの設定に加え、更新・描画が行えるようになりました。
方法としては、はじめにパスからモデルを読み込むためのスクリプトを作ります。
そして、読み込んだモデルはToModel()を使い、モデルを表示させます。
今回はStreamingAssetsから読み込むようにスクリプトを記述しています。

詳細

2.1まではLive2D.Init()でLive2Dを初期化後、Live2DUnity.loadModelでモデルのロードを行っていました。

Live2D.Init();
var live2dModel = Live2DModelUnity.loadModel((T)Resources.Load(path) as T);

その後、以下のような形でテクスチャを設定し、ALive2DModel.update() や ALive2DModel.draw()  でモデルの更新、描画が行われていました。

live2dModel.setTexture(textureNumber, texture);

3.0以降のバージョンでは処理が一新され、CusbimModel3Json.LoadAtPathを用いモデルを読み込んだ後、.ToModel()を呼び出せばモデルが表示されます。
またPrefabを作成して表示を行い、スクリプト上から.update().draw()の更新描画を記述しなくても描画更新されるようになっています。

では実際に、Cubism 3 SDK for Unityを用いてモデルを初期化・表示したいと思います。

まず、モデルをパスから読み込むためのスクリプトを作成します。
新規C#スクリプトを作成し、名称を“InitModel.cs”とします。

InitModel.csを以下のように記述します。

using System;
using System.IO;
using Live2D.Cubism.Framework.Json;
using UnityEngine;

/// <summary>
/// Initialize model.
/// </summary>
public class InitModel : MonoBehaviour {

	void Start ()
	{

        //Load model.
        var path = Application.streamingAssetsPath + "/koharu.model3.json";
        var model3Json = CubismModel3Json.LoadAtPath(path, BuiltinLoadAssetAtPath);

        var model = model3Json.ToModel();
	}

    /// <summary>
    /// Load asset.
    /// </summary>
    /// <param name="assetType">Asset type.</param>
    /// <param name="absolutePath">Path to asset.</param>
    /// <returns>The asset on succes; <see langword="null"> otherwise.</returns>
    public static object BuiltinLoadAssetAtPath(Type assetType, string absolutePath)
    {
        if (assetType == typeof(byte[]))
        {
            return File.ReadAllBytes(absolutePath);
        }
        else if(assetType == typeof(string))
        {
            return File.ReadAllText(absolutePath);
        }
        else if (assetType == typeof(Texture2D))
        {
            var texture = new Texture2D(1,1);
            texture.LoadImage(File.ReadAllBytes(absolutePath));

            return texture;
        }

        throw new NotSupportedException();
    }
}

Hierarchyウィンドウ内を右クリック後、“Create Empty”をクリックし空のGameObjectを作成します。
その後、作ったGameObjectにInitModel.csをアタッチします。

次に読み込むためのモデルをAssetsフォルダに追加します。
今回はStreamingAssetsから読み込むようにしているので、Assetsフォルダを選択し、Projectウィンドウを右クリック後、新規フォルダを作成します。
新規フォルダの名称は“StreamingAssets”と変更します。
StreamingAssetsに関しては、Unity – マニュアル:ストリーミングアセットをご覧ください。

StreamingAssetsにモデルを画像のように追加します。

最後に、Unityのプレイボタンを押し、モデルが表示されれば完了です。
これでモデルの初期化・表示をスクリプト上から行えるようになりました。

また、ToModel()を用いた実例があります。
以下にリンクがありますので、ぜひあわせてご覧ください。

[Live2D GitHub]CubismModel3Json.cs
https://github.com/Live2D/CubismUnityComponents/blob/develop/Assets/Live2D/Cubism/Editor/Importers/CubismModel3JsonImporter.cs
ここでは、AssetImporterでインポートイベントをフックにToModelでモデルのGameObjectを生成しています。

[Live2D GitHub]CubismViewer.cs
https://github.com/Live2D/CubismViewer/blob/develop/Assets/Live2D/Cubism/Viewer/CubismViewer.cs
ここでは、絶対パスからモデルファイルを読み込んだ後、ToModelでモデルを生成しています。

Original Workflow方式について

[2019/01/31 追記]
.ToModel()で作成するPrefabをOriginal Workflow方式にする場合、CubismModel3Json.ToModel()の引数にtrueを渡します。

var model = model3Json.ToModel(true);
この記事に関するご意見・
ご要望をお聞かせください。