網頁

2018年12月11日 星期二

[Unity] MetroSupport 更新

最近Unity好像在進行更新
我使用的是Unity 2018.1.1f1

先前已經使用這個版本的Unity寫了一些專案,
最近想要使用Unity 2018.1.1f1 繼續寫專案,可是卻出現了這個警告訊號。


我不想換Unity版本,因為我必須確認過去寫的專案可以維護。
版本更新,容易造成以前寫的專案不敷使用。
這個問題我在Unity Forum上查找過,
非常多人在討論這個問題。

折騰一番,所謂折騰是說:
我隨意弄個新的而且是簡單的專案
然後先發佈到HoloLens上看看,仍出現警告訊號,而發佈失敗。

原來是這個牽涉發佈功能的MetroSupport,需要做更新。
想辦法去Unity網站,下載 UnitySetup-Metro-Support-for-Editor-2018.1.1f1
並且安裝起來之後,就可以把Unity專案發佈到HoloLens了。

Unity通常會自動跳出更新訊號,指引你到相關網址做更新。
但有的電腦並不會跳出訊號,那恐怕就得自己更新安裝了。



匯入FBX檔案至Unity材質的設定 - Shader

我習慣使用iClone軟體做人物建模,並套用動作。
完成後直接丟到Unity裡面,做後續發佈至其他VR硬體的事情。

將FBX檔案匯入Unity時,材質常常需要另做指定。
那是因為材質的資料夾(folder)沒有指定好,
只需去Material裡面,把材質的資料夾指定一下,即可。

以下用圖示再仔細講一次。

2018年11月19日 星期一

從iClone轉出3D模型檔案至Unity

使用iClone來進行3D建模,是一個既快速又簡便的方式。
尤其是現在iClone 7 可以直接轉出FBX格式的檔案出去,
以致可以與Maya, Zbrush, Unity等各種3D建模、動畫或遊戲軟體做銜接,
這對於喜愛做3D動畫與3D遊戲軟體的人來說,可說是一大福音。

雖然Unity裡面,也有一些簡單的3D建模工具,
但是iClone在3D動畫製作方面,因為有關鍵影格的概念,
在使用上還是比Unity還要容易而且順手。

因此,我還蠻喜歡先在iClone把想要秀在Unity裡面的3D動畫製作好之後,
再整個以FBX的檔案格式匯出給Unity,
再由Unity發布出去給虛擬實境裝置(簡稱:VR裝置)上。

這個做法唯一的缺點,就是檔案太大,
在執行檔案的匯出以及匯入時,往往非常耗時。
即便如此,可以專心在iClone軟體就把3D動畫完成,可以省去很多麻煩。
耗時的問題,就變得勉強可以接受或處理的事情了。

以下筆記,是為了記錄檔案匯出匯入過程遇到的幾個小問題,
以後若再遇到,就不用重新嘗試錯誤與學習。

2018年9月25日 星期二

[Marvelous Designer, MD] 使用MD製作洋裝




Marvelous Designer 是一套可以製作衣服的軟體。
其實基本上只要上Youtube,使用關鍵字查詢「Marvelous Designer」,
就會跳出很多教學影片,可以幫助你快速學習。

2018年9月8日 星期六

發佈APP到HoloLens的名稱

直接拿微軟所提供的Unity專案來快速開發APP,
這對於新手程式設計師來說是經常會走的一條捷徑。

複製貼上後,產生的新的Unity專案,在發佈到HoloLens後,
如果沒有修改一個小地方,HoloLens會將此專案認成原本HoloLens所提供範例的APP。
這會變成新的Unity專案發佈到HoloLens時,一直覆蓋掉原本的APP,而無法產生新的APP。

2018年8月6日 星期一

使用Unity播放透明背景的影片

考量到使用HoloLens做混合實境開發時,有時直接疊合上2D影片,
可能還比較能快速發展出想實做的點子來。
此時不僅是呆呆地貼上影片,而是將影片中除了主體以外的背景去背,
然後做播放,便是一個重要的功能。

2018年8月4日 星期六

解決Mixed Reality Capture的延遲問題

