Unity-2017.2官方執行個體教程Roll-a-ball(二)

來源:互聯網
上載者:User

標籤:if語句   oca   height   改變   這一   類型   碰撞   指令碼   出現   

聲明:

本文系轉載,由於Unity版本不同,文中有一些小的改動,原文地址:http://www.jianshu.com/p/97b630a23234

上一節Unity-2017.2官方執行個體教程Roll-a-ball(一)我們講到了:

一、如何建立一個新項目(Project)

二、如何建立一個新的遊戲情境(Scene)

三、如何添加基本的遊戲對象(GameObject)

四、如何添加燈光(Light)

五、如何給遊戲對象添加指令碼(Script)

如果運行過遊戲的朋友就會發現一個問題,雖然我們可以控制球體運動了,但是遊戲視角好像不會隨著球體而移動,球體一下子就會跑到攝像機看不到的地方去了,那麼這一節我們就會學習以下內容:

一、如何讓攝像機跟隨球體移動

二、製作圍牆來防止球體跑出平台

三、添加一個內建旋轉動畫的方塊

四、製作一個Prefab和使用Global模式

五、讓球體可以拾取方塊

六、如何?一個簡單的計分板UI(Text)

七、如何發布遊戲(Build)

一、讓攝像機跟隨球體移動

首先我們選中我們的網路攝影機(Main Camera),然後我們會看到如下的情況:

在中,我們可以看到,在Scene視窗的右下角,也就是圖中紅框處,有一個小視窗,這個視窗就顯示我們此時選中的攝像機所有看到的內容,方便我們調整攝像機的位置,所以我們先拖動攝像機的位置和角度,來處於一個合適的視角,本例中,我們將網路攝影機的Position的Y和Z分別調至5和-6,然後把其的Rotation的X值調至45,這樣攝像機的視角就變成了45°俯視角:

視角調整好後,我們接下來要讓網路攝影機跟隨球體來移動,我們第一個想到的辦法,也是最簡單的方法,就是把攝像機變成球體的一個子物件,這樣球體移動,攝像機也會跟著變化,我們馬上做做看:

Tips:把攝像機變成球體的一個子物件的方法是:把Main Camera對象拖到Player對象上

然後我們運行遊戲,我們發現網路攝影機的確是跟著球體移動了,但是它不止位置跟著球體變化,他的角度也會跟著球體變化,這樣網路攝影機就會出現天旋地轉的效果,這不是我們想要的效果。

Tips: Unity中,子物件的Transform屬性會跟隨父物件一起進行變化

我們想要的效果只需要攝像機的位置跟隨球體移動,角度不需要,所以我們只能用指令碼來實現這一效果,首先我們給攝像機添加一個指令碼(大家應該還記得如何添加吧,不記得可以回去看第一節的內容,這裡就不再重複介紹了),我們給指令碼命名為CameraController,指令碼語言選擇C#。然後我們看看指令碼內容:

(1)、首先,我們定義了一個public的GameObject變數,這個變數就是用來告訴程式,攝像機會跟隨哪個GameObject來移動

(2)、然後我們定義一個private的Vector3的變數,這個變數我們主要用來記錄攝像機初始的位置,用作之後更新攝像機的位置的位移向量

(3)、然後我們在Start方法中,攝像機的position數值賦給offset變數,意思是在開始前,用offset變數記錄下攝像機的初始位置

(4)、最後我們在LateUpdate方法中,把攝像機的位置變更為球體的位置加上最開始的位移位置

Tips:這裡其實指令碼中使用Update方法一樣可以達到效果,但是我們使用LateUpdate(最後更新)效率會更高一點

寫完指令碼內容後,我們儲存一下指令碼,然後回到Unity編輯器介面,我們會發現攝像機的指令碼組件中,多了一個Player屬性,如:

這就是我們剛剛在指令碼中定義的public類型的屬性。

Tips:在Unity指令碼中,public的屬性會在編輯器中顯示出來

然後我們把球體拖入到Player屬性中,如:

接下來我們運行一下遊戲,就可以發現攝像機現在可以正常跟隨球體移動了。

二、製作圍牆,防止球體跑出平台

 攝像機可以跟隨球體移動後,我們又看到一個問題,球體如果移動超過平台的邊界,就會掉下去,這不太友好,所以我們接下來給平台加上一圈圍牆,來防止球體跑出平台

我們建立一個cube對象,然後reset他的Transform屬性會發現cube和球體擋住到了一起,這樣不方便我們來編輯cube:

為了方便編輯cube,我們可以暫時不顯示球體,我們選中球體,將球體的Inspector下方的勾選去掉,如:

這樣一來,球體就展示在我們的Scene視窗中不顯示了。接下來我們可以編輯cube的屬性,將其的長度設定成和平台一樣,然後將其的位置移動到平台北面的邊緣,如:

然後同樣的,我們給平台的南面,西面,東面都製作一堵牆,如:

然後在運行一下,可以看到球體就沒法跑出平台了。

Tips:運行時記得把Player顯示出來

三、製作一個旋轉的方塊有了平台,有了球體,接下來我們就需要一個方塊,這個方塊可以讓球體碰撞並拾取,為了讓方塊變得有吸引力一點,我們讓方塊可以自動旋轉起來,首先我們建立一個cube對象(不要忘記建立GameObject之後的兩個標準動作),然後我們將cube命名為PickUp,並把它的Rotation的X、Y、Z值都設定為45,然後將其拖動到一個你覺得合適的位置,比如這樣:

 

