接續昨日,來完成主角接取掉落裝備的機制。
把降落傘和巫師帽拖到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便會成功顯示「接到了!」的訊息。
終於把開場動畫做完了(雖然不是很滿意),並畫了一些攻擊主角的敵人。
待續。