※中肯辭典
(註:有別於官方文件上的嚴謹說明,在此以工程師的角度來簡短說明此元素的特質與使用時機。)
在遊戲運作的過程中動態創造物件,例如:在畫面上隨機產生金幣。(點擊標題進入)
在紅極一時的手機遊戲Doodle Jump中,玩家要利用手機的陀螺儀來控制角色的方向,一路往上跳。遊戲中平台的位置每一局都不太一樣,就是運用了隨機動態生成的技巧。
若想在Unity的環境中達到這樣的效果,可使用內部的一個API叫做Instantiate。
( 官方文件:https://docs.unity3d.com/ScriptReference/Object.Instantiate.html )
Instantiate有許多種接參數的方式,我今天要介紹的是
Instantiate(物件名稱, 物件Position, 物件Rotation);
先來看看我們希望達到的效果:
當我按下鍵盤按鍵G,就會在畫面上隨機產生「箱子」這個物件。這個功能的完整程式碼如下:
●Line 7 : 宣告一個公開的遊戲物件Box。
加入這一行之後,回到Inspector裡面,點開掛載有這個Script的物件上,就會看到這樣的畫面:
你要宣告Box指得是哪一個物件,除了點右邊那個小圈圈來選擇外,也可以在Hierarchy中物件拖曳進那個長方形裡面,完成後就會長這樣:
註:這個”Box”是我們在Unity基本功(5)實作的物件,本身已經具有”Rigidbody2D”、”BoxCollider2D”等要素。
●Line 16 : 在Unity基本功第3回提到的,按下按鍵後進行函數裡的動作。
●Line 17 : 本文的重點,在場上隨機位置生成物件的指令,架構符合剛開始提到的
Instantiate(物件名稱, 物件Position, 物件Rotation)
其中,物件名稱當然就是我們已經設定好的Box,而後面兩項Position和Rotation都需要輸入一個Vector3型別的變數。
在Position的部分,我用了一個指令叫做Random.Range(最小值,最大值)。
這個指令能幫我們在最小值到最大值之間指定任意一個值,藉此達到隨機的效果。
ex. Random.Range(0,5) 有可能出現 0,1,2,3,4 (不包含最大值)。
ex. Random.Range(5.0, 6.5) 則有可能出現5.0,5.1,5.2, …….6.4,6.5
(用在浮點數時就會包含最大值,詳細原因可參考此痞客邦文章 https://goo.gl/VdkbVR )
因為這是一個2D專案,我把Position的Z值固定設為0f。
那X,Y是怎麼決定的呢?
我們要來看一下Scene上的畫面。
每一個小方格是100×100 pixel,在平面座標上則代表1單位。
以Camera設在(0,0)為參考點,這個畫面的左、右界線大致是-2.7f到2.7f之間,
因此我在Position的X軸部份把值設為Random.Range(-2.5f, 2.5f),才不會讓物件出生在畫面外;Y方向也是採用一樣的測量方式。
至於Rotation的部分,因為我們的物件沒有做特別的旋轉,所以我們可以直接採用物件本身的設定,也就是直接呼叫物件原本的旋轉資訊
box.transform.rotation
如此一來,就能達到影片中的效果了!
注意:因為在先前的章節裡,我們有加入「箱子只要被小雞撞到就會消失」的程式碼,所以如果箱子剛好出生在小雞所在的區域上,直接消失純屬正常現象XD然後這裡也沒有加入「不要出現在重疊的位置上」的機制,就留給大家去思考囉!