Unity官方實例教程 Space Shooter(三)

Space Shooter 太空射擊

傳送門

Unity官方實例教程 Space Shooter(一)
Unity官方實例教程 Space Shooter(二)
Unity官方實例教程 Space Shooter(三)
Unity官方實例教程 Space Shooter(四)
Unity官方實例教程 Space Shooter(五)

前言

游戲截圖

Unity官方實例教程 Space Shooter(二)中,我們學會了:

  • 如何控制飛船移動
  • 如何添加游戲背景
  • 如何制作子彈
  • 如何控制飛船發射子彈

學會這些后,我們這個游戲慢慢的有點樣子了,但是如果我們空有屠龍之術,卻沒有敵人給我們來做活靶,也就浪費我們之前做的努力的,所以我們這一節給玩家添加一些障礙吧

你將學到什么?

  • 如何回收子彈
  • 如何創建障礙物
  • 如何實現子彈擊碎障礙的效果
  • 如何實現飛船撞擊障礙的華麗爆炸效果

一、回收子彈

在上一節中,我們可以讓飛船發射子彈了,但是卻遺留下了一個問題,如果細心的朋友,可能會發現,當我們發射了許多子彈后,在Hierarchy窗口,出現了許多Bolt對象

泛濫的Bolt對象

因為在我們現在的游戲功能中,飛船每發射一顆子彈,就會生成一個Bolt對象,但是這個對象會一直存在,所以就會出現Bolt越來越多的情況,而這樣就到導致一個問題,我們游戲內存吃緊,導致游戲越來越卡,所以我們比較做一點什么——回收子彈

大家想一下我們要回收子彈,那么我們應該在什么時候回收子彈呢?子彈一發出來我們就回收,這樣就會達不到敵人了,毫無作用的子彈,比較合理的方式是,在子彈飛出我們的屏幕后,就將他回收掉,那么問題來了,怎么知道子彈已經飛出屏幕了呢?我們可以創建一個盒子,這個盒子大小和我們的屏幕差不多,然后我們可以判斷如何子彈飛出了這個盒子,就意味著子彈飛出了屏幕,這個時候我們就可以通知程序來回收子彈了

所以,我們第一步,創建一個Cube,然后進行兩個標準動作,并命名為Boundary,如下圖:

創建Boundary

然后我們將盒子拉扯到屏幕大小,在這里大家可以選擇自己切換到Game視窗來調整盒子大小,也可以直接選中Boundary將其的Position Z設置為5,然后將其的Scale X和Z分別設置為14和20,然后你就發現這個盒子充滿了整個屏幕

盒子充滿了整個屏幕

看到這里,你可能會說Oh My God!這游戲還能玩?沒錯,這樣的游戲哪能玩呢?所以我們不能讓盒子擋住了我們的背景,我們的飛船等一切的游戲內容,所以我們來看看盒子的Inspector窗口,看看有什么我們來嘗試做一做的:

Paste_Image.png

我們看到一個Mesh Renderer的組件,然后我們嘗試他的勾選去掉,你就會驚奇的發現,所有的游戲內容都出來了,盒子不見了,我們切換到Scene窗口來看看到底發生了什么:

Paste_Image.png

從上圖我們可以看到,盒子的渲染不見了,只剩下綠色線框標記盒子的碰撞,這正是我們想要的效果,所以我們將盒子的Mesh Renderer組件直接刪除掉,因為我們只需要用到他的碰撞,然后我給盒子添加一個新腳本,命名為DestroyByBoundary,然后我們打開腳本,輸入以下代碼:

完整的代碼
  • 我們在這個腳本中,只做了一件事情,就是檢測有子彈飛出這個盒子后,我們就將子彈銷毀掉
  • OnTriggerExit是Unity內置方法,用來檢測對象退出碰撞體時的操作
  • Destroy作用是銷毀一個對象

寫完代碼后,我們保存一下,然后回到Unity編輯器,運行一下游戲,這時候我再不停的發射子彈,就可以看到hierarchy視窗中Bolt對象不一會就會自己消失了,這就代表子彈被我們回收掉了。

被盒子回收的子彈

二、創建障礙

創建障礙的方式和創建子彈很相似,同樣的,為了方便制作,我們將障礙的邏輯和顯示效果分開,首先我們創建一個空的GameObject,命名為Asteroid,然后為了方便測試我們將其的Position Z設置為8(做這個操作之前要記得先進行兩個標準動作哦!)

Paste_Image.png

然后我們給Asteroid添加美術效果,我們在Assets->Models文件夾中找到prop_asteroid_01文件,然后將其拖入Asteroid做其的子對象

Paste_Image.png

然后我們要將prop_asteroid_01Transform進行重置,這樣我們的美術效果就做好了

Asteroid的美術效果

接下來我們要為Asteroid的添加剛體組件,并去掉Use Gravity屬性

Paste_Image.png

