網頁

2018年5月31日 星期四

使用HoloToolkit 加入cursor

當我們在舞台上放上物件後,以視線選取物件時,
會需要有個cursor可以黏在物件上,代表視線是否在物體上。

這時候必須使用Cursor這個prefab
請至 HoloToolkit → Input → prefabs → Cursor 取用



把他拖曳到舞台上。

其實拖曳上來就可以使用,但為了培養好習慣,
最好還是整理一下舞台上的東西,把跟I/O有關的東西,一併整理到Managers裡。



有cursor可以使用之後,視線移動到哪裡,cursor就會出現在那裏。
使用上算是相當輕鬆容易的喔!

使用 HoloToolkit 的 button prefabs

HoloToolkit裏頭有一些按鈕UI可以使用,我覺得以下這兩個挺不錯的,就拿來試試。

HoloToolkit-Example → UX → prefabs → ButtonHolographic (這是一個prefab)
HoloToolkit-Example → UX → prefabs → ButtonPush (這是一個prefab)

特別是 ButtonHolographic,很容易修改圖示與文字,以下就特別介紹他的使用方式。

這個按鈕可以修改圖示




按鈕也可以修改文字


使用上算是輕鬆容易的。

但今天使用上遇到一件有點難懂的問題,琢磨了好久才想通處理掉。
問題是這樣的:照理說,紫色的cursor碰到按鈕時會變亮,代表按鈕受到關注。




但不知道為什麼,cursor滑過按鈕,卻無法讓按鈕變亮起來。




猜測應該是按鈕跟舞台在景深方向上重疊,所以cursor無法區分舞台與按鈕。




果不其然,把舞台以及按鈕之間的景深距離拉遠,cursor滑過按鈕,按鈕就可以變亮。




以上作個紀錄!

----------------------------------------------------
後記:
後來,比較熟悉Unity的架構之後,才知道原來是碰撞體(Collider)造成。
視線方向與碰撞體在空間中有交集後,游標(cursor)才能hug在碰撞體上面,並加以顯示出來。

碰撞體是附屬在遊戲物件的component,通常是透明的,
必須點擊後才能修改大小、形狀、位置。
Unity提供的碰撞體很多,有2D,也有3D,形狀上好像還有膠囊狀、矩形狀之類的。

這個場景中的遊戲物件有點多,包含:人物、舞台、按鈕。
人物,有人物的碰撞體;舞台,有舞台的碰撞體;按鈕有按鈕的碰撞體。
這裡所碰到到情況是,這多個遊戲物件彼此間的碰撞體太大,導致互相重疊。

把舞台等物與按鈕的距離拉遠,以致可以判斷視線與碰撞體的交集。
自然,游標就可以顯示出來了。

這個原理,也就是關於視線方向、碰撞、與顯示cursor之間的關係,
後來在寫手機的程式時,英文論壇上有人仔細討論一番,便知道原因了。

2018年5月26日 星期六

[Unity] 播放聲音

Unity介面

1. 替某個GameObject新增一個component Audio Source
    


2. 把聲音指定進AudioClip
    取消 Play On Awake (因為我希望操控播放的時間點)
    假如點選 Play On Awake ,那麼一啟動程式時他就會播放了。
       



C# 語法
3. 在事件驅動的段落裡,撰寫程式碼,說明什麼時候要播放聲音。

   AudioSource audio = GetComponent<AudioSource>();
   audio.Play();
 
 

參考資源 [連結]

2018年5月25日 星期五

[Unity] 在不同的script之間傳遞全域變數

這個問題解起來,說來簡單,但對於不熟悉Unity架構的人,
仍然需要花點時間思考遊戲物件、script、變數之間的關係,
才能存取到你要的變數。

目標
我需要對一個全域變數myClickNumber,
讓不同遊戲物件裏頭的script可以隨意對他做運算與存取。

步驟
1. 首先,在Unity中,script無法獨立存在,script是component,必須依賴在GameObject底下。







2. 在script裡面,變數宣告時以public宣告,該變數就會成為全域變數。



3. 另一個script執行時,要如何使用bt_right.cs的myClickNumber變數呢?
    由於script無法獨立存在,所以先把另一個script (bt_left) 新增給另一個GameObejct (buttonLeft)






4. 因為等等另一個script (bt_left) 要取用buttonRight這個GameObject裏頭的script,
    所以設定一個全域GameObject myA去接buttonRight。



























5. 在bt_left.cs 的script裏頭,撰寫程式碼
   
     myA.GetComponent<bt_right>().myClickNumber
    這段程式碼就可以對myClickNumber做存取運算




6. 執行程式時,可以一邊看myClickNumber有沒有隨之變化。



附註:
1. GameObject與component之間的關係屬階層關係,
    GameObject可以有好幾個component,
    script是一類的component,
    所以GameObject可以有好幾個script。

2. 這段說明是關鍵,多讀幾次就可以懂了。

    [A程式碼"code_a.cs"]
    public bool a;

    [B程式碼"code_b.cs"]
    public GameObject A;     //連結A物件
    ...
    A.GetComponent<code_a>().a = true;
 


參考資源 [連結]

[Unity] 匯入.fbx檔案後如何貼上材質?


在Material裏頭設定



您也可以參考這兩個連結的說明!
匯入材質的說明1 [連結]
匯入材質的說明2 [連結]

參考資料
Unity manual 線上文件 [連結]

[HoloLens] 偵測 airtap手勢

在HoloLens的使用上,airtap手勢等同於滑鼠的click事件,其重要性不在話下。
我參考這篇文章 [連結],成功抓到airtap的事件驅動方式,而且非常容易。

