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

Space Shooter 太空射擊

傳送門

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

前言

游戲截圖

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

  • 如何下載和導入資源
  • 如何設(shè)置游戲視窗大小
  • 添加了飛船和飛船噴射效果
  • Capsule Collider和Mesh Collider的用法

但是我們還沒有為游戲添加任何的操作瓮床,現(xiàn)在還只是一個可以看末购,但不能玩的版本蝇率,所以今天我就讓游戲可以玩起來浅缸!

你將學到什么掂恕?

  • 如何控制飛船移動
  • 如何限制飛船的移動范圍
  • 如何整理公共變量
  • 添加游戲背景
  • 如何創(chuàng)建一個新材質(zhì)
  • 如何讓飛機發(fā)射子彈

一袖肥、調(diào)整攝像機的位置

我們進入Game窗口撮抓,可以看到現(xiàn)在飛船是出于屏幕的正中間的衷畦,對于我們最終的游戲來說栗涂,這不是一個合適的位置,所以我們首先調(diào)整一下攝像機的位置祈争,來改變飛船在屏幕中的位置

這邊其實也可以調(diào)整飛船的位置斤程,來達到同樣的目的,但是讓飛船處于(0菩混,0忿墅,0)的位置扁藕,會利于我們之后的制作,所以本例中我們采用調(diào)整攝像機的位置的方法來實現(xiàn)

我們選中Main Camera疚脐,然后將其的PositionZ值調(diào)整為5亿柑,然后我們看一下飛船的位置,如下:

飛船的位置

這是一個不錯的位置亮曹,接下來我們便可以來實現(xiàn)飛船的移動功能了

二橄杨、控制飛船移動

為了實現(xiàn)飛船的移動,首先我們給飛船也就是我們的Player添加一個腳本(Script)照卦,關(guān)于如何添加腳本請參見Unity官方實例教程 Roll-a-Ball(一)式矫,在這里我們將腳本的名字命名為PlayerController,然后我打開腳本役耕,添加以下代碼:

完整的代碼
  • 首先我們定義了公共的變量speed
  • 然后我們用兩個變量moveHorizontalmoveVertical記錄玩家輸入的方向數(shù)據(jù)
  • 然后我們新建一個Vector3類型的變量movement采转,并且將moveHorizontalmoveVertical分別賦值給movementXZ
  • 最后我們獲取Player的剛體的速度屬性,將movement乘上speed的值賦給它

代碼寫完之后瞬痘,我們保存一下代碼故慈,然后回到Unity編輯器,將speed設(shè)置為10框全,接著運行游戲來檢測我們剛剛的代碼是否起到作用了察绷。如無意外,現(xiàn)在我們可以控制飛船上下左右移動了津辩!

飛船移動

不過現(xiàn)在飛船移動好像不是那么的生動拆撼,我們在給飛船左右移動的時候,讓飛船整個身體傾斜一點喘沿,這樣更加性感闸度,我們再次打開腳本,增加以下代碼:

完整的代碼
  • 首先我們添加一個公共變量tilt蚜印,來設(shè)置飛船傾斜的幅度
  • 然后我們獲取Player剛體屬性的rotation莺禁,將我們移動的速度x值乘上-tilt賦值給rotation屬性

關(guān)于Quaternion的詳細信息有興趣的朋友可以去查閱官方文檔,后面會出專門的文章來詳細講解窄赋,這邊就不做詳細介紹了哟冬,大家只需要知道這句話的作用就是實現(xiàn)飛船左右移動時的傾斜功能

代碼寫完之后,我們保存一下寝凌,然后回到Unity編輯器柒傻,將tilt設(shè)置為5,接著運行游戲较木,我們就可以檢查剛剛的代碼是否起到作用,如無意外青柄,飛船左右移動的時候就會有傾斜效果了

傾斜效果

三伐债、限制飛船的移動范圍

我們實現(xiàn)了飛船移動功能后预侯,會發(fā)現(xiàn)一個問題,就是飛船可以移動到屏幕外面去峰锁,這樣玩家就看不到飛船了萎馅,這不是好的體驗,就像馬航失聯(lián)一樣虹蒋,所以我們需要限制一下飛船的移動范圍糜芳,讓它無法飛出我們的屏幕外

讓我們來思考一下,如何來限制飛船的移動范圍呢魄衅?首先我們飛船的移動范圍峭竣,換句話說就是飛船的Position屬性,而它的范圍呢晃虫,就是我們的屏幕邊界皆撩,由于我們游戲視角是俯視角,飛船的Y軸位置不會變哲银,所以我們只需限制飛船在X和Z軸上的位置即可扛吞,我們在編輯器拖動飛船到屏幕的最左邊,可以看到飛船的X大約在-6左右荆责,我們使用同樣的方法滥比,可以測試飛船在X和Z軸上的范圍分別是(-6,6)和(-3做院,8)盲泛。

接下來我們看看如何在代碼中來限制飛船的位置:

完整的代碼
  • 首先序列化了一個Boundary類,用來保存飛船在X和Z軸上的范圍山憨,也就是xMin查乒、xMax、zMin郁竟、zMax
  • 然后我們定義了一個變量boundary
  • 最后我們獲取飛船的位置屬性玛迄,然后通過Mathf.Clamp來確保飛船在X和Z軸上的范圍處于我們設(shè)定的值內(nèi)

將xMin、xMax棚亩、zMin蓖议、zMax整合到Boundary類里面,是方便分類管理公共變量讥蟆,如下圖:可以通過小三角來收起/展開勒虾,這樣讓公共變量更加整潔


Paste_Image.png

寫完代碼后,我們保存一下瘸彤,然后回到Unity編輯器修然,將xMin、xMax、zMin愕宋、zMax的值分別設(shè)置為(-6玻靡,6,-3中贝,8)囤捻,然后運行游戲測試一下,就可以發(fā)現(xiàn)邻寿,現(xiàn)在飛船無法跑出屏幕外了蝎土,Nice!

四绣否、添加游戲背景

和官方視頻不同誊涯,我們這邊到這一步才添加游戲背景,原因是游戲背景和后面馬上要講到的子彈枝秤,都用到了同一個GameObject——Quad醋拧,所以兩個東西放到一起來講
首先我們新建一個Quad對象,然后進行兩個標準動作淀弹,將名稱命名為BackGround丹壕,新建成功后,我們在Game視窗中可以看到薇溃,沒有任何變化菌赖,為什么呢?我們回到Scene視圖來看一下沐序,Quad到底是個什么東西

Quad

我們可以看到琉用,Quad就是一個類似平面(Plane)的對象,它使垂直與攝像機的策幼,所以我們看不到他邑时,所以我們需要將它在X軸上旋轉(zhuǎn)90°,然后我們就可以在Game視窗中看到了

Paste_Image.png

我們觀察一下BackGroundInspector屬性特姐,由于我只是做背景用晶丘,所以Mesh Collider我們根本不需要,這里我們就將該組件給移除掉

Paste_Image.png

接下來我們將背景圖片資源唐含,直接拖入BackGround里面浅浮,Unity自動為我們生成了一個材質(zhì),此時我們可以看到BackGround變成了如下的樣子:

Paste_Image.png

這就是我們的背景捷枯,額滚秩,作為一個背景,它好像還是有很多問題淮捆,太小郁油、太暗本股,比例失調(diào),所以首先第一步已艰,我們就是將它的大小調(diào)整到合適的尺寸痊末,我們選中背景圖片資源蚕苇,觀察一下他的信息

背景圖片資源信息

我們可以看到哩掺,背景圖片的尺寸為10242048,為了讓圖片比例不會失調(diào)涩笤,我們需要將BackGround*的X設(shè)置為Y一半嚼吞,我們將XY分別設(shè)置為(15,30)

Paste_Image.png

