工具:Unity Version 2020.1.6f1c1 Personal、EasyAR 4.1
下载:https://unity.cn/releases、https://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应用:
点击换一个按钮,可以下载并显示另外一个模型: