前言
Unity官方教程 2D UFO 原版視頻教程地址,點我點我
抱著總結和方便回顧的念頭把Unity官方教程寫一遍。朋友—Zui,兩年前寫的球球和飛機非常精彩,我乃是繼承他的“遺風”(→_→)。
這個2D UFO游戲個人認為是Roll-a-Ball的2D版,實現起來更加簡單,更適合新手入門。官方視頻未知所用Unity版本,現在Unity最新的版本是Unity 2017,部分界面和實現方式已經有差異。
電腦環境:Windows10
Unity版本:2017.2.0
腳本/代碼編輯器:Microsoft Visual Studio Community 2017 15.4.4 (裝Unity的時候帶上的)
你將學會操作什么?
- 如何創建一個新的項目(Project)
- 如何下載資源包(Asset Store)
- 如何添加基本的游戲對象(GameObject)
- 如何給游戲對象添加腳本(Script)
- 如何制作預制件(Prefab)
- 如何實現計分板和游戲結束提示(UI Text)
- 如何發布游戲(Build)
一、創建一個新的項目(New Project)
第1步:通過菜單欄File-->New Project打開創建新項目對話框
第一次安裝unity的同學打開軟件的時候默認就是創建新項目對話框頁面。
第2步:確定項目名稱、存放路徑和游戲模式
- Project name:項目名稱
- Location:項目存放路徑,可選擇電腦任意目錄(不會放C盤吧?(?Д?)ノ)
- 3D/2D:在這里我們當然選擇2D
最后點擊 Creat project 按鈕創建新項目。
第3步:調整項目視圖布局
有可能你創建出來的項目視圖布局和上圖不一樣,可以編輯右上角Layout按鈕來改變布局。上圖布局是Tall(可以通過鼠標調整每個窗口寬度)。其他模式可以自行選擇體驗。
二、 從Asset Store下載素材資源包
為了方便我們跟隨視頻學習,Unity官方已經提供2D UFO游戲的所有素材供我們免費下載——Unity Asset Store。
第1步:通過菜單欄Window-->Asset Store按鈕打開資源商店
第2步:查找和下載資源包
資源商店窗口默認會在Game窗口右側展開,在Search搜索欄輸入游戲名字并回車,找到游戲后點擊標題打開詳情頁,點擊藍色按鈕Download確認下載。
第3步:導入資源到本地打開的項目
下載完成后會提示是否Import到項目內,點擊Import按鈕會打開導入資源選擇頁面。默認全選,無需改動,點擊右下角的Import按鈕即可。
導入完畢之后關閉Asset Store頁面,回到編輯器主界面,可以看到Project窗口下的Assets文件夾多出了三個文件夾_Completed-Assets、Sprites、TutorialInfo。本教程中,除了Sprites,其他沒有用武之地?(?????)?。
三、創建第一個游戲場景(Scene)
第1步:創建一個文件夾存放場景文件
Unity中,游戲場景、腳本、預制件、美術等所有資源文件都放在Assets文件夾下。游戲越復雜文件可能就越多,如果不對這些資源文件合理進行分類的話,那么查找和管理起來就非常困難。所以在學習Unity的過程中要有意識地培養自己合理分類資源文件的習慣,這點不要忘記!那現在就開始創建一個Scenes文件夾來存放游戲場景文件吧~
創建辦法有3種:
- 菜單欄Assets-->Create-->Folder
- Project窗口下的Assets文件夾右鍵快捷方式創建
- 左鍵選中Project窗口下的Assets文件夾,點擊Project正下方Create右側小三角,選擇Folder。
第2步:保存場景文件到Scenes文件夾
通過菜單欄File-->Save Scenes(快捷鍵Ctrl+S)保存場景文件,記得是保存在Scenes文件夾,我們命名主場景文件為Main。
可以看到,Hierarchy窗口下出現了Main場景。
四、添加游戲對象——背景(Background)
有了游戲場景,我們就可以開始在場景中添加一些我們需要的游戲對象了。首當其沖需要添加的是游戲背景,也就是UFO背后那張棋盤。選中Sprites文件夾,鼠標左鍵按住Background文件不動,拖到Hierarchy窗口空白處松開。
可以看到,Hierarchy窗口下新增了一個Background游戲對象。新增游戲對象之后最好進行重命名(更好地說明它的作用),重命名有2個方法:
- 左鍵點擊選中要改名的GameObject,稍微等一會,再左鍵點擊一下,進入編輯改名狀態。和平時修改電腦文件名字是一樣的~
- 選中要改名的GameObject,在右側的Inspector窗口下方名字欄處修改,改好回車。
在這里我們不改名( ? ?ω?? )? Background這個名字挺好的。
接下來要做一件很重要的操作(官方和Zui強力推薦)——重置(reset)游戲對象的Transform屬性:在右側的Inspector中找到組件Transform,點擊它右上角的小齒輪,選擇reset選項,如下圖:
官方建議我們每次新增GameObject之后都進行雙標動作:改名和重置Transform。改名是方便解釋對象的作用,重置是讓游戲對象的位置回到原點,避免因為不在原點產生一些詭異的事情。
背景添加成功之后,可以看到Scene窗口的背景不完全可見,鼠標滾輪控制縮放,鼠標左鍵拖動,調整到Scene窗口可以看到完整的背景,方便后續操作。
鼠標切到Game窗口,背景圖片看起來還是很大,無法窺得全貌,這是由于正交攝像機的Size太小,可視范圍太少。鼠標選中Main Camera游戲對象,在Inspector內的組件Camera找到Size,把它的數值改成28(可以根據自己的窗口大小來調整這個數值)。
Tips:鼠標放在Size輸入框前面一點,出現左右兩個箭頭的時候,按住鼠標左鍵上下移動可以微調數值。其他有輸入項的都可以使用這個操作~
五、添加主角——UFO
前面都是浮云,到現在為止我們的游戲主角終于要登場了,淚流滿面(;へ:)……添加UFO和Background的操作是一樣的,在Sprites文件夾里面把UFO拖到Hierarchy窗口即可。添加完GameObject不要忘記雙標動作了,這次我們把UFO重命名為Player,因為它就是我們玩家所能操控的對象。
這個主角有點太胖了,格子都裝不下了,讓我們給它減減肥。選中Player,把Transform的Scale內的x和y都改成0.75(2D游戲不用改z)。看,格子這么合身!
Transform屬性說明:Position位置,Rotation旋轉角度,Scale縮放比例。
在Player的Inspector窗口下有一個組件Sprite Renderer,有一個選項Sorting Layer,它控制渲染層級的順序。在這里我們需要把UFO也就是player的這一項改成Player,然后把Background的改成Background。很繞→_→ 這個改了之后,背景就不會蓋在上面擋住UFO了~
六、讓UFO走起——添加剛體(Rigidbody2D)和腳本(script)
UFO死氣沉沉地一動也不動,我們總不能干瞪著眼看它,這樣不叫游戲。那么接下來就該讓它走起來了~它不會無緣無故地走起來,需要我們去給它施加一個物理作用力,控制它往我們指定的方向走。這就涉及到物理引擎的控制了,具體我們接下來看怎么實現吧。
第1步:給UFO添加剛體組件
剛體能讓UFO被物理引擎所控制,這樣便能模擬現實,通過受到物理作用力來實現真實的物理表現效果比如移動和碰撞,方便后續實現拾取金幣和撞墻。
給UFO添加剛體組件的2種方法:
- 選中Player,通過菜單欄Component-->Physics 2D-->Rigidbody 2D添加。
- 選中Player,通過Inspector的Add Component-->Physics 2D-->Rigidbody 2D添加
第2步:給UFO添加腳本組件
OK,現在UFO有剛體了,它可以接受物理作用力了,那么如何給它發出指令讓它走起來?通過給UFO添加腳本并且編輯腳本可以實現對它的操作。
不過,首先我們要意識到,腳本也是資源文件,所以是需要存放在Assets文件夾里面的。還記得之前提過的資源分類嗎?在Assets下創建一個Scripts文件夾,用來存放所有的腳本文件。
給GameObject添加腳本的方法是選中GameObject(也就是我們的主角Player),點擊Inspector窗口的Add Component按鈕,在彈出來的菜單中選擇New Script
此時要求輸入腳本名稱和選擇語言類型,這里我們將腳本命名為PlayerController,然后語言選擇C Sharp。
點擊Create and Add后,我們就成功給UFO添加一個腳本組件了。接下來你們肯定以為要編輯腳本了對不對?NO,NO,NO(賤笑.jpg)。點擊Assets文件夾,可以看到文件夾內出現了一個名為PlayerController的腳本文件。由此我們知道,每次給游戲對象新增的腳本文件默認是放在Assets文件夾。根據資源分類原則,要先記得把這個腳本文件拖到剛才創建的Scripts文件夾內。
然后通過雙擊這個腳本文件,或者點擊腳本組件右上角的小齒輪按鈕,在彈出來的菜單中選擇Edit Script便可打開腳本編輯器了。
第3步:編寫腳本
下面沒有編程經驗的同學,可以直接按照例子來抄寫代碼,以后做的多了自然也就容易理解了。
新打開的腳本是這樣的:
里面默認自帶了2個方法,Start和Update,Update在這個例子里用不到。我們添加一個FixedUpdate的方法,該方法主要適用于處理物理邏輯,代碼如下:
簡單說明下:
- 新增了兩個變量成員,rb2D是剛體組件,speed是控制UFO移動的速度。
- Start方法劃線部分,用GetComponent方法獲得當前腳本所掛載的游戲對象(Player)里的剛體組件并且賦值給rb2D
- FixedUpdate方法,定義了兩個浮點變量分別代表鍵盤水平和垂直方向的輸入,根據這兩個值確定移動二維向量movement,最后由剛體rb2D調用AddForce方法給UFO添加一個力使其移動。
Tips:腳本新增的Public變量成員,會在Unity編輯器中腳本組件內顯示并且可以修改賦值,比如此例中的speed。
OK,現在回到Unity,把Speed改成10,然后運行游戲,激動人心的時刻要到了!
咦?為什么UFO在做自由落體運動?尷尬ヾ(??﹏?)??......前面提到,剛體能讓UFO處于物理引擎控制之下,所以添加了剛體的UFO是可以受到物理作用力包括重力的!那怎么樣讓它不受重力影響呢?把Rigidbody2D組件的Gravity Scale項的數值改成0就可以了。
現在再運行游戲,UFO不會再自由落體了。按WASD或者方向鍵試試,可以看到UFO走起來的效果了。修改Speed的值可以改變速度哦。
【擴展補充】
好的習慣:
- 每創建一個GameObject 就進行雙標動作:改名、reset Transform
- 每新建一個Script,先拖入到scripts文件夾再編輯
- Script編輯完畢之后,如有新增的public成員變量,要記得在Inspector該腳本下該選項填充數值,或者把對應對象內容拖入到框內。
Q&A:
Q1:Game窗口里面棋盤外面區域是一片藍色,怎么修改成自己想要的顏色?
A1:選擇Hierarchy窗口內的Main Camera,在右側Inspector的Camera組件內修改Background背景色即可。同學可以把RGB設置成75 75 75,灰色調和Scene窗口一致。
Q2:在腳本里面,Update()和FixedUpdate()有什么不同?為什么在這里我們要使用FixedUpdate()?
A2:Update() 和 FixedUpdate()在游戲中的作用是都會在更新的時候自動循環調用。他們的區別主要就是
Update()是在每次渲染新的一幀的時候才會調用,也就是說,這個方法被調用的頻率和設備的性能有關。性能好的機器上fps高,同樣的時間傳輸的幀數多,Update被調用的次數多,而性能差的機器就相反。這會導致同一個游戲在不同的機器上效果不一致,有的快有的慢。
FixedUpdate()是在固定的時間間隔執行,不受游戲幀率的影響,所以非常適用于處理物理邏輯。因此人們處理Rigidbody的時候經常使用FixedUpdate()。
Q3:那Start()是什么鬼?
A3:游戲初始化的時候調用Start方法,后續不會再調用。而Update之類的都是反復根據他們的規則在調用執行~