初心者培訓班 - Unity基本觀念

Unity基本功 (7) – 隨機生成物件

※中肯辭典

(註:有別於官方文件上的嚴謹說明,在此以工程師的角度來簡短說明此元素的特質與使用時機。)

在遊戲運作的過程中動態創造物件,例如:在畫面上隨機產生金幣。(點擊標題進入)


 

 

doodle-jump-2.jpg

在紅極一時的手機遊戲Doodle Jump中,玩家要利用手機的陀螺儀來控制角色的方向,一路往上跳。遊戲中平台的位置每一局都不太一樣,就是運用了隨機動態生成的技巧。

若想在Unity的環境中達到這樣的效果,可使用內部的一個API叫做Instantiate。

( 官方文件:https://docs.unity3d.com/ScriptReference/Object.Instantiate.html )

Instantiate有許多種接參數的方式,我今天要介紹的是

Instantiate(物件名稱, 物件Position, 物件Rotation);

先來看看我們希望達到的效果:

 

當我按下鍵盤按鍵G,就會在畫面上隨機產生「箱子」這個物件。這個功能的完整程式碼如下:

螢幕快照 2017-07-09 上午2.03.17.pngLine 7 : 宣告一個公開的遊戲物件Box。

加入這一行之後,回到Inspector裡面,點開掛載有這個Script的物件上,就會看到這樣的畫面:

螢幕快照 2017-07-09 上午1.22.23.png

你要宣告Box指得是哪一個物件,除了點右邊那個小圈圈來選擇外,也可以在Hierarchy中物件拖曳進那個長方形裡面,完成後就會長這樣:

螢幕快照 2017-07-09 上午1.24.10.png

註:這個”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上的畫面。

螢幕快照 2017-07-09 上午1.37.51.png每一個小方格是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然後這裡也沒有加入「不要出現在重疊的位置上」的機制,就留給大家去思考囉!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s