Unity × EasyAR 實戰(zhàn)教程-第5章:使用ImageTarget和“脫卡”

本章要點(diǎn):

  1. 使用ImageTarget預(yù)制件,調(diào)用3D模型(unitychan)
  2. 解決與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)是:

  1. 新建場景,命名為“02”
  2. 將場景“02”拖拽到Hierarchy面板中叫榕,Unload場景“00”和“01”
  3. 調(diào)整至Game視圖
新建一個場景“02”并打開

1.2. 向場景中添加EasyAR的預(yù)制件

具體的添加方法浑侥,請參考第一章的內(nèi)容:在Unity中使用EasyAR開發(fā)可以和Unity醬合影的App(第一章)。本章的要點(diǎn)如下:

  1. 填寫License Key晰绎,直接使用場景“01”中的Key即可
  2. 刪除場景“02”中自帶的Main Camera
  3. 將ImageTarget預(yù)制件添加到場景中(本章的主角)
向場景中添加EasyAR的預(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)的模型:

替換ImageTarget預(yù)制件自帶的腳本

1.4. 導(dǎo)入ImageTarget所使用的圖片

接下來我們需要向工程中導(dǎo)入一張圖片河绽,主要用途是作為ImageTarget的識別圖。我選擇的是下面這張圖片唉窃,大家也可以選取自己喜歡的圖片耙饰。但是,所選圖片要盡量擁有復(fù)雜的圖形和豐富的色彩纹份,否則苟跪,EasyAR的SDK可能無法識別

ImageTarget-UnityChan.jpg

然后廷痘,我們要在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

導(dǎo)入至常規(guī)的Textures文件夾
導(dǎo)入至新建的StreamingAssets文件夾

1.5. 使用導(dǎo)入的圖片

接下來我們分別來看看這兩張圖片怎么使用。首先昨寞,我們會把存放在Textures文件夾下的圖片瞻惋,添加到一個新建的材質(zhì)(Material)上,稍后再將材質(zhì)添加到ImageTarget預(yù)制件上援岩。具體方法如下:

  1. 在Assets -> UnityChanAR文件夾中新建“Materials”文件夾
  2. 在該文件夾的空白處點(diǎn)擊右鍵歼狼,選擇Create -> Material
  3. 重命名材質(zhì),一般跟圖片的名稱一致即可
  4. 設(shè)置材質(zhì)的Shader享怀,選擇Mobile -> Diffuse
  5. 點(diǎn)擊Select羽峰,選取Texture文件夾中的圖片
創(chuàng)建新的材質(zhì)

接著,我們會使用存放在StreamingAssets文件夾中的圖片添瓷,而且還要用到上一步驟中做好的材質(zhì)(Material)梅屉。操作方法就是,先選中Hierarchy面板中的ImageTarget預(yù)制件鳞贷,然后參考下圖來設(shè)置它的Inspector面板:

使用StreamingAssets文件夾里的圖片

完成以上兩步操作之后坯汤,我們切換到Scene視圖,應(yīng)該可以看到如下畫面:

場景中顯示了ImageTarget