我們可以看到蹬碧,現(xiàn)在BackGround的比例已經(jīng)正常了舱禽,大小也合適,但是圖片還是太暗了恩沽,這是由于我們選中的材質(zhì)渲染模式有關(guān)系誊稚,
我們將Shader修改為Unlit/Texture后,圖片顏色就會變得正常了

**Shader**修改為**Unlit/Texture**

最后一步罗心,作為背景里伯,我們發(fā)現(xiàn)它有一部分將飛船給遮擋了

飛船被遮擋了

所以我們需要將背景往下移動一些,而且由于我們的攝像機是選用的正交模式渤闷,所以背景下移并不會改變他的顯示效果疾瓮,我們將BackGround的Position Y設(shè)置為-10,這樣背景就不會在擋住飛船了

五飒箭、制作子彈

為了視覺效果和邏輯分離狼电,我們首先新建一個空的GameObject,命名為Bolt弦蹂,然后繼續(xù)新建一個Quad肩碟,命名為VFX,將VFX拖入到Bolt下面凸椿,然后我們選中VFX削祈,把它的Rotation X設(shè)置為90,同樣的削饵,作為Quad岩瘦,我們也需要像背景一樣,將一個圖片顯示在上面窿撬,但是启昧,這里我們和設(shè)置背景圖片不一樣,我們使用一種新的辦法來設(shè)置劈伴,首先我們新建一個材質(zhì)

新建材質(zhì)

首先我們選中Create->Material密末,創(chuàng)建一個新的材質(zhì)握爷,命名為fx_Bolt_orange

新建材質(zhì)

然后我們選中剛剛新建的材質(zhì),修改它的Shader模式為Particles/Additive

設(shè)置Shader

然后將子彈的圖片和材質(zhì)關(guān)聯(lián)起來严里,如下圖:

關(guān)聯(lián)子彈圖片

最后我們將我們做好的材質(zhì)拖入VFX中

關(guān)聯(lián)VFX

我們便可看到子彈的效果做好了新啼!

子彈效果

給子彈添加碰撞

一開始我們說了要視覺效果和邏輯分離,所以我們移除VFX中的Mesh Collider組件刹碾,然后給Bolt添加剛體和膠囊碰撞(Capsule Collider)燥撞,同時按下圖設(shè)置他們的屬性:

剛體和膠囊碰撞的屬性設(shè)置

讓子彈飛一會兒

到這里,子彈的視覺效果和物理屬性我們都已經(jīng)設(shè)置好了迷帜,下一步我們讓子彈可以在發(fā)射后往前移動物舒,如果子彈不能移動那還怎么打到人呢?
所以我們給Bolt添加一個新的腳本戏锹,命名為Mover冠胯,然后打開并編輯它,如下圖:

完整的代碼
  • 首先我們定一個公共變量speed用來調(diào)節(jié)子彈飛行的速度
  • 然后我們在子彈生成時賦予它一個往前的速度

寫完代碼后锦针,我們保持一下荠察,然后回到Unity編輯器,將speed速度設(shè)置為20

制作成Prefab

做完子彈的所有準備工作后奈搜,我們將Bolt制作成一個Prefab(預制件)悉盆,方便以后使用

制作成Prefab

最后我們邊可以運行一下,看到子彈飛出去的效果了

子彈飛行效果

六媚污、飛船發(fā)射子彈

現(xiàn)在我們有了飛船舀瓢,有了子彈,下一步就應(yīng)該把它們聯(lián)合起來耗美,讓飛船可以發(fā)射子彈京髓,那么開始之前,我們思考一下商架,要實現(xiàn)飛船發(fā)射子彈的功能堰怨,我們需要一些什么?

  • 首先我們要知道子彈從哪里發(fā)射
  • 然后我們需要檢查用戶按鍵蛇摸,來接受發(fā)射信號
  • 然后我們需要設(shè)置子彈發(fā)射的頻率
  • 然后我們還需要知道如何生成一個子彈

我們一個個來看

設(shè)置子彈發(fā)射點(Shot Spawn)