這個問題頗為重要又相當棘手,但實際上早在一兩年前,
有些程式高手已經解決,並且將解法免費分享在GitHub上。

想要看到戴HoloLens眼鏡的人看到些什麼,一般可以用電腦開啟網路瀏覽器,
並且以網路連線HoloLens,就可以開啟Device Portal,
觀看Hologram與環境疊合後的混合實境結果。

可是,這項功能所看到的畫面向來會延遲個4-5秒鐘,
這對於APP展示或Oral Presentation非常不便。

後來,找到了一個已經早早被分享出來的解法。
在GitHub上有人分享一套稱為MixedRealityCompanionKit的套件,
裏頭有許多好用的小東西,其中的MixedRemoteViewCompositor就可以解決延遲的問題。

2018年7月20日 星期五

HoloLens 的 Sharing 功能 (程式碼解說)

本文將仔細介紹微軟網站所提供的 MR Sharing 240: Multiple HoloLens devices [前往]。
我就不仔細翻譯網站所提供的文件,此處我只想做個紀錄,主要是關於程式碼的部分。

目標:我想要用聲控說「play」,讓animator開始執行動作。
            animator 已經事先寫好animator controller,並且指定好條件設定。
            我想讓兩台HoloLens之間,可以同步執行上述這件事情。

HoloLens 更新了!

這兩天繼續使用HoloLens開發軟體,
一台HoloLens突然一副有點當機快壞掉的感覺,
總覺得不知道他在做些什麼事。

2018年7月18日 星期三

如何抓到Camera 的 transform.rotation 在X,Y,Z軸的值

在Unity裏頭的rotation,是一個相當複雜的概念。
直覺來說,我們會想說在X軸上看旋轉個幾度,Y軸上看旋轉個幾度,Z軸上看旋轉個幾度。
但實際上似乎又無法這樣設定。

以下有個特別的方式,既可以保持變數型態是 Quaternion,又可以從我們直覺的方式來做旋轉角度的設定。

2018年7月14日 星期六

將 Unity 專案部署到 Android 平台

這件事情比我想像中還要容易許多,尤其是放暑假後,
因為能專心地改寫程式,所以就一鼓作氣的把Android專案寫完。

我原本寫來部署到HoloLens用的Unity專案,也因為已經將程式架構定下來了,
所以將它改成部署給手機(Sony, Androida)使用,就變地快速許多。

以下整理一下,改寫過程使用到的關鍵網頁資源:

2018年7月3日 星期二

HoloLens 專案的快速測試與開發

誠如我在這篇文章「HoloLens建置(build)與部署(public)」(連結) 所討論的,
一個APP的完整部署流程,大約需要20分鐘,其流程相當耗時,這是不利於程式開發的。


因此,以下介紹四種測試方式,從簡易到完整流程,開發者可依現有軟硬體情況與需求交叉使用。

2018年7月2日 星期一

場景切換後燈光變暗

這似乎是從Unity 5就一直有的問題,
譬如:遊戲結束後要重新開啟場景,但燈光突然變暗。
並不是HoloLens專案特有的問題。

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
           ①                      ②

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

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影片內容時,請點擊字幕圖示]

2018年4月29日 星期日

全像圖形與使用者的距離

以下這段微軟製作的短片,主要在介紹什麼是accommodation-convergent conflict
因為這種conflict會造成眼球疲勞(eye strain),所以他提出一個建議,
就是將全像圖形放在2公尺處會是最為舒服的距離,
太近或是太遠都會降低舒適感(comfort)。

什麼是accommodation-convergent conflict呢?
這牽涉到人眼判斷物體離自身距離時,經常使用到的兩種眼球運動線索。
所謂accommodation是透過調節水晶體的肌肉,以此做為線索來判斷物體離自身的距離。
而convergent則是透過兩眼的輻輳與平視,以此做為線索來判斷距離,若為輻輳則是近距離,若為平視則為遠距離。

倘若accommodation與convergent兩者所計算出來的距離並不相同,則會給視覺系統帶來混淆。
因為視覺系統會不知道要透過調節水晶體肌肉,來符合convergent所判斷出來的距離感,
抑或是透過眼球轉動的肌肉,來符合accommodation所做的判斷。
也有一種可能性,就是兩者一直在調整,而無法獲得協調感。
在這種衝突下,至終造成眼球疲勞。