然后我們還需要為Asteroid添加膠囊碰撞體,并將碰撞大小調整為合適的大小

這里有個便捷操作,我們在調整碰撞的大小時,可以打開碰撞器的Edit Collider選項,這樣就可以方便的調整碰撞器的大小了

Edit Collider選項

調整碰撞器大小

做完這些后,我們的可以運行一下游戲,
…………
…………
你會發現太無聊了,這個障礙一動不動的,所以接下來我們給他增加一些變化。選中Asteroid,然后給他新建一個腳本,命名為RandomRotator,然后添加以下代碼:

完整的代碼
  • 首先我們定義一個公共變量tumble來設置障礙翻滾的幅度
  • 然后我們在Start函數中,通過隨機數來隨機設置障礙翻滾的速率

寫完代碼,保存一下,然后回到Unity編輯器,將tumble的值設為5,然后再運行游戲,我們便可以看到障礙旋轉起來了

翻滾的障礙

并且我們每次運行,障礙翻滾的角度都會不一樣,但是如果我們運行時間久一點,就會發現障礙翻滾慢慢的停了下來,這是為什么呢?這是由于Rigidbody中的阻力導致的,所以為了讓障礙的翻滾不會停下來,所以我們將阻力都設置為0

設置阻力

三、實現子彈擊碎障礙

為了實現子彈擊碎障礙的功能,我再為障礙新增一個腳本,命名為DestroyByContact,然后我們想一下要實現子彈擊碎障礙的功能,我們要做一些什么?

  • 首先我們需要檢測子彈和障礙是否碰撞
  • 然后如果碰撞了,我們需要創建一個爆炸效果來給予反饋
  • 最后我們還需要將子彈和障礙刪除掉

我們來看看如何用代碼實現上面的事情:

完整的代碼
  • 首先我們定義了一個公共變量,用來設置爆炸的效果
  • 然后我們利用OnTriggerEnter方法來檢測障礙是否和子彈碰撞
  • 如果碰撞了,我們就利用Instantiate方法生成一個爆炸效果
  • 然后我刪除子彈
  • 最后我們將障礙也刪除

寫完代碼,保存一下,然后回到Unity編輯器,接著在Assets->Prefabs->VFX->Explosions文件夾中找到explosion_asteroid文件,然后拖入到我們定義的explosion變量中

拖入explosion

做完這些我們便可以運行游戲,看看效果

游戲效果

額,怎么游戲一開始,還沒發射子彈,障礙就爆炸了呢?這是為什么呢?我們回到Scene視窗來看看到底是什么原因導致

Paste_Image.png

從上面我們可以看到,之前為什么回收子彈,我們創建了一個大盒子,所以游戲一開始,就檢測到障礙和盒子的碰撞,所以障礙一開始就爆炸了,為了避免這種情況,我們需要讓障礙變得聰明一點,讓它能夠區分只有和子彈進行碰撞才會發生爆炸,我們回到DestroyByContact腳本,新增以下代碼:

Paste_Image.png
  • 我們在碰撞中,增加一個判斷,如果碰撞物的tag(標志)是Boundary,我們就什么都不做,直接retrun

寫完代碼,保存一下,然后回到Unity編輯器,再給我的盒子(Boundary)添加一個新的Tag,命名為Boundary,關于如何添加Tag請參見Unity官方實例教程 Roll-a-Ball(二)的相關內容

做完這些,我們再次運行一下,就發現一切正常了

Untitled11.gif

做到這里,或許有細心的朋友會發現,除了子彈碰撞障礙會爆炸外,我們的飛船碰到障礙也會爆炸,但是爆炸的效果都是一樣的,這樣有點太無聊了,所以我們讓飛船碰到障礙來個不一樣的爆炸效果。我們繼續打開DestroyByContact腳本,新增以下代碼:

完整的代碼
  • 首先我們定一個公共變量playerExplosion,來設置飛船爆炸的效果
  • 接著我們在碰撞里面進行判斷,如果碰撞對象的Tag為Player,也就是我們的飛船,我們就在飛船的位置播放一個爆炸效果

寫完代碼,保存一下,然后回到Unity編輯器,將Player也就是我們的飛船的Tag設置為Player,然后在Assets->Prefabs->VFX->Explosions文件夾中找到explosion_player文件,拖入到變量playerExplosion

拖入playerExplosion

做完這些,然后運行游戲測試一下,就會發現飛船碰到障礙會出現一個更加華麗的爆炸

華麗的爆炸

可能有些朋友會出現飛船撞擊障礙沒有效果的問題,可以試著檢查一下是否是關閉了Mesh Collider組件

關閉了**Mesh Collider**組件

下集預告

在下一集,我們將學會:

  • 如何隨機生成一個障礙
  • 如何生成多個障礙
  • 如何設置障礙生成的間隔
  • 如何生成無盡波數的障礙
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容