本章要點(diǎn):
- 使用ImageTarget預(yù)制件,調(diào)用3D模型(unitychan)
- 解決與ImageTarget預(yù)制件相關(guān)的“脫卡”問題
1. 使用ImageTarget預(yù)制件
ImageTarget預(yù)制件的加入捺氢,實際上等于是給現(xiàn)有的App添加了新的功能焙糟,所以冕茅,我們將會在一個新的場景中來實現(xiàn)這個功能落午。
1.1. 新建場景
新建場景的具體方法析显,請參考上一章的內(nèi)容:在Unity中使用EasyAR開發(fā)可以和Unity醬合影的App(第四章)线脚。本章的要點(diǎn)是:
- 新建場景,命名為“02”
- 將場景“02”拖拽到Hierarchy面板中叫榕,Unload場景“00”和“01”
- 調(diào)整至Game視圖
1.2. 向場景中添加EasyAR的預(yù)制件
具體的添加方法浑侥,請參考第一章的內(nèi)容:在Unity中使用EasyAR開發(fā)可以和Unity醬合影的App(第一章)。本章的要點(diǎn)如下:
- 填寫License Key晰绎,直接使用場景“01”中的Key即可
- 刪除場景“02”中自帶的Main Camera
- 將ImageTarget預(yù)制件添加到場景中(本章的主角)
1.3. 替換ImageTarget預(yù)制件自帶的腳本
在Hierarchy面板中選擇ImageTarget預(yù)制件寓落,我們就可以在Inspector面板中看到,ImageTarget預(yù)制件自身攜帶了一個腳本:ImageTargetBehaviour(但是荞下,這段腳本沒有實際功能)伶选,這就是我們需要替換掉的腳本。用來替換的腳本是:EasyImageTargetBehaviour尖昏,這個腳本可以在自帶的HelloAR演示場景中找到仰税。為了方便起見,我在這里引用了EasyImageTargetBehaviour腳本的全部內(nèi)容:
using UnityEngine;
using UnityEngine.SceneManagement;
namespace EasyAR
{
public class EasyImageTargetBehaviour : ImageTargetBehaviour
{
protected override void Awake()
{
base.Awake();
TargetFound += OnTargetFound;
TargetLost += OnTargetLost;
TargetLoad += OnTargetLoad;
TargetUnload += OnTargetUnload;
}
protected override void Start()
{
base.Start();
HideObjects(transform);
}
void HideObjects(Transform trans)
{
for (int i = 0; i < trans.childCount; ++i)
HideObjects(trans.GetChild(i));
if (transform != trans)
gameObject.SetActive (false);
}
void ShowObjects(Transform trans)
{
for (int i = 0; i < trans.childCount; ++i)
ShowObjects(trans.GetChild(i));
if (transform != trans)
gameObject.SetActive(true);
}
void OnTargetFound(ImageTargetBaseBehaviour behaviour)
{
ShowObjects(transform);
Debug.Log("Found: " + Target.Id);
}
void OnTargetLost(ImageTargetBaseBehaviour behaviour)
{
HideObjects(transform);
Debug.Log("Lost: " + Target.Id);
}
void OnTargetLoad(ImageTargetBaseBehaviour behaviour, ImageTrackerBaseBehaviour tracker, bool status)
{
Debug.Log("Load target (" + status + "): " + Target.Id + " (" + Target.Name + ") " + " -> " + tracker);
}
void OnTargetUnload(ImageTargetBaseBehaviour behaviour, ImageTrackerBaseBehaviour tracker, bool status)
{
Debug.Log("Unload target (" + status + "): " + Target.Id + " (" + Target.Name + ") " + " -> " + tracker);
}
}
}
上述EasyImageTargetBehaviour腳本實現(xiàn)的功能是:初始化階段隱藏所有跟ImageTarget相關(guān)的模型抽诉,如果EasyAR識別到ImageTarget陨簇,則顯示相關(guān)的模型,如果EasyAR沒有識別到ImageTarget迹淌,則不顯示相關(guān)的模型:
1.4. 導(dǎo)入ImageTarget所使用的圖片
接下來我們需要向工程中導(dǎo)入一張圖片河绽,主要用途是作為ImageTarget的識別圖。我選擇的是下面這張圖片唉窃,大家也可以選取自己喜歡的圖片耙饰。但是,所選圖片要盡量擁有復(fù)雜的圖形和豐富的色彩纹份,否則苟跪,EasyAR的SDK可能無法識別:
然后廷痘,我們要在Assets文件夾下新建一個“StreamingAssets”文件夾,拼寫和字母的大小寫一定不能錯件已。
關(guān)于該文件夾的詳細(xì)說明笋额,可以參考Unity官方手冊:
https://docs.unity3d.com/Manual/StreamingAssets.html
或者“Unity圣典”(中文):http://www.ceeger.com/Manual/StreamingAssets.html
我們把圖片導(dǎo)入到兩個不同的路徑下,一個是之前的章節(jié)中也在使用的路徑:Assets -> UnityChanAR -> Textures拨齐;另一個是本章中新出現(xiàn)的路徑:Assets -> StreamingAssets:
1.5. 使用導(dǎo)入的圖片
接下來我們分別來看看這兩張圖片怎么使用。首先昨寞,我們會把存放在Textures文件夾下的圖片瞻惋,添加到一個新建的材質(zhì)(Material)上,稍后再將材質(zhì)添加到ImageTarget預(yù)制件上援岩。具體方法如下:
- 在Assets -> UnityChanAR文件夾中新建“Materials”文件夾
- 在該文件夾的空白處點(diǎn)擊右鍵歼狼,選擇Create -> Material
- 重命名材質(zhì),一般跟圖片的名稱一致即可
- 設(shè)置材質(zhì)的Shader享怀,選擇Mobile -> Diffuse
- 點(diǎn)擊Select羽峰,選取Texture文件夾中的圖片
接著,我們會使用存放在StreamingAssets文件夾中的圖片添瓷,而且還要用到上一步驟中做好的材質(zhì)(Material)梅屉。操作方法就是,先選中Hierarchy面板中的ImageTarget預(yù)制件鳞贷,然后參考下圖來設(shè)置它的Inspector面板:
完成以上兩步操作之后坯汤,我們切換到Scene視圖,應(yīng)該可以看到如下畫面:
在本小節(jié)中搀愧,希望大家注意:如何設(shè)置EasyImageTargetBehaviour中的Path和Storage惰聂,不同的“Storage”對應(yīng)了不同的存儲路徑,具體的解釋請參考EasyAR官方文檔中的說明:StorageType咱筛。
1.6. 添加模型——再次使用unitychan預(yù)制件
我們先找到unitychan預(yù)制件搓幌,然后拖拽到Hierarchy面板中,使其成為ImageTarget預(yù)制件的子對象迅箩。在EasyAR中溉愁,ImageTarget和3D模型被看作一個整體,當(dāng)ImageTarget被識別之后饲趋,這個整體(包括子對象)就會被“激活”叉钥。添加好模型之后,我們可以切換到Game視圖中查看模型的顯示情況篙贸,如圖:
在Game視圖下可以看到投队,UnityChan現(xiàn)在沒有面對我們,大家可以根據(jù)自己的想法設(shè)置UnityChan的位置和角度爵川。我希望UnityChan面對著自己敷鸦,所以對UnityChan的Transform組件進(jìn)行了如下調(diào)整:
1.7. 布置UGUI界面
布置UGUI界面,并且實現(xiàn)各個按鈕功能的具體方法,請參考:在Unity中使用EasyAR開發(fā)可以和Unity醬合影的App(第二章)扒披。注意:除了現(xiàn)在的場景外值依,我們還需要對場景“00”(主菜單)進(jìn)行修改。完成后的效果如下:
1.8. 使用新的Animator(UnityChanActionCheck)
這里的操作很簡單(如下圖)碟案,但是愿险,大家一定要自己體會:為什么可以這么簡單地就實現(xiàn)?Animator中的各個控制條件是怎樣的价说?為什么現(xiàn)有的腳本不用修改就可以使用辆亏?同時也可以參考:在Unity中使用EasyAR開發(fā)可以和Unity醬合影的App(第三章)。
如果順利地完成了前面8個小節(jié)的工作鳖目,那我們現(xiàn)在就可以單獨(dú)測試場景“02”了:
2. 實現(xiàn)“脫卡”功能
在單獨(dú)測試場景“02”的時候扮叨,我們會發(fā)現(xiàn)一個現(xiàn)象:一旦攝像頭捕捉不到ImageTarget的圖片時,UnityChan的模型也會隨之消失领迈,問題是彻磁,我們還沒有看到UnityChan所有的動作呢!
這個問題怎么破狸捅?其實答案就藏在第一章:在Unity中使用EasyAR開發(fā)可以和Unity醬合影的App(第一章)衷蜓。接下來,我們就從第一章的內(nèi)容開始延伸尘喝,從而解決這個問題恍箭,實現(xiàn)AR應(yīng)用中的“脫卡”。
首先瞧省,將ImageTarget下的unitychan預(yù)制件復(fù)制扯夭,然后粘體到Augmenter下,并重命名為“ unitychan-Augmenter”鞍匾。復(fù)制粘貼是最好的選擇交洗,因為我們需要unitychan-Augmenter和ImageTarget下的unitychan具有相同的各種屬性(從Animator到腳本):
然后,修改一下unitychan-Augmenter的Transform組件橡淑。修改的方針是:盡量讓兩個UnityChan的模型在Game視圖下重合在一起构拳。
做到這一步的時候,我們的思路應(yīng)該逐漸清晰了:“脫卡(顯示模型)”梁棠,其實就是一個控制“unitychan-Augmenter”什么時候顯示的問題置森。場景中的主角是ImageTarget下的unitychan模型,當(dāng)主角沒有出場的時候符糊,我們只要控制好替身——“unitychan-Augmenter”的出場時機(jī)就可以了凫海。
關(guān)于“脫卡”功能的介紹,大家也可參考下面兩篇大神的文章:
拜讀上述大神的文章之后男娄,我自己編了如下腳本行贪,比大神們的腳本短一些漾稀,剛好夠用,這里稍微解釋一下:
- ModelOfAugmenter變量建瘫,用來控制Augmenter下的模型崭捍,我們一會兒需要把unitychan-Augmenter賦給這個變量,相當(dāng)于替身
- ImageTarget變量啰脚,用來獲取場景中的ImageTarget預(yù)制件的狀態(tài)殷蛇,一會兒需要把場景中的ImageTarget賦給這個變量,相當(dāng)于一個時鐘
- HasFound變量橄浓,這是唯一的私有變量粒梦,我們不能在Unity編輯器內(nèi)設(shè)定,當(dāng)ImageTarget被識別過一次之后贮配,這個變量就會一直為True谍倦,相當(dāng)于一個時刻塞赂,在這個時刻泪勒,我們會讓替身出現(xiàn)
using UnityEngine;
using System.Collections;
public class NoImageTargetShow : MonoBehaviour {
public GameObject ModelOfAugmenter;
public GameObject ImageTarget;
private bool HasFound = false;
// Use this for initialization
void Start () {
ModelOfAugmenter.SetActive (false);
}
// Update is called once per frame
void Update () {
if (ImageTarget.activeSelf == true) {
HasFound = true;
ModelOfAugmenter.SetActive (false);
}
if (ImageTarget.activeSelf == false && HasFound == true) {
ModelOfAugmenter.SetActive (true);
}
}
}
完成以上代碼之后,我們需要在場景中加入一個GameObject來承載腳本宴猾。我把這個GameObject重命名為“NoImageTargetShow”圆存,以表示它執(zhí)行NoImageTargetShow腳本:
然后,設(shè)置NoImageTargetShow對象的Inspector面板:
- 將NoImageTargetShow腳本添加到該對象上
- 將場景中的unitychan-Augmenter和ImageTarget對象拖拽到的相應(yīng)的空白槽里仇哆,這樣就可以給腳本中的公有變量賦值了
10. 再次確認(rèn)UGUI中的按鈕
現(xiàn)在,我們已經(jīng)基本上實現(xiàn)了“脫卡”功能。如果現(xiàn)在試運(yùn)行程序的話且叁,你就會發(fā)現(xiàn):“脫卡”之后顯示的UnityChan不能變換動作了蜈出,左右兩邊的按鈕好像怎么點(diǎn)擊都沒有反應(yīng)。
所以延欠,再次確認(rèn)UGUI中的按鈕陌兑,這就是我們的最后一步。按鈕為什么沒有反應(yīng)由捎?去看看按鈕的設(shè)置就明白了:
11. 總結(jié)
本章是這個系列的最后一章兔综,中間涉及到了第一、二狞玛、三章的內(nèi)容软驰,可以看作一次復(fù)習(xí),同時也接觸到了:在AR應(yīng)用中如何使用ImageTarget心肪,以及怎樣實現(xiàn)“脫卡”锭亏。希望大家動手試一試,在實踐的過程中硬鞍,我們自然而然地就掌握這些技能了贰镣。
在下一個系列的教程中呜象,我們會接觸到Blender,并且真正地從零基礎(chǔ)開始學(xué)習(xí)(本來這個系列也想做成零基礎(chǔ)的碑隆,可能還是有點(diǎn)兒難度恭陡,抱歉啦各位)。同時上煤,由于我的Blender水平還不夠高休玩,無法做到深入淺出地講解,所以劫狠,下一系列的主體是翻譯拴疤,我自己會補(bǔ)充圖片或者說明,敬請期待独泞。
其他章節(jié):