傳送門
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疚脐,然后將其的Position的Z值調(diào)整為5亿柑,然后我們看一下飛船的位置,如下:
這是一個不錯的位置亮曹,接下來我們便可以來實現(xiàn)飛船的移動功能了
二橄杨、控制飛船移動
為了實現(xiàn)飛船的移動,首先我們給飛船也就是我們的Player添加一個腳本(Script)照卦,關(guān)于如何添加腳本請參見Unity官方實例教程 Roll-a-Ball(一)式矫,在這里我們將腳本的名字命名為PlayerController,然后我打開腳本役耕,添加以下代碼:
- 首先我們定義了公共的變量speed
- 然后我們用兩個變量moveHorizontal和moveVertical記錄玩家輸入的方向數(shù)據(jù)
- 然后我們新建一個Vector3類型的變量movement采转,并且將moveHorizontal和moveVertical分別賦值給movement的X和Z
- 最后我們獲取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就是一個類似平面(Plane)的對象,它使垂直與攝像機的策幼,所以我們看不到他邑时,所以我們需要將它在X軸上旋轉(zhuǎn)90°,然后我們就可以在Game視窗中看到了
我們觀察一下BackGround的Inspector屬性特姐,由于我只是做背景用晶丘,所以Mesh Collider我們根本不需要,這里我們就將該組件給移除掉
接下來我們將背景圖片資源唐含,直接拖入BackGround里面浅浮,Unity自動為我們生成了一個材質(zhì),此時我們可以看到BackGround變成了如下的樣子:
這就是我們的背景捷枯,額滚秩,作為一個背景,它好像還是有很多問題淮捆,太小郁油、太暗本股,比例失調(diào),所以首先第一步已艰,我們就是將它的大小調(diào)整到合適的尺寸痊末,我們選中背景圖片資源蚕苇,觀察一下他的信息
我們可以看到哩掺,背景圖片的尺寸為10242048,為了讓圖片比例不會失調(diào)涩笤,我們需要將BackGround*的X設(shè)置為Y一半嚼吞,我們將XY分別設(shè)置為(15,30)
我們可以看到蹬碧,現(xiàn)在BackGround的比例已經(jīng)正常了舱禽,大小也合適,但是圖片還是太暗了恩沽,這是由于我們選中的材質(zhì)渲染模式有關(guān)系誊稚,
我們將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ì),修改它的Shader模式為Particles/Additive
然后將子彈的圖片和材質(zhì)關(guān)聯(lián)起來严里,如下圖:
最后我們將我們做好的材質(zhì)拖入VFX中
我們便可看到子彈的效果做好了新啼!
給子彈添加碰撞
一開始我們說了要視覺效果和邏輯分離,所以我們移除VFX中的Mesh Collider組件刹碾,然后給Bolt添加剛體和膠囊碰撞(Capsule Collider)燥撞,同時按下圖設(shè)置他們的屬性:
讓子彈飛一會兒
到這里,子彈的視覺效果和物理屬性我們都已經(jīng)設(shè)置好了迷帜,下一步我們讓子彈可以在發(fā)射后往前移動物舒,如果子彈不能移動那還怎么打到人呢?
所以我們給Bolt添加一個新的腳本戏锹,命名為Mover冠胯,然后打開并編輯它,如下圖:
- 首先我們定一個公共變量speed用來調(diào)節(jié)子彈飛行的速度
- 然后我們在子彈生成時賦予它一個往前的速度
寫完代碼后锦针,我們保持一下荠察,然后回到Unity編輯器,將speed速度設(shè)置為20
制作成Prefab
做完子彈的所有準備工作后奈搜,我們將Bolt制作成一個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的位置到合適的點,本例中置為飛船前方就可以了敬辣,如下圖:
實現(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è)置我們剛剛定義的幾個公共變量忠聚,如下:
所有操作做完后,我們邊可以運行游戲唱捣,看看實際效果了两蟀!
下集內(nèi)容
在下一集,我們將學會:
- 如何回收子彈
- 如何創(chuàng)建障礙物
- 如何通過代碼創(chuàng)建無盡波數(shù)的障礙
- 如何實現(xiàn)子彈擊碎障礙功能