概述
这周的工作是“文本生成模型”任务的后半部分,在Unity端调用之前写的后端接口,并动态加载展示,最后模型出现在场景中。
请求生成模型
在这一步,Unity端请求生成模型,并获取模型的url
IEnumerator getModel(string prompt)
{
WWWForm form = new WWWForm();
form.AddField("prompt", prompt);
using (UnityWebRequest www = UnityWebRequest.Post(url, form))
{
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
string url = www.downloadHandler.text;
StartCoroutine(LoadModel(url));
}
}
}
从服务器下载模型
在选择模型的保存路径时,选择Application.persistentDataPath
作为存储路径,这个目录:
- 可读可写
- 在Windows端和Android端都有效
- 而且是移动端唯一一个可读写操作的文件夹
IEnumerator LoadModel(string url)
{
string progress;
WWW w = new WWW(url);
while (!w.isDone)
{
progress = (((int)(w.progress * 100)) % 100) + "%";
loadText.text = "下载模型中" + progress;
yield return null;
}
yield return w;
if (w.isDone)
{
loadText.text = "保存模型中";
byte[] model = w.bytes;
int length = model.Length;
//文件流信息
Stream sw;
DirectoryInfo t = new DirectoryInfo(Application.persistentDataPath + "/model/" + name);
if (!t.Exists)
{
//如果此文件夹不存在则创建
t.Create();
}
var timeStamp = DateTime.UtcNow.Ticks;
var path = Application.persistentDataPath + "/model/" + name + "/" + timeStamp + ".fbx";
FileInfo j = new FileInfo(path);
if (!j.Exists)
{
//如果此文件不存在则创建
sw = j.Create();
}
else
{
//如果此文件存在则打开
sw = j.OpenWrite();
}
sw.Write(model, 0, length);
//关闭流
sw.Close();
//销毁流
sw.Dispose();
// 加载
Load2Scene();
}
}
加载到场景中
使用TriLib
包进行模型的实时加载,AssetLoader
和AssetLoaderOptions
都是该包内的类。
// 加载
void Load2Scene(){
loadText.text = "模型加载";
var assetLoader = new AssetLoader();
var assetLoaderOptions = AssetLoaderOptions.CreateInstance();
var wrapperGameObject = gameObject;
var myGameObject = assetLoader.LoadFromFile(path, assetLoaderOptions, wrapperGameObject);
}