零基础利用Unity3D开发AR应用并远程下载3D模型

11 篇文章 1 订阅
1 篇文章 0 订阅

工具:Unity Version 2020.1.6f1c1 Personal、EasyAR 4.1

下载:https://unity.cn/releaseshttps://www.easyar.cn/view/download.html#download-nav2

注册:Unity注册个人开发者获取许可,EasyAR也是注册个人免费版。

打开Unity,新建一个Unity3D项目,双击下载的EasyAR插件并导入:

登录EasyAR开发中心,新建一个应用:

打开项目,把Key粘贴进去:

创建工程:我们这里运用了EasyAR这个插件,官网已经给出比较完善的案例,我们可以参考一下:https://www.easyar.cn/view/download.html#download-nav2

准备工作:

我们点击目录空白处右键新增一个C# Script,把代码都放到LoadAR.cs。

导出模型(预制件):

编写导出代码:

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;

public class AssetBundleBuilder 
{
    [MenuItem("Assets/Build AssetBundle")]
    static public void BuildAssetBundle()
    {
        Caching.ClearCache ();
        string path = Application.streamingAssetsPath + "/" + "AssetBundles" + "/" + "Machine";
        if (!Directory.Exists (path)) 
        {
            Directory.CreateDirectory(path);
        }
        BuildPipeline.BuildAssetBundles (path,0,EditorUserBuildSettings.activeBuildTarget);
        AssetDatabase.Refresh ();
    }
}

生成的文件在Assets\StreamingAssets\AssetBundles\Machine(这个名称根据你的来定)

如果服务器是IIS的,可以添加Web.config代码即可下载.a文件,否则会出现404错误:

    <system.webServer>
        <staticContent>
            <mimeMap fileExtension=".a" mimeType="application/octet-stream" />
        </staticContent>
    </system.webServer>

添加控件:

编写LoadAR.cs主代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.UI;
using UnityEngine.Networking;
using LitJson;
using System.Net;
using System.IO;
using System.Text;
using easyar;

public class LoadAR : MonoBehaviour
{
    //游戏的FPS,可在属性窗口中修改
    public int targetFrameRate = 300;

    //SessionID,这个根据具体业务逻辑使用,不是必须
    private string sessionId;

    //动态创建一个目标(识别物)
    private ImageTargetController imageTargetController;

    //动态创建模型
    private GameObject myModel;

    //当程序唤醒时
    void Awake()
    {
        //修改当前的FPS
        //Application.targetFrameRate = targetFrameRate;
        
        //获取远程服务器信息
        string url = "http://192.168.1.101/Default.aspx";
        string data = "ClientKey=e10adc3949ba59abbe56e057f20f883e";
        string result = HttpGet(url, data);

        //解析Json文件
        JsonData jdConfig = JsonMapper.ToObject(result);

        sessionId = (string)jdConfig["sessionId"];

        //获取GUID并且显示在屏幕左上角:
        Text showGUID = GameObject.Find("Canvas").transform.GetChild(0).gameObject.GetComponent<Text>();
        showGUID.text = "GUID: " + sessionId;

        //动态加载模型并加到ImageTarget下面
        //myModel = (GameObject)Instantiate(Resources.Load("Machine-Mask"));
        //myModel.transform.parent = GameObject.Find("ImageTarget").transform;

        //改变按钮文字
        Button submit = GameObject.Find("Canvas").transform.GetChild(2).gameObject.GetComponent<Button>();
        Text btnSubmitTxt = submit.transform.GetChild(0).gameObject.GetComponent<Text>();
        btnSubmitTxt.text = "换一个";
        //添加按钮事件
        submit.onClick.AddListener(ButtonClick);

        imageTargetController = CreateTargetNode("ImageTarget-ID");//动态创建识别物件
    }

    //应用开始执行
    void Start()
    {
        
    }

    //相当于Timer,每秒更新
    void Update()
    {
        ShowTime(DateTime.Now.ToString("HH:mm:ss"));
        //LoadModel();
    }
    
    //按钮事件
    void ButtonClick()
    {
        LoadModel();
    }

    //显示时间文本
    private void ShowTime(string text)
    {
        Text showTime = GameObject.Find("Canvas").transform.GetChild(1).gameObject.GetComponent<Text>();
        showTime.text = text;
    }

    private string loadUrl="";
    private string loadName="";
    //远程获取下载列表
    private void LoadModel()
    {
        string url = "http://192.168.1.101/GetModel.aspx";
        string data = "SessionID=" + sessionId;
        string result = HttpGet(url, data);

        try
        {
            JsonData jdModel = JsonMapper.ToObject(result);

            if(loadUrl!=(string)jdModel["url"])
            {
                loadUrl=(string)jdModel["url"];
                loadName=(string)jdModel["name"];
                StartCoroutine(LoadAssets(loadUrl,loadName));
            }
        }
        catch
        {

        }
    }

    //远程下载模型并加载到ImageTarget下
    IEnumerator LoadAssets(string url,string name)
    {
        if(url!=null && url!="")
        {
            UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
            yield return request.SendWebRequest();
            AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);

            GameObject go = ab.LoadAsset<GameObject>(name);

            Destroy(myModel);//销毁之前的模型

            //在GameObject节点下添加物体,以便在target被跟踪时显示。
            myModel = (GameObject)Instantiate(go);
            myModel.transform.parent = imageTargetController.gameObject.transform;
        }
    }

    //动态创建目标的组件属性
    private ImageTargetController CreateTargetNode(string targetName)
    {
        GameObject go = new GameObject(targetName);
        var targetController = go.AddComponent<ImageTargetController>();
        
        ImageTrackerFrameFilter imageTracker = FindObjectOfType<ImageTrackerFrameFilter>(); //获取跟踪事件
        imageTracker.enabled = true;
        targetController.Tracker = imageTracker;    
        targetController.SourceType = ImageTargetController.DataSource.ImageFile;
        targetController.ImageFileSource.PathType = PathType.StreamingAssets;
        targetController.ImageFileSource.Path = "idcard.jpg";   //识别图片
        targetController.ImageFileSource.Name = "ID Card";
        targetController.ImageFileSource.Scale = 10;

        return targetController;
    }

    //GET请求与获取结果
    public static string HttpGet(string Url, string postDataStr)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
        request.Method = "GET";
        request.ContentType = "text/html;charset=UTF-8";

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream myResponseStream = response.GetResponseStream();
        StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
        string retString = myStreamReader.ReadToEnd();
        myStreamReader.Close();
        myResponseStream.Close();

        return retString;
    }
}

配置安卓生成环境,生成APK文件:

生成APK在项目根目录下面:

传到安卓手机上安装运行AR应用:

点击换一个按钮,可以下载并显示另外一个模型:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值