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モデルのローダー的主要内容,如果未能解决你的问题,请参考以下文章