據此,微軟建議,將全像圖形放置在離使用者1.25-5 公尺,便算是落在舒適區。
但也有人認為,0.85-2 公尺,都是可接受範圍。

以上數值提供給HoloLens開發者做為參考。


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

全像圖形的面數

在全像圖形的世界裡,使用者從多重角度觀賞同一3D物件,
無疑是一項視覺享受,這更是全像圖形的一個主要特色。

模型的面數(polygon, face)多寡,不僅僅影響到模型所帶來的視覺效果,
也會影響到電腦處理的效能。

一個高面數(high-poly)模型,看起來會較為平滑,而且精美,
而低面數(low-poly)模型,則有崎嶇不平,坑坑疤疤的感覺。



                                                                  高面數(high-poly)


                                                                  低面數(low-poly)


面數過高,會使檔案容量過大,而會有執行效能過度負荷的問題。
面數太低,又無法滿足使用者對視覺享受的基本要求。
關於模型面數的多寡問題,以下是一些建議:

HoloLens 
       如果選到最佳的著色器(shader),最高可繪製出80,000個面數,並維持60fps。
       如果要畫200,000個面數,影格率就會降至30fps。
       大部分情況,保持在20,000至60,000個面數,便已是安全餘裕!

MAKAR
       官方說法是3000面至5000面,但實際上大於5000面以上,也是OK!
       基本上只要是在其容量限制內,即可。

所謂影格數,指的是3D動畫播放時,
每秒播放的影格數(frames per second)。
如果影格數下降,則動畫看起來就會卡卡的,
這也是執行效能過度負荷的展現。

為了提高效能,有人在討論如何透過使用表面圖像(texture)產生低面數高美感的模型。
這不失為一種能解決面數與效能間相互牽制的好方法。












2018年4月28日 星期六

[Unity] 如何讓.fbx 檔播放動畫?

假設您已經有事先製作好的3D動畫素材,
那麼就可以試著把它匯入Unity,並加以播放。

.fbx檔案是目前坊間常見的3D動畫檔案,
使用上較為廣泛,也較容易取得。

想要在Unity裡面播放3D動畫,
有幾個細緻的設定要點選。


1. 把.fbx檔拖曳入Assets,匯入檔案






2. 透過點擊該動畫檔,藉以選取它,然後到 Inspector做設定



    [step①] 透過滑鼠點擊該檔案,將其選取起來
    [step②] 點擊Inspector頁籤,至裡頭做設定




3. 在 Inspector → Rig
                         → Animation Type
                         → Legacy
                         → Apply



         [step①] 滑鼠點擊Rig
         [step②]  把Animation Type改為Legacy
         [step③]  按下Apply按鈕




4. 在 Inspector → Animation
                         → Wrap Mode
                         → Loop
                         → Apply



         [step①] 滑鼠點擊 Animation
         [step②]  把Wrap Mode 改為 Loop
         [step③]  按下Apply按鈕




5. 拖曳到場景,點擊播放 ▶️



          [step①]  把3D動畫檔拖曳進場景,或Hierarchy面板中
                         稍微調整一下位置,大小,直到攝影機清楚可見

          [step②]  點擊播放



6. 測試結果

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



播放完一輪後,它會從頭重新播放。
如果你的fbx檔案很大,那麼匯入時間可能會很久,請耐心等待。

Enjoy!









2018年4月27日 星期五

[Unity] 如何切換場景?

場景(scene)是Unity開發環境中的一個基本單位,
一個結構完整的遊戲通常包含兩個或兩個以上場景,
例如:開始畫面、遊戲本身、結束或重玩畫面等。
那麼,我們該如何讓遊戲在多個場景間切換呢?


1. 首先,預備好您所需要的多個場景

    

    此範例有三個場景,分別是startScene、gameScene、gameComplete
    startScene 顯示的是一個立方體
    gameScene 顯示的是「第二個scene」
    gameComplete 顯示的是「第三個scene」
    分別存檔