在實現(xiàn)子彈發(fā)射之前备图,我們將場景中現(xiàn)有的Bolt刪除,因為我們不需要他了

首先我們新建一個空的GameObject赶袄,命名為Shot Spawn揽涮,作為飛船的一個武器掛載點,確保所有的子彈都是從這個點出發(fā)饿肺,然后我們把Shot Spawn拖入到Player下面蒋困,并調(diào)整Shot Spawn的位置到合適的點,本例中置為飛船前方就可以了敬辣,如下圖:

發(fā)射點的位置

實現(xiàn)發(fā)射功能的代碼

然后我們打開PlayerController腳本雪标,新增以下代碼:

完整的代碼
  • 首先我們定義一個私有變量nextFire零院,用來記錄下一發(fā)子彈的時間
  • 然后我們定義一個公共變量fireRate,用來控制子彈發(fā)射的間隔時間
  • 接著我們定義一個公共變量shot村刨,用來保存我們發(fā)射的子彈Prefab告抄,也就是告訴程序,我們發(fā)射的是哪個子彈
  • 然后我們定義一個公共變量shotSqawn嵌牺,用來保存子彈的發(fā)射點打洼,也就是告訴程序,子彈從哪里發(fā)射出去
  • 接著我們在Update函數(shù)中髓梅,判斷用戶是否有按下Fire1鍵拟蜻,這邊的Fire1鍵就是鍵盤上的左Ctrl鍵和鼠標左鍵,同時當前時間超過我們下一發(fā)子彈所需的時間枯饿,換句話來說,這個if的作用就是確保我們武器沒有在冷卻時間時按下發(fā)射鍵诡必,才會發(fā)射子彈
  • 當if條件通過后奢方,我們先記錄下一發(fā)子彈的時間,然后通過Instantiate方法生成一發(fā)子彈爸舒,他有3個參數(shù)蟋字,一個是發(fā)射的對象,一個是發(fā)射對象的position扭勉,一個是發(fā)射對象的rotation

寫完代碼后鹊奖,我們保存一下,然后回到Unity編輯器涂炎,并分別設(shè)置我們剛剛定義的幾個公共變量忠聚,如下:

設(shè)置公共變量

所有操作做完后,我們邊可以運行游戲唱捣,看看實際效果了两蟀!

發(fā)射子彈效果

下集內(nèi)容

在下一集,我們將學會:

  • 如何回收子彈
  • 如何創(chuàng)建障礙物
  • 如何通過代碼創(chuàng)建無盡波數(shù)的障礙
  • 如何實現(xiàn)子彈擊碎障礙功能
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末震缭,一起剝皮案震驚了整個濱河市赂毯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拣宰,老刑警劉巖党涕,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巡社,居然都是意外死亡膛堤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門重贺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骑祟,“玉大人回懦,你說我怎么就攤上這事〈纹螅” “怎么了怯晕?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缸棵。 經(jīng)常有香客問我舟茶,道長,這世上最難降的妖魔是什么堵第? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任吧凉,我火速辦了婚禮,結(jié)果婚禮上踏志,老公的妹妹穿的比我還像新娘阀捅。我一直安慰自己,他們只是感情好针余,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布饲鄙。 她就那樣靜靜地躺著,像睡著了一般圆雁。 火紅的嫁衣襯著肌膚如雪忍级。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天伪朽,我揣著相機與錄音轴咱,去河邊找鬼。 笑死烈涮,一個胖子當著我的面吹牛朴肺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跃脊,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼宇挫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酪术?” 一聲冷哼從身側(cè)響起器瘪,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绘雁,沒想到半個月后橡疼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡庐舟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年欣除,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挪略。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡历帚,死狀恐怖滔岳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挽牢,我是刑警寧澤谱煤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站禽拔,受9級特大地震影響刘离,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜睹栖,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一硫惕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧野来,春花似錦恼除、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搪锣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彩掐,已是汗流浹背构舟。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堵幽,地道東北人狗超。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像朴下,于是被迫代替她去往敵國和親努咐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容