2016年12月5日 星期一

Day 6: 接取掉落的裝備——OnTriggerEnter2D & Tag

接續昨日,來完成主角接取掉落裝備的機制。


把降落傘和巫師帽拖到Scene,然後在Hierarchy欄新增一個空的Game Object (Create→Create Empty)。在Scene視窗把空的Game Object拖到降落傘和帽子的中央,再到Hierarchy欄把降落傘和帽子拉到新的Game Object上,成為新的Game Object的子物件(調整降落傘或帽子Transform Component中的Z座標可以設定他們在前方或後方,-Z是向前,+Z是向後)。如此一來,帽子和降落傘就可被視為一個整體,使他們一起往下落、一起偵測是否碰到主色身上的Box Collider 2D。


當然,要偵測自身是否碰到另一個Collider 2D,Game Object自己也要有Collider 2D Component。替剛剛新建的Game Object (包含降落傘和帽子的Game Object)加上一個Box Collider 2D Component。和之前一樣,用「Edit Collider」鈕調整Collider的範圍,並勾選「Is Trigger」欄。


現在,當遊戲的主角和掉落的裝備都有Collider 2D Component,就可以在Script中輕易地偵測兩個Collider 2D是否相互碰觸了。



在Script資料夾新建一個名為「FallingWeapon.cs」的C# Script。在類別中加入下面的函數,並在掉落裝備的Game Object新增FallingWeapon (Script) Component:



void OnTriggerEnter2D(Collider2D col)

{

    if (col.gameObject.tag == "Player") {

        print ("接到了!");

    }

}

這個void OnTriggerEnter2D(Collider2D col)也是眾多Unity Event Function的其中一個。每當有其他Collider 2D (不論是否為Trigger)進入該Game Object的Trigger(勾有Is Trigger的Collider 2D Component)時,便會呼叫該函數,並傳入接觸Trigger的Collider 2D Component為參數。

col.gameObject可以得到擁有該Collider 2D Component的Game Object,而col.gameObject.tag則可獲知該Game Object的Tag為何。上面的程式碼以if判斷式來檢查進入Trigger的Game Object是否被tag為”Player”,如果是,則在Console中印出「接到了」,表示偵測成功(實際穿戴裝備留到之後再做)。

但究竟什麼是Tag呢?在Unity,每個Game Object都可以擁有一個標籤,也就是tag。使用者可以自行增加tag的名稱,或使用Unity內建的Tag名稱。而Tag的用處是方便使用者在Script中檢查Game Object是不是他要的目標,或是在擁有眾多Game Object的場景裡找尋他所要的Game Object (呼叫GameObject.FindWithTag()函數,之後會用到)。


回到Unity的Hierarchy欄,點擊主角,然後在Inspector的Tag選單中選「Player」,如此遊戲的主角就被標籤為「Player」了。



在進入Play Mode測試之前,還有件相當重要的事情:要使OnTriggerEnter2D()生效,定義這個函數的Game Object必須擁有Rigidbody 2D Component。回到「掉落裝備」Game Object的Inspector欄,按Add Component→Physics 2D→Rigidbody 2D。在Rigidbody 2D Component勾選「Is Kinematic」欄。


增加Rigidbody 2D Component通常是為了使Game Object受到物理作用力(如地心引力)的影響,然而我新增Rigidbody 2D Component存粹是為了使OnTriggerEnter2D這個函數生效。勾選「Is Kinematic」欄,使該Game Object忽略所有的作用力。

設定完Rigidbody 2D後,進入Play Mode。把掉落裝備拉至主角身上,Console便會成功顯示「接到了!」的訊息。




繪圖進度

終於把開場動畫做完了(雖然不是很滿意),並畫了一些攻擊主角的敵人。


待續。

沒有留言 :

張貼留言