2. 把會用到的場景加入build settings,獲得編碼


    按下File→Build settings會跳出上面視窗
 
    選擇你要build的場景 [step①]
         將你要build的scene拖曳進來 [step①]
         或者按下Add Open Scenes按鈕 [step①]
         勾選或取消勾選你所要使用的scene [step③]
    每個scene最右邊會產生數字 [step②]

    在這個例子裡
        startScene 場景,專屬編碼顯示0
        gameScene場景,專屬編碼顯示1
        gameComplete 場景專屬編碼顯示2

    選擇您想要建置的平台
        只要點選並按下Switch Platform,就可以切換平台[step④⑤]
        這個例子選擇在本機產生standalone的執行檔
 
    完成設定後,點擊build,即可執行 [step⑥]

    註:初始場景是編號為0的場景


3. 在你要切換場景的條件設定下,編寫程式碼



       如上圖所示
       切換場景所使用的是SceneManager.LoadScene(專屬編碼或場景名稱)這個指令 [step③]
               在這個例子裡   SceneManager.LoadScene(1)           
               也可以寫成       SceneManager.LoadScene("gameScene")
                                                              → 代表切換到1場景,也就是gameScene

       這個指令的使用必須事先宣告 using UnityEngine.SceneManagement;  [step①]

       在這個例子裡,所設定的條件是,假如按下鍵盤上的N,就執行以下程序 [step②]
     
       [註解] 以前版本的Unity,切換場景的指令是Application.LoadLevel( );
                   我所使用的Unity版本是2017.3.1f1 Personal (64bit) ,上述指令已不敷使用。


4. 測試結果
   
                                                                    [* 觀賞Youtube影片內容時,請點擊字幕圖示]

      這個例子中,是用按下鍵盤按鍵N來切換場景。
      從startScene切換到 gameScene,再切換到 gameComplete。
 


在Youtube裡面,還有一些關於切換場景的教學影片,
其中不乏場景切換的華麗特效,有興趣的可自行前往觀賞。
影片1:Simple Scene Transition for Unity [前往]




本文參考出處:羽毛的電玩新手村





2018年4月21日 星期六

HoloLens的環境辨識功能


HoloLens是一套混合實境(mixed reality)眼鏡,
其特別之處就是能對物理環境進行感知,
辨識後甚至能分辨出牆面、地板與可放置物體的平面等。

使用者能將虛擬生成的全像圖形(hologram)以符合環境條件的方式放置入環境中,
這種讓使用者同時感受到虛擬全像物體以及日常物理實景,
兩者共同塑造出來的環境,稱為混合實境。

以下介紹HoloLens的環境辨識功能,它不僅能分辨出環境中足以遮蔽阻擋的表面出來,
也可以分辨這些表面為牆面、地板或者是大到足以放置物體的平面等。


2018年1月14日 星期日

如何將高面數的iClone v7.02人物動畫減為低面數動畫?

將高面數動畫降面為低面數動畫,對於講究輕便、訴求傳輸快速、
以及追求低硬碟容量的人來說,無疑是一項重要課題。

3D模型的減面方法 (blender)

3D模型除了能使用MeshLab做減面之外,也可以使用blender做減面。
尤其是當您的模型具有動畫時,blender (免費軟體)便是一個很好的選擇!

以下是 Blender 支援的檔案格式


(ps. 我已經試過.fbx, .ply, .obj, .stl, .svg等格式,減面效果很不錯!)

3D模型的減面方法 (MeshLab)

網路上免費或是付費的3D模型非常多,
但有時候下載下來的模型,
面數過多,以致容量過大而不敷使用。
這時候可以使用MeshLab或者是blender來降低面數。

如果您的3D模型屬靜態,格式上是 .obj, .ply, .stl 檔,
則可以考慮使用 MeshLab (免費軟體)
以下是MeshLab支援的檔案格式




杏仁核(amygdala)


杏仁核(amygdala)是個體在遇到威脅(threat)或是危險(danger)時
,與「攻擊或是逃跑(fight-or-flight)」有關的大腦區域。

expressive posture

expressive face