網頁

2018年6月29日 星期五

場景切換時等待個幾秒鐘才切換過去

這是書上普遍都會用的方法
我參考Loading new scene after time [連結] 的寫法
改成適合我的專案的code。

解釋一下:
事先寫了名為LoadLevelAfterDelay的IEmumerator
要用的時候,使用StartCoroutine呼叫LoadLevelAfterDelay。

IEmumerator也可以寫一些參數進去,以下的例子是寫sceneName這個參數,決定要切換去哪個場景。


  1. IEnumerator LoadSceneAfterDelay (string sceneName) { yield return new WaitForSeconds(0); SceneManager.LoadScene(sceneName, LoadSceneMode.Single); }
這個指令另外寫到其他function裡面
StartCoroutine(LoadSceneAfterDelay("BaseballMain"));


你也可以寫delay參數,決定要等待幾秒鐘。

  1. IEnumerator LoadSceneAfterDelay (string sceneName, float delay) { yield return new WaitForSeconds(delay); SceneManager.LoadScene(sceneName, LoadSceneMode.Single); }

  2. 這個指令另外寫到其他function裡面
StartCoroutine(LoadSceneAfterDelay("BaseballMain",2));


參考資料 [連結1]  [連結2]


2018年6月27日 星期三

場景切換後按鈕點擊一次變成兩次

我使用HoloToolkit提供的ButtonHolographic這個Button,
並且在裏頭寫了一些我希望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日 星期五

HoloLens 的 sharing 功能

在網路上可以找到的多人共享功能與文件,少之又少。
所以這個問題花了我頗多時間,才能完全搞懂他的邏輯。

為了解這個問題,主要從三個方向進行:

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

   假如沒有勾選,如果不是循環動畫,則當前動畫播放完畢後會卡在最後一個影格。
                               如果是循環動畫,則當前動畫播放完畢後,會跳回第一個影格而重複播放。


參考資料 [前往]

判斷animator正在播放的animation是否為指定的某個animation?

Animation是Unity的一個強項。
製作3D動畫為什麼需要搭配使用Unity,就是因為Unity對於3D動畫的掌握,有其輕鬆取得之優勢。
否則,直接使用Visual Studio就好,不是嘛?

在物件導向編程(OOP)的世界裡,取得物件狀態,將有利於判斷式的撰寫。
以下範例寫的就是用IsName,來判斷正在播放的動畫是否為"AnimationName",若是則執行後續指令。

  1. if( anim_Animator.GetCurrentAnimatorStateInfo(0).IsName("AnimationName"))
  2.      {
  3.       // Do stuf !!
  4.      }

敬請參考囉。

友善連結 [前往]

用script修改button的icon圖示與文字

說實在的,當初寫按鈕功能的時候,劈哩啪啦的在網路上找論壇,找範例。
一下用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功能,會因為沒有麥克風而無法測試。




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) [連結]