1. 首先,假設您的Unity已經灌好HoloTookKit,那麼可以試著去找InputTapTest這個scene
    他的位置可能在 HoloToolkit\Input\Test\Scenes\InputTapTest
    此Scene裏頭有個cube,你可以airtap那個cube,那個cube會變大。

2. 接著,可以到 HoloToolkit-Example/Input/Script/ 找TapResponder.cs
    把這個script檔案指給舞台上的物件,測試時直接對該物件airtap,該物件會放大。

3. 複製TapResponder.cs,並依照您的需求加以修改,即可。


參考資料
HoloToolkit Unity - Gaze and Airtap [連結]

[Unity] 使用按鈕控制舞台上的GameObject使其旋轉


目標
讓舞台上的GameObject受事件驅動(ex.點擊按鈕)而旋轉某個角度

分析
GameObject A是一個實體物件,按鈕B 是一個實體物件,
我想要透過使用按鈕B來控制GameObject A。

1. 幫按鈕B新增一個script,名為bt_left,並設定一個全域變數,
    類別為Animator,用來把GameObject A裏頭已經製作好的Animator指定進去。






2. 由於旋轉的animation,已事先錄製好,
    而且已經使用Animator controller編輯好每個animation切換的驅動條件,
    所以可以直接使用SetTrigger()指定要執行哪一個animation。
    除此之外,Target是全域變數,剛剛已經將Holograms指定給Target,
    所以Target就是要旋轉的物件,Target.SetTrigger("r_0")就可以讓他執行r_0這個animation。

























附註:
在某些情況下,可能希望直接讓Target做旋轉,
而不是事先錄製animation,此時也可以使用以下程式碼。

//Target.transform.rotation = Quaternion.Euler(0f, 72f, 0f); //停在這個旋轉角度上
//Target.transform.Rotate (new Vector3(0f, 72f, 0f)); //每次點擊都旋轉72度,有五個角度

但請記得宣告時將Target類別定義為GameObject

public GameObject Target;

而且旋轉的程式碼需要寫在void update (){}裡面,並註明每隔多久旋轉多少,就可以了。

在此,為了以按鈕驅動旋轉,所以大費周章,
使用了animator controller來控制秀哪一種旋轉角度的動畫。

參考資源 [連結]

2018年5月22日 星期二

[Unity] 版本更新問題

Unity 版本更新速度很快,當開發團隊的成員彼此之間合作開發Unity專案時,
經常面臨不同程式設計師所安裝的Unity版本並不相同。

當版本不同,開啟Unity專案時,便可能發生檔案無法開啟的問題。
其實不用太過擔心,有兩種解法可以解決。

第一種,重新匯入
Asset → Reimport All



第二種,是一種駭客手法
在檔案夾裡搜尋ProjectVersion.txt檔案,
修改 ProjectVersion.txt 的內容為更新後的版本別




開啟後,通常Hierarchy並無任何Scene,
只要把你所需要繼續編輯的Scene拖曳上Hierarchy後,
就會看到所有的相關物件了。



參考Unity論壇討論 [連結]



2018年5月20日 星期日

[blender] 快速製作2D轉3D的模型

 

先給各位看效果,左圖是一般的.jpg圖檔,右邊是將左圖直接增添厚度而成的3D模型。


2018年5月15日 星期二

獨角獸出沒!

剛剛在玩Actiongram,這是一套號稱用來寫故事的HoloLens App。
原本只是對於操作介面感興趣,
這是為了跟朋友討論HoloLens APP設計與手機平板APP設計的差異,
所以錄製了一段影片,方便我們做討論。

這過程倒意外,把獨角獸請到我平時工作的地方了,一起來看看牠恣意奔馳的模樣吧!


[* 觀賞Youtube內容時,請點擊字幕圖示]


2018年5月4日 星期五

[Unity] 如何trigger事件,使人物動畫切換動作、暫停、繼續?【C#語法】





-------------------------------------------------------------------------------------------------------------
touch 以及 triangle 必須先在Animator Controller裡頭事先設定好

1. 在Animator controller裡新增參數
    這裡新增的參數型態是trigger,分別是triangle以及touch




2. 為transition設定條件
    從idle_female → 三角伸展式_右 的這個transition
    設定其condition,為triangle。



[Unity] 如何trigger事件,使人物動畫切換動作、暫停、繼續?【總覽】


想做的事
    我想讓事先做好的人物,在按下鍵盤或滑鼠等不同驅動事件(trigger)後,切換動作,暫停動作或者是繼續動作。

預備與規畫
    1. 把人物以及事先錄製好的動作準備好,並且匯入到Unity裡面。

    2. 在Asset裡,create Animator Controller 
          2.1  把事先準備好的animation拖曳入Animator Controller裡
          2.2  在animation之間建立transition
          2.3  新增參數(parameter)與條件(condition)建立

    3. 把人物放到舞台上,幫人物 add component → Animator  
          3.1 在人物的Animator裡,指定 controller [將2.1-2.4做的Animator controller指定進去]
          3.2 在人物的Animator裡,指定 Avatar

    4. 幫人物撰寫腳本
         4.1  add script  [語法]
         4.2  編寫語法 (C# language)

    5. 測試


參考連結
Unity tutorial 官方網站  Controlling Animation 01-06 [前往連結]
Education & Technology Blog [前往連結]
勇者拉德小酒館 【Unity】Mecanim動畫系統Part1-Part5  [前往連結]


[* 觀賞Youtube影片內容時,請點擊字幕圖示]