這似乎是從Unity 5就一直有的問題,
譬如:遊戲結束後要重新開啟場景,但燈光突然變暗。
並不是HoloLens專案特有的問題。
2018年7月2日 星期一
2018年7月1日 星期日
HoloLens 建置(build)與部署(publish)
開始談如何建置與發佈之前,先跟各位介紹一下開發HoloLens時硬體與軟體的邏輯關係。
想要自撰一個HoloLens APP,你的電腦需要先安裝好
1. Unity
2. Visual Studio
Unity是一個可供對3D模型作互動並且撰寫C#語法(或Java語法)的平台,
開發者可在Unity上匯入3D模型,也可以透過Visual Studio撰寫C#語法,
而且Unity與Visual studio所撰寫的C# script之間會有所連動,
藉此就可以依著開發者需求,寫出您所想要執行的功能。
寫好的Unity專案,必須建置(build)出C#的Visual studio專案。
這個步驟對HoloLens app佈署來說是必須的。
最後,再由Visual studio專案進行佈署(deploy),
把寫好的專案佈署到HoloLens眼鏡上。
總結來說,佈署順序是:
Unity → Visual Studio → HoloLens
① ②
想要自撰一個HoloLens APP,你的電腦需要先安裝好
1. Unity
2. Visual Studio
Unity是一個可供對3D模型作互動並且撰寫C#語法(或Java語法)的平台,
開發者可在Unity上匯入3D模型,也可以透過Visual Studio撰寫C#語法,
而且Unity與Visual studio所撰寫的C# script之間會有所連動,
藉此就可以依著開發者需求,寫出您所想要執行的功能。
寫好的Unity專案,必須建置(build)出C#的Visual studio專案。
這個步驟對HoloLens app佈署來說是必須的。
最後,再由Visual studio專案進行佈署(deploy),
把寫好的專案佈署到HoloLens眼鏡上。
總結來說,佈署順序是:
Unity → Visual Studio → HoloLens
① ②
2018年6月29日 星期五
場景切換時等待個幾秒鐘才切換過去
這是書上普遍都會用的方法
我參考Loading new scene after time [連結] 的寫法
改成適合我的專案的code。
解釋一下:
事先寫了名為LoadLevelAfterDelay的IEmumerator。
要用的時候,使用StartCoroutine呼叫LoadLevelAfterDelay。
IEmumerator也可以寫一些參數進去,以下的例子是寫sceneName這個參數,決定要切換去哪個場景。
你也可以寫delay參數,決定要等待幾秒鐘。
參考資料 [連結1] [連結2]
我參考Loading new scene after time [連結] 的寫法
改成適合我的專案的code。
解釋一下:
事先寫了名為LoadLevelAfterDelay的IEmumerator。
要用的時候,使用StartCoroutine呼叫LoadLevelAfterDelay。
IEmumerator也可以寫一些參數進去,以下的例子是寫sceneName這個參數,決定要切換去哪個場景。
IEnumerator LoadSceneAfterDelay (string sceneName) { yield return new WaitForSeconds(0); SceneManager.LoadScene(sceneName, LoadSceneMode.Single); }
這個指令另外寫到其他function裡面
StartCoroutine(LoadSceneAfterDelay("BaseballMain"));
你也可以寫delay參數,決定要等待幾秒鐘。
IEnumerator LoadSceneAfterDelay (string sceneName, float delay) { yield return new WaitForSeconds(delay); SceneManager.LoadScene(sceneName, LoadSceneMode.Single); }
StartCoroutine(LoadSceneAfterDelay("BaseballMain",2));
2018年6月27日 星期三
場景切換後按鈕點擊一次變成兩次
我使用HoloToolkit提供的ButtonHolographic這個Button,
並且在裏頭寫了一些我希望Button做的事,
其中該具備的各項功能與參數都已經寫好並測試好。
豈知,在不同場景之間互相切換之後,卻碰出一個詭異到不行的問題。
問題是:明明對button做一次的click,可是他卻變成兩次click。
於是只好到處看論壇,找找看是否有人跟我遇到相同問題。
在GitHub論壇[連結],我找到了這篇貼文:InputManager causing UI events to fire twice
這個解法是被動式的解法,嚴格說並非求甚解而得,
但短期內還得仰仗HoloToolkit的prefab的前提下,這是最快而且可解決問題的作法。
並且在裏頭寫了一些我希望Button做的事,
其中該具備的各項功能與參數都已經寫好並測試好。
豈知,在不同場景之間互相切換之後,卻碰出一個詭異到不行的問題。
問題是:明明對button做一次的click,可是他卻變成兩次click。
於是只好到處看論壇,找找看是否有人跟我遇到相同問題。
在GitHub論壇[連結],我找到了這篇貼文:InputManager causing UI events to fire twice
這篇貼文與討論,高手如雲。
我最後是用以下這段程式碼解決的。
概念上是這樣的,一旦他偵測到兩個click之間的間隔時間太短,就不執行這個function。
所以第一個click抓到之後,第二個如果時間間隔太近,就離開function。
如此,就如同只發生一個click而已。
private float lastClickTime = 0; private float debounceDelay = 0.005f; public void OnInputClicked(InputClickedEventData eventData) { if(Time.time - lastClickTime < debounceDelay) { return; } lastClickTime = Time.time; // do stuff }
這個解法是被動式的解法,嚴格說並非求甚解而得,
但短期內還得仰仗HoloToolkit的prefab的前提下,這是最快而且可解決問題的作法。
2018年6月22日 星期五
2018年6月13日 星期三
Animator controller 模組的參數
Animator controller 是用來指定 animator 要播放哪個 animation 的一套介面控制系統。
介面上可供設定兩兩animation轉換時的條件。當然script裡頭也可以指定要播放哪個animation。相關的做法可以參考我寫的兩篇文章,分別是 總覽 與 C#語法 。
關於animator controller模組,以下介紹兩個常用的參數。
如果animation要周而復始不斷的重複播放,那麼可以這樣設定,請見下圖:
一、動畫周而復始地播放動作

1. 在animator controller裡頭,選定要周而復始重複播放的animation,上圖範例是「樹式左_2」,先把它選取起來。
2. 在Inspector裡頭,把Loop Time 勾選起來,並且點擊Apply。
3. 如此設定好之後,該動作就會周而復始地播放囉!
二、Has Exit time 的功能介紹

1. 先選取一個transition。如上圖選取後,箭頭會變成藍色。 所謂transition意指從某個animation轉為另個animation之間的轉換,稱為一個transition。
2. 至Inspector找 Has Exit Time。
3. 兩兩animation的轉換,有以下三種情況,可供選擇與設定:
(1) 當前動畫接收到條件後,需等待播放完畢後,才能轉換到下個動畫。
Has Exit Time R
(2) 動畫之間的轉換,需要立即轉換動畫,亦即不須等待當前動畫是否播放完畢
Has Exit Time □
(3) 當前動畫不需等待條件,播放完畢後就自動轉換到箭頭指的下個狀態
Has Exit Time R
假如沒有勾選,如果不是循環動畫,則當前動畫播放完畢後會卡在最後一個影格。
如果是循環動畫,則當前動畫播放完畢後,會跳回第一個影格而重複播放。
參考資料 [前往]
介面上可供設定兩兩animation轉換時的條件。當然script裡頭也可以指定要播放哪個animation。相關的做法可以參考我寫的兩篇文章,分別是 總覽 與 C#語法 。
關於animator controller模組,以下介紹兩個常用的參數。
如果animation要周而復始不斷的重複播放,那麼可以這樣設定,請見下圖:
一、動畫周而復始地播放動作

1. 在animator controller裡頭,選定要周而復始重複播放的animation,上圖範例是「樹式左_2」,先把它選取起來。
2. 在Inspector裡頭,把Loop Time 勾選起來,並且點擊Apply。
3. 如此設定好之後,該動作就會周而復始地播放囉!
二、Has Exit time 的功能介紹

1. 先選取一個transition。如上圖選取後,箭頭會變成藍色。 所謂transition意指從某個animation轉為另個animation之間的轉換,稱為一個transition。
2. 至Inspector找 Has Exit Time。
3. 兩兩animation的轉換,有以下三種情況,可供選擇與設定:
(1) 當前動畫接收到條件後,需等待播放完畢後,才能轉換到下個動畫。
Has Exit Time R
(2) 動畫之間的轉換,需要立即轉換動畫,亦即不須等待當前動畫是否播放完畢
Has Exit Time □
(3) 當前動畫不需等待條件,播放完畢後就自動轉換到箭頭指的下個狀態
Has Exit Time R
假如沒有勾選,如果不是循環動畫,則當前動畫播放完畢後會卡在最後一個影格。
如果是循環動畫,則當前動畫播放完畢後,會跳回第一個影格而重複播放。
參考資料 [前往]
判斷animator正在播放的animation是否為指定的某個animation?
Animation是Unity的一個強項。
製作3D動畫為什麼需要搭配使用Unity,就是因為Unity對於3D動畫的掌握,有其輕鬆取得之優勢。
否則,直接使用Visual Studio就好,不是嘛?
在物件導向編程(OOP)的世界裡,取得物件狀態,將有利於判斷式的撰寫。
以下範例寫的就是用IsName,來判斷正在播放的動畫是否為"AnimationName",若是則執行後續指令。
製作3D動畫為什麼需要搭配使用Unity,就是因為Unity對於3D動畫的掌握,有其輕鬆取得之優勢。
否則,直接使用Visual Studio就好,不是嘛?
在物件導向編程(OOP)的世界裡,取得物件狀態,將有利於判斷式的撰寫。
以下範例寫的就是用IsName,來判斷正在播放的動畫是否為"AnimationName",若是則執行後續指令。
- if( anim_Animator.GetCurrentAnimatorStateInfo(0).IsName("AnimationName"))
- {
- // Do stuf !!
- }
敬請參考囉。
友善連結 [前往]
用script修改button的icon圖示與文字
說實在的,當初寫按鈕功能的時候,劈哩啪啦的在網路上找論壇,找範例。
一下用script修改按鈕 icon圖示,一下子修改按鈕文字(text)。
當時沒有馬上記下來,現在倒是記憶有些模糊了。
趁還沒完全忘記,趕緊記錄下來吧!


步驟上是這樣的:
1. 事先準備好圖示(ex. play, stop),也許是.jpg 或者是 .png,需事先匯入到asset裡面。
2. 在script裡面寫好全域變數去接,變數型態須為Texture。如上圖1所示。
3. 如上圖2所描寫的,在Unity裡面會顯示PlayIcon, StopIcon欄位,你可以點擊右邊的小圓點(圖3所示),將圖檔指定進去。
4. 在script裏頭寫全域變數btnIcon,變數型態是GameObject,那是預備去接舞台上即將被修改圖示的按鈕。同樣的在Unity介面上也要先把即將被修改的按鈕指定進去。例如:UIButtonSquareIcon。
5. 在script裡面撰寫以下程式碼,就可以把舞台上的按鈕圖示,改為你要的圖示了。
btnIcon.GetComponent<MeshRenderer>().material.mainTexture = stopIcon;
6. 同樣的,修改按鈕文字的方式,分為以下小步驟:
(1) 先在script裏頭寫全域變數btnName,變數型態是GameObject
(2) 在Unity介面上,把舞台上將被修改的text指定進去。
(3) 用script寫,文字要修改成什麼。以下範例是修改成"Stop"
btnName.GetComponent<TextMesh>().text = "Stop";
概念整理:
其實需要掌握的是變數型態,以及該類別下的屬性的階層關係。
其餘的就只是把該指定的檔案或文字,指定到正確位置而已。
圖示的參考出處
→ 參考論壇 [前往]
文字的參考出處
→ 參考文件Unity Manual [連結]
→ 參考影片Unity tutorial [連結]
一下用script修改按鈕 icon圖示,一下子修改按鈕文字(text)。
當時沒有馬上記下來,現在倒是記憶有些模糊了。
趁還沒完全忘記,趕緊記錄下來吧!

- 目標:中間這個Play圖示,按下去之後,要改為Stop圖示。
我使用的是ButtonHolographic這個prefab。
可以去HoloToolkit-Example → UX → prefabs → ButtonHolographic 找到。

步驟上是這樣的:
1. 事先準備好圖示(ex. play, stop),也許是.jpg 或者是 .png,需事先匯入到asset裡面。
2. 在script裡面寫好全域變數去接,變數型態須為Texture。如上圖1所示。
3. 如上圖2所描寫的,在Unity裡面會顯示PlayIcon, StopIcon欄位,你可以點擊右邊的小圓點(圖3所示),將圖檔指定進去。
4. 在script裏頭寫全域變數btnIcon,變數型態是GameObject,那是預備去接舞台上即將被修改圖示的按鈕。同樣的在Unity介面上也要先把即將被修改的按鈕指定進去。例如:UIButtonSquareIcon。
5. 在script裡面撰寫以下程式碼,就可以把舞台上的按鈕圖示,改為你要的圖示了。
btnIcon.GetComponent<MeshRenderer>().material.mainTexture = stopIcon;
6. 同樣的,修改按鈕文字的方式,分為以下小步驟:
(1) 先在script裏頭寫全域變數btnName,變數型態是GameObject
(2) 在Unity介面上,把舞台上將被修改的text指定進去。
(3) 用script寫,文字要修改成什麼。以下範例是修改成"Stop"
btnName.GetComponent<TextMesh>().text = "Stop";
概念整理:
其實需要掌握的是變數型態,以及該類別下的屬性的階層關係。
其餘的就只是把該指定的檔案或文字,指定到正確位置而已。
圖示的參考出處
→ 參考論壇 [前往]
文字的參考出處
→ 參考文件Unity Manual [連結]
→ 參考影片Unity tutorial [連結]
使用HoloToolkit 做聲音控制- KeywordManager.cs
聊一下Voice command的使用,我手邊使用的兩本書,
關於聲控這項功能,寫的範例都是要先把視線(gaze)移至某處後,然後說"Select",接著看做什麼事。
而這次我需要聲控,就是因為要讓使用者輕鬆的做操作,所以不需要把視線(gaze)的情況考量進去。
上網找了一下資源,我找到這個參考資源 [連結] 裏頭有voice command的設定步驟。因為我所使用的HoloToolkit版本找不到KeywordManager.cs這個script,所以我另外到 GitHub搜尋,並下載來使用KeywordManager.cs [下載]。
使用的邏輯很簡單,先透過他的KeywordManager.cs,以介面的方式設定好你需要的口語指令。

需要口語指令的個數,指定在Size裡面。(上圖範例是4個)
口語指令是什麼,寫在Keyword裡面。(上圖範例有Previous, Play, Next, Stop)
說出指令後,要做的事情必須寫在某個Game Object裏頭的Script裏頭
並且以全域方式寫function,如下:
public void name (){
敘述;
}
Script 寫好之後,再把口語指令說出之後要做的function,指定進去。
(上圖範例btnPlay是事先寫好的GameObject,btn_Play.myPlayDo是該function)
使用心得:
1. Visual Studio 跟 Unity 的連動,有點慢,如果你寫好的function未即時呈現再Unity裡面
其實,再稍微等一下下就會出現了。
2. Voice command的功能得要把專案整個發佈到HoloLens上才能測試。
使用Holographic Emulation功能,會因為沒有麥克風而無法測試。
關於聲控這項功能,寫的範例都是要先把視線(gaze)移至某處後,然後說"Select",接著看做什麼事。
而這次我需要聲控,就是因為要讓使用者輕鬆的做操作,所以不需要把視線(gaze)的情況考量進去。
上網找了一下資源,我找到這個參考資源 [連結] 裏頭有voice command的設定步驟。因為我所使用的HoloToolkit版本找不到KeywordManager.cs這個script,所以我另外到 GitHub搜尋,並下載來使用KeywordManager.cs [下載]。
使用的邏輯很簡單,先透過他的KeywordManager.cs,以介面的方式設定好你需要的口語指令。

需要口語指令的個數,指定在Size裡面。(上圖範例是4個)
口語指令是什麼,寫在Keyword裡面。(上圖範例有Previous, Play, Next, Stop)
說出指令後,要做的事情必須寫在某個Game Object裏頭的Script裏頭
並且以全域方式寫function,如下:
public void name (){
敘述;
}
Script 寫好之後,再把口語指令說出之後要做的function,指定進去。
(上圖範例btnPlay是事先寫好的GameObject,btn_Play.myPlayDo是該function)
使用心得:
1. Visual Studio 跟 Unity 的連動,有點慢,如果你寫好的function未即時呈現再Unity裡面
其實,再稍微等一下下就會出現了。
2. Voice command的功能得要把專案整個發佈到HoloLens上才能測試。
使用Holographic Emulation功能,會因為沒有麥克風而無法測試。
2018年6月9日 星期六
[無母數分析] Friedman Test 相依樣本的多組比較
何時該使用無母數分析呢?
1. 當樣本數太小,母群體並非呈常態分配,以致抽樣分配不是常態分配
2. 當資料點為間斷變項,譬如,名義量尺或次序量尺
Friedman Test是一種無母數分析,可用在類似於相依樣本單因子變異數分析情況。
點擊進連結之後,就可以看到SPSS的操作步驟,以及報表解釋。
完成Friedman Test綜合考驗之後,通常會需要進行事後比較。
此時可以使用Wilcoxon Signed-Rank Test,唯一需要考慮的是統計水準的選定。
SPSS建議採用Bonferroni adjustment的校正,假如需進行三個簡單比較,那麼每個比較的統計水準就要定為0.05/3=0.016。
有人會把Friedman Test稱為無母數的二因子分析,這樣的稱呼把參與者視為一個變項,並將單因子的獨變項與參與者變項的交互作用加以考慮,繼而稱之為二因子。實際運用時,實則仍為單因子的無母數分析。
參考資料
單因子相依樣本的多組比較Friedman Test in SPSS statistics [連結]
事後比較 post-hoc (Wilcoxon Signed-Rank Test using SPSS statitstics) [連結]
1. 當樣本數太小,母群體並非呈常態分配,以致抽樣分配不是常態分配
2. 當資料點為間斷變項,譬如,名義量尺或次序量尺
Friedman Test是一種無母數分析,可用在類似於相依樣本單因子變異數分析情況。
點擊進連結之後,就可以看到SPSS的操作步驟,以及報表解釋。
完成Friedman Test綜合考驗之後,通常會需要進行事後比較。
此時可以使用Wilcoxon Signed-Rank Test,唯一需要考慮的是統計水準的選定。
SPSS建議採用Bonferroni adjustment的校正,假如需進行三個簡單比較,那麼每個比較的統計水準就要定為0.05/3=0.016。
有人會把Friedman Test稱為無母數的二因子分析,這樣的稱呼把參與者視為一個變項,並將單因子的獨變項與參與者變項的交互作用加以考慮,繼而稱之為二因子。實際運用時,實則仍為單因子的無母數分析。
參考資料
單因子相依樣本的多組比較Friedman Test in SPSS statistics [連結]
事後比較 post-hoc (Wilcoxon Signed-Rank Test using SPSS statitstics) [連結]
訂閱:
文章 (Atom)