【山东大学软件学院创新项目实训】时空漫游 Unity通过文本请求模型并加入场景

概述

这周的工作是“文本生成模型”任务的后半部分,在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包进行模型的实时加载,AssetLoaderAssetLoaderOptions都是该包内的类。

// 加载
void Load2Scene(){
    loadText.text = "模型加载";
    var assetLoader = new AssetLoader();
    var assetLoaderOptions = AssetLoaderOptions.CreateInstance();
    var wrapperGameObject = gameObject;
    var myGameObject = assetLoader.LoadFromFile(path, assetLoaderOptions, wrapperGameObject);
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值