網頁

顯示具有 Unity-C# 標籤的文章。 顯示所有文章
顯示具有 Unity-C# 標籤的文章。 顯示所有文章

2021年2月28日 星期日

[Unity] 如何log資料到console

語法
   Debug.Log( 變數名稱 ); 
   範例: Debug.Log("here!"); 


在Visual Studio視窗撰寫C#語法

在Unity的Console裡面,顯示debug的結果
有了這個功能,就可以仔細確認,程式撰寫過程的每個步驟,是否正確運作。







2020年11月19日 星期四

[Unity] Prefab的製作、使用、解除連結、回復聯結

前言

Prefab (預置物)的使用,相當便利。
在遊戲裡面,想要瘋狂發射子彈,那麼我們就可以先把「子彈」做成預置物。
在事件驅動後,舞台上便生成子彈(Instantiate),想要生成幾個子彈都可以。
如果子彈太多,也可以用Destroy指令,把子彈從舞台上消除。

2020年11月10日 星期二

[Unity] 材質的語法控制-調整顏色與透明感

目標:想要調整材質球的透明感或顏色,不僅如此,要做出逐漸透明的感覺。
工作細項:
1. 逐漸透明是一種動態變化,所以必須可以控制時間,我選用IEnumerator 作時間控制
2. 調整的是材質球裡面的color參數,通常包含rgba,也就是red, green, blue, alpha
3. 必須可以抓到材質球,修改後,再指定回去給要改變的遊戲物件
4. 因為我的遊戲物件的結構parent-child結構很龐大,所以要指定是第幾個child修改透明感

2020年10月20日 星期二

[Unity] 使用語法寫旋轉動畫

目標:寫出書本,一頁一頁翻頁,並且是每按一次按鈕,就翻一次頁。
需要完成的工作事項:
1. 設定好轉軸pivot,想好旋轉方向是沿著X軸、Y軸或者Z軸轉
2. 每次旋轉要轉幾度,每隔多久旋轉一個frame
3. 找出旋轉的初始角度與結尾角度。
4. 時間設定會用到IEnumerator ,因此先寫好IEnumerator ,需要用的時候,再呼叫就可以了。

2018年7月18日 星期三

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

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

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

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年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;
 


參考資源 [連結]