之後我們給這個方塊添加一個自動旋轉的指令碼,指令碼名稱為Rotator,指令碼內容如下:

裡面我們就添加了一句話,Time.deltaTime就是根據時間變化來改變方塊的Rotation屬性,從而達到旋轉的效果,儲存指令碼,然後運行一下,就可以看到方塊自己旋轉起來了。

四、製作一個Prefab和使用Global模式

為了讓遊戲豐富起來,我們只有一個方塊是不夠的,因此我們需要多建立幾個方塊,在這之前呢,我們需要先製作一個Prefab(預製件),製作一個預製件有以下好處:

(1)、一次製作,重複使用,可以在任何項目中使用Prefab

(2)、一次修改,全部變化,我們修改Prefab的屬性後,所有使用該Prefab的對象屬性都會跟著發生變化

而製作Prefab的方法也非常簡單,我們為了資源管理方便,先在Assets檔案夾下面建立一個Prefabs檔案夾來存放Prefab檔案,然後在Prefabs檔案夾下建立一個Prefab,重新命名為PickUp,拖動Pickup(剛才建立的Cube)對象到PickUp(Prefab資源),一個Prefab就建立好了,具體步建立方法有兩種:

第一種:首先點擊選中Assets檔案夾下的Prefabs檔案夾,點擊功能表列的Assets->Create->Prefab

第二種:點擊選中Assets檔案夾下的Prefabs檔案夾,右鍵->Create->Prefab

然後我們可以複製PickUp對象,並拖拽新的PickUp到合適的位置,此時你會發現拖拽沒有辦法保持Y軸不變,因此為了方便我們移動PickUp對象的位置,我們先將Scene視圖改為Y軸模式:

然後將Local模式改為Global模式:

此時我們便可以方便的調整PickUp對象的位置了,最後效果如下:

我們可以看到,一共擁有8個PickUp方塊。

 五、讓球體拾取方塊

接下來我們實現球體拾取方塊的功能,我們通過查API得知有一個OnTriggerEnter的方法可以用來在球體碰到物體的時候調用(觸發器),光有這個方法還不夠,我們還需判斷球體碰到的是什麼東西,我們不能碰到任何東西都拾取,所以我們需要給被拾取的方塊增加一個標記(Tag),增加標記的方法如下:

 (1)、因為我們情境裡面一共有8個方塊,如果一個個的設定標記,就有點太麻煩了,還記得上面我們提到的Prefab的第2點好處嗎?對了,這邊我只需要給Prefab標記就可以了

(2)、首先我們選中PickUp Prefab,然後在Inspector視圖的Tag裡面新增一個Tag,我們命名為PickUp

 

接下來我們就可以進行指令碼編寫了,我們開啟球體的PlayerController指令碼,然後新增下面的代碼:

首先這裡other變數代表球體碰到的對象,在這個方法裡面,我先用if語句判斷碰到的對象的Tag是否等於“PickUp”,如果等於,我就將碰到的對象設定為不啟用(不顯示)

 做完這些,我們就可以運行一下遊戲,看看效果。我們運行了遊戲發現,球體碰撞方塊並沒有將它拾取,這是為什麼呢?原因是我們沒有將方塊設定為碰撞觸發器(Is Trigger),只有設定成碰撞觸發器,我們才可以的OnTriggerEnter方法才能起效果,在這裡我們還是給Prefab設定成Is Trigger屬性,這樣每個方塊都有了這個屬性。設定完成後,再運行遊戲,可以發現,現在球體碰到方塊就可以拾取了。

六、製作一個計分板

好了,我們的遊戲基本可以玩了,但是我們還需給玩家增加一點刺激,做一個計分板來鼓勵玩家多拾取方塊,那麼實現一個計分板我們需要以下元素:

(1)、用一個變數儲存玩家的分數

 (2)、然後將分數顯示在UI上面

首先我們修改PlayerController指令碼,如下:

第一個紅框處,我們定義了一個count變數用來儲存分數,然後在Start方法中將Count的值初始化為0,即我們在遊戲開始時,將分數初始化為0,最後我們在拾取方塊的時候,把count的數值加1。現在我們有了變數來記錄分數,但是我們還沒有顯示給玩家,所以我們需要一個UI來顯示分數,我們建立一個文本UI(Text),然後我們調整Text的位置至螢幕的左上方:

 

 接下來我們再次修改PlayerController,如下:

(1)、在代碼最前面,我們需要引入UnityEngine.UI,只有這樣後面代碼才會識別Text類型的變數

(2)、然後我們在定義countText變數來儲存UI Text

(3)、接著我們在Start方法中調用setCountText方法,來更新countText的內容

(4)、然後我們在每次球體碰到方塊的時候,也需要更新countText的內容

(5)、最後是我們定義的setCountText方法

然後我們儲存代碼,回到Unity編輯器裡面,將Text拖入到Player裡面的Count Text屬性:

做完這些,我們就可以運行遊戲,看到效果了!

七、發布遊戲

遊戲到這裡我們就告一段落了,接來下我們可以嘗試將遊戲發布,Unity發布遊戲非常簡單:

(1)、首先選擇File->Build Settings

(2)、我們選擇PC平台,然後點擊Switch Platform

(3)、我們點擊Add Current按鈕,將當前遊戲情境加入進去

(4)、點擊Build按鈕,然後選擇儲存路徑,就可以完成發布了

最後我們找到儲存路徑下產生的檔案,點擊exe檔案,就可以運行遊戲了。

 

 

Unity-2017.2官方執行個體教程Roll-a-ball(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.