在本小節(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視圖中查看模型的顯示情況篙贸,如圖:

添加unitychan預(yù)制件

在Game視圖下可以看到投队,UnityChan現(xiàn)在沒有面對我們,大家可以根據(jù)自己的想法設(shè)置UnityChan的位置和角度爵川。我希望UnityChan面對著自己敷鸦,所以對UnityChan的Transform組件進(jìn)行了如下調(diào)整:

UnityChan的Transform組件

1.7. 布置UGUI界面

布置UGUI界面,并且實現(xiàn)各個按鈕功能的具體方法,請參考:在Unity中使用EasyAR開發(fā)可以和Unity醬合影的App(第二章)扒披。注意:除了現(xiàn)在的場景外值依,我們還需要對場景“00”(主菜單)進(jìn)行修改。完成后的效果如下:

場景“02”的UGUI
場景“00”的UGUI

1.8. 使用新的Animator(UnityChanActionCheck)

這里的操作很簡單(如下圖)碟案,但是愿险,大家一定要自己體會:為什么可以這么簡單地就實現(xiàn)?Animator中的各個控制條件是怎樣的价说?為什么現(xiàn)有的腳本不用修改就可以使用辆亏?同時也可以參考:在Unity中使用EasyAR開發(fā)可以和Unity醬合影的App(第三章)

設(shè)置Animator組件中的Controller

如果順利地完成了前面8個小節(jié)的工作鳖目,那我們現(xiàn)在就可以單獨(dú)測試場景“02”了:

單獨(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

然后,修改一下unitychan-Augmenter的Transform組件橡淑。修改的方針是:盡量讓兩個UnityChan的模型在Game視圖下重合在一起构拳。

unitychan-Augmenter的Transform組件
在Game視圖下的兩個UnityChan的模型

做到這一步的時候,我們的思路應(yīng)該逐漸清晰了:“脫卡(顯示模型)”梁棠,其實就是一個控制“unitychan-Augmenter”什么時候顯示的問題置森。場景中的主角是ImageTarget下的unitychan模型,當(dāng)主角沒有出場的時候符糊,我們只要控制好替身——“unitychan-Augmenter”的出場時機(jī)就可以了凫海。

關(guān)于“脫卡”功能的介紹,大家也可參考下面兩篇大神的文章:

  1. EasyAR脫卡方法
  2. AR從入門到精通開發(fā)系列教程(4)---脫卡功能總結(jié)

拜讀上述大神的文章之后男娄,我自己編了如下腳本行贪,比大神們的腳本短一些漾稀,剛好夠用,這里稍微解釋一下:

  1. ModelOfAugmenter變量建瘫,用來控制Augmenter下的模型崭捍,我們一會兒需要把unitychan-Augmenter賦給這個變量,相當(dāng)于替身
  2. ImageTarget變量啰脚,用來獲取場景中的ImageTarget預(yù)制件的狀態(tài)殷蛇,一會兒需要把場景中的ImageTarget賦給這個變量,相當(dāng)于一個時鐘
  3. 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腳本:

在場景中加入GameObject

然后,設(shè)置NoImageTargetShow對象的Inspector面板:

  1. 將NoImageTargetShow腳本添加到該對象上
  2. 將場景中的unitychan-Augmenter和ImageTarget對象拖拽到的相應(yīng)的空白槽里仇哆,這樣就可以給腳本中的公有變量賦值了
NoImageTargetShow對象的Inspector面板

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è)置就明白了:

需要追加unitychan-Augmenter
按鈕調(diào)用的游戲?qū)ο蟊仨毭鞔_

11. 總結(jié)

本章是這個系列的最后一章兔综,中間涉及到了第一、二狞玛、三章的內(nèi)容软驰,可以看作一次復(fù)習(xí),同時也接觸到了:在AR應(yīng)用中如何使用ImageTarget心肪,以及怎樣實現(xiàn)“脫卡”锭亏。希望大家動手試一試,在實踐的過程中硬鞍,我們自然而然地就掌握這些技能了贰镣。

在下一個系列的教程中呜象,我們會接觸到Blender,并且真正地從零基礎(chǔ)開始學(xué)習(xí)(本來這個系列也想做成零基礎(chǔ)的碑隆,可能還是有點(diǎn)兒難度恭陡,抱歉啦各位)。同時上煤,由于我的Blender水平還不夠高休玩,無法做到深入淺出地講解,所以劫狠,下一系列的主體是翻譯拴疤,我自己會補(bǔ)充圖片或者說明,敬請期待独泞。

其他章節(jié):

  1. Unity × EasyAR 實戰(zhàn)教程-第1章:前言和準(zhǔn)備
  2. Unity × EasyAR 實戰(zhàn)教程-第2章:UGUI入門
  3. Unity × EasyAR 實戰(zhàn)教程-第3章:LeanTouch入門
  4. Unity × EasyAR 實戰(zhàn)教程-第4章:導(dǎo)出并安裝
  5. Unity × EasyAR 實戰(zhàn)教程-第5章:使用ImageTarget和“脫卡”
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呐矾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子懦砂,更是在濱河造成了極大的恐慌蜒犯,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荞膘,死亡現(xiàn)場離奇詭異罚随,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)羽资,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門淘菩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屠升,你說我怎么就攤上這事潮改。” “怎么了腹暖?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵汇在,是天一觀的道長。 經(jīng)常有香客問我微服,道長趾疚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任以蕴,我火速辦了婚禮糙麦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丛肮。我一直安慰自己赡磅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布宝与。 她就那樣靜靜地躺著焚廊,像睡著了一般冶匹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咆瘟,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天嚼隘,我揣著相機(jī)與錄音,去河邊找鬼袒餐。 笑死飞蛹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灸眼。 我是一名探鬼主播卧檐,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焰宣!你這毒婦竟也來了霉囚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匕积,失蹤者是張志新(化名)和其女友劉穎盈罐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闸天,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暖呕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年斜做,在試婚紗的時候發(fā)現(xiàn)自己被綠了苞氮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓤逼,死狀恐怖笼吟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霸旗,我是刑警寧澤贷帮,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站诱告,受9級特大地震影響撵枢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜精居,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一锄禽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧靴姿,春花似錦沃但、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垂攘。三九已至,卻和暖如春淤刃,著一層夾襖步出監(jiān)牢的瞬間晒他,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工逸贾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仪芒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓耕陷,卻偏偏與公主長得像掂名,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哟沫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容