csharp とあるアセットバンドル化したLive2Dモデルのローダー

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp とあるアセットバンドル化したLive2Dモデルのローダー相关的知识,希望对你有一定的参考价值。

/*
 * Copyright @2017 Shunsuke Ohba
 * 
 * Live2DLoader
 * 
 * #環境
 * 
 * - Unity 5.6.0f3
 * - Live2D 2.1.04 for Unity
 * 
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using live2d;
using System.IO;

/// <summary>
/// アセットバンドルにしたLive2Dモデルデータを取り出すクラス
/// </summary>
public class Live2DLoader
{
    /// <summary>
    /// Live2D Modelerから書き出したデータを以下の構成にして、
    /// ルートのフォルダ(idフォルダ)を拡張子を付けずにAB化した場合のローダー
    /// 
    /// ```
    /// id
    ///   - id.2048 (or id.1024)
    ///     - texture_00.png
    ///     - texture_01.png
    ///   - id.moc.bytes
    ///   - id.model.json
    /// ```
    /// </summary>
    /// <param name="id">Identifier.</param>
    /// <param name="callback">Callback.</param>
    public static IEnumerator Load (string id, System.Action<AssetBundle> callback)
    {
        #if UNITY_EDITOR
        var streamingAssetsABPath = Application.streamingAssetsPath + "/" + id;
        byte[] bytes = File.ReadAllBytes(streamingAssetsABPath);
        var req = AssetBundle.LoadFromMemoryAsync(bytes);
        #elif UNITY_ANDROID
        string path = "jar:file://" + Application.dataPath + "!/assets" + "/" + id;
        var req = new WWW(path);
        #endif

        yield return req;

        if(callback != null)
            callback(req.assetBundle);
    }

    public static void Parse (string id, AssetBundle ab, System.Action<Live2DModelUnity, Texture2D[]> callback)
    {
        // Live2D情報を保持しているJSONをロードする
        var json = ab.LoadAsset<TextAsset>(id + ".model.json");
        var info = JsonUtility.FromJson<Live2DABInfo>(json.text);
        // mocファイルをロード
        var mocFile = ab.LoadAsset<TextAsset>(id + ".moc.bytes");
        var live2DModel = Live2DModelUnity.loadModel(mocFile.bytes);

        var list = new List<Texture2D>();
        foreach (var texName in info.textures)
        {
            // "id.2048/texture_00.png" => "texture_00" へ変換
            var arr = texName.Split('/');
            var fileName = arr[arr.Length - 1];
            fileName = fileName.Substring(0, fileName.IndexOf("."));
            // Textureのロード
            list.Add(ab.LoadAsset<Texture2D>(fileName));
        }

        if(callback != null)
            callback(live2DModel, list.ToArray());
    }

    /// <summary>
    /// model.jsonデシリアライズ用
    /// </summary>
    class Live2DABInfo
    {
        public string[] textures;
    }
}


public class Live2DABLoadStreamingAssets : MonoBehaviour 
{
    // アセットバンドル名
    public string fileId;

    Live2DModelUnity live2DModel;
    Matrix4x4 live2DCanvasPos;
    MotionQueueManager motionMgr;
    Live2DMotion motion;

    IEnumerator Start () 
    {
        AssetBundle ab = null;
        yield return Live2DLoader.Load(fileId, x => ab = x);

        Live2D.init();

        Texture2D[] texs = null;
        Live2DLoader.Parse(fileId, ab, (x, y) => {
            live2DModel = x;
            texs = y;
        });

        for (int i = 0; i < texs.Length; i++)
        {
            live2DModel.setTexture(i, texs[i]);
        }

        // モーション
        var mot = ab.LoadAsset<TextAsset>(fileId + ".mtn.bytes");
        motionMgr = new MotionQueueManager();
        motion = Live2DMotion.loadMotion(mot.bytes);
        float modelWidth = live2DModel.getCanvasWidth();
        live2DCanvasPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50.0f, 50.0f);


        // testcode メッシュだけ残っちゃう
        //yield return new WaitForSeconds(4f);
        //ab.Unload(true);
    }

    void Update () 
    {
        if (live2DModel == null) return;
        live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);

        if (motionMgr.isFinished())
        {
            motionMgr.startMotion(motion);
        }

        motionMgr.updateParam(live2DModel);

        live2DModel.update();
    }

    void OnRenderObject()
    {
        if (live2DModel == null) return;
        live2DModel.draw();
    }

    void OnDestroy ()
    {
        Live2D.dispose();
    }
}

以上是关于csharp とあるアセットバンドル化したLive2Dモデルのローダー的主要内容,如果未能解决你的问题,请参考以下文章

csharp アセットバンドルビルドスクリプト

csharp 复数のアセットを取り出す

csharp (アセット动作确认用)キー力力ンン

sh 的WebPackのバンドルの内訳を调べる。

python アニメーションカーブの値を一律指定した数オフセットする

csharp CSHARPハッシュセット