Unity3D遊戲開發初探

1、預備知識—對象的」生「與」死「

  (1)如何在遊戲腳本程序中建立對象而不是一開始就建立好對象?->使用GameObject的靜態方法:CreatePrimitive()html

  以上一篇的博文中的「指哪打哪」例子爲基礎,在AddForce腳本寫入如下代碼:程序員

 View Code

  其中在CreateCube方法中,使用GameObject.CreatePrimitive方法來建立Cube類型的遊戲對象實例,設置了它出現的座標併爲它增長剛體組件。這裏能夠看下AddComponent方法,它的參數是一個泛型,也就是說咱們在屬性面板中看到的那些組件,例如剛體、音頻源甚至腳本等組件對象均可以經過AddComponet方法來動態地添加。如今來看看在遊戲中點擊鼠標左鍵建立Cube對象的效果:函數

  (2)細心的讀者會發現,當咱們建立了無數個Cube對象以後,計算機的內存佔用率會逐步上升。機智的你確定會想到,適時銷燬建立的遊戲對象,釋放內存資源。不要擔憂,Unity3D爲咱們提供了一個很是方便的方法:Destroy()。這個函數提供了兩個重載:第一個你能夠直接傳遞一個遊戲對象的ID(好比咱們在上個例子中建立了一個Plane,它的ID也爲Plane);第二個你能夠傳遞兩個參數,一個是剛剛提到的遊戲對象的ID,另外一個是延遲銷燬的秒數(也就是說能夠在規定的秒數以後再從屏幕中消失,從內存中銷燬);oop

  下面咱們從新修改一下剛剛的AddForce腳本爲以下代碼:學習

 View Code

  這裏咱們將銷燬遊戲對象的代碼封裝成了一個方法:DestroyGameObject(),它首先經過GameObject.Find方法找到指定ID的遊戲對象,而後調用銷燬遊戲對象的方法Destroy將其銷燬掉,這裏使用了第二個重載,爲其傳遞了一個2秒的延遲時間。也就是說,當咱們點擊鼠標左鍵後2秒,Plane對象纔會被銷燬,咱們的Sphere球體對象便會跌落深淵!如今咱們來看看效果如何:this

  在預覽效果的同時,你能夠觀察左側Hierarchy中的對象列表,Plane在什麼時刻消失了?.net

  好了,預備知識到此結束,如今咱們真正開始CrazySphere(簡稱:CS,聽起來高大上吧,麼麼嗒!)—「瘋狂擊箱子」遊戲的開發之旅!3d

2、瘋狂擊箱子—CrazySphere的實現之路

  既然咱們的「CS」是擊箱子,木有箱子怎麼能行呢!如今,咱們就來建立一些箱子,做爲咱們擊打的對象。orm

  首先,考慮到要初始化的箱子足足有16個,咱們須要在程序中來建立這些箱子,並將它們放在Plane中,組成箱子牆,讓咱們的小球來擊打。htm

  (1)在Hierarchy中Create如下對象:一個Direction Light,一個Plane;將Plane的Position設置爲(0,1,-6),這樣看起來清楚一點;

  (2)準備工做:

  ①在Assets中Create如下文件夾(Folder):一個Images文件夾用來存放貼圖文件,一個Musics文件夾用來存放背景音樂和音效MP3,一個Scripts文件夾用來存放C#腳本文件,見下圖所示:

  ②往Images裏邊導入一些貼圖,我這裏在網上找了幾張憤怒的小鳥的圖片,用來給Plane、Sphere以及Cube對象作渲染材質貼圖,這樣遊戲對象看起來好看一點。(具體的文件請下載附件中的源碼,找到Assets/Images/)

  ③往Musics裏邊導入一首背景音樂和一首音效文件,背景音樂做爲遊戲背景音樂默認且循環播放,音效音樂做爲小球衝擊箱子的音效在小球發出時播放。這裏背景音樂我選擇的是薩克斯經典—回家,是否是很文藝?音效呢,我就上網隨便找了個炮彈發射的音效。(具體的文件請下載附件中的源碼,找到Assets/Musics/)

  而後,選中Hierarchy中的Main Camera,選擇主菜單欄中的Component->Audio->Audio Source,在屬性中的Audio Source塊中選擇導入的背景音樂(這裏是GoHome-Sax),並勾選Play On Awake(是否默認播放)以及Loop(是否循環播放)複選框,咱們在遊戲一開始時就會播放GoHome-Sax.mp3文件。

  最後,按照上面的步湊爲Plane增長Audio Source,將其選擇爲Bomb做爲初始化音效。

  ④在Scripts中Create兩個C# Script,一個命名爲InitScene,另外一個命名爲AutoDestroy。InitScene腳本用於初始化遊戲場景,也就是4*4的箱子矩陣。而AutoDestroy腳本則用於銷燬超出主攝像機可視範圍的遊戲對象,也就是當咱們的小球或被擊中的箱子超出Plane的地面範圍或跌落後就將其自動銷燬。

  (3)首先來編寫AutoDestroy腳本,利用咱們在 預備知識 裏邊學到的自動銷燬對象的方法。這個AutoDestroy腳本是須要附加到須要自動銷燬的遊戲對象上纔會有意義,因此後邊會在初始化場景的主腳本中爲自動建立的對象附加此腳本(利用AddComponent提供的泛型方法)。

 View Code

PS:OnBecameInvisible()方法是Unity3D中自帶的方法,它在具體的遊戲對象在遊戲屏幕上不可見時觸發。你能夠理解它就相似於ASP.NET WebForm中Global文件中的Application_End()事件。這裏,咱們在遊戲對象不可見時,銷燬具體的遊戲對象。注意,這裏銷燬的方法參數是this.GameObject而不是this!

  (4)如今咱們來編寫InitScene腳本,這個是重點!編寫完成後,把此腳本附加到Main Camera對象中!

 View Code

  如今咱們一一來分析這段腳本代碼:

  ①CreateCubes()方法定義了初始化4*4個箱子的實現過程,每循環一次經過CreatePrimitive建立Cube類型的立方體,而後爲每一個立方體設置position座標、增長剛體組件、增長腳本使其可以自動銷燬以及爲其渲染貼圖。

  ②在Update()方法中控制小球朝着鼠標指定的座標發起衝擊:當用戶點擊鼠標左鍵時即刻建立一個Sphere小球,仍然是設置座標、增長剛體組件、渲染貼圖、增長腳本使其可以自動銷燬。這裏須要注意的是,小球的座標應該爲攝像頭的位置,由於小球是從攝像頭飛出去的。而後,經過屏幕座標向世界座標的轉換獲取目標向量,再經過目標所在向量-攝像頭所在向量=方向向量(這裏涉及到向量減法,不明白的讀者能夠看看本文第二篇3D模型基礎,或者去複習下高中向量減法的幾何意義)。最後,爲小球添加一個往鼠標點擊的方向的多大的力,它就會往那個方向去走(這裏是「飛「)。爲了突出效果,這裏還爲小球添加了音效效果,在發出時播放。

  (5)到這裏,一個基本的CrazySphere就能夠實現了,如今咱們來看下效果:可讓小球按照咱們制定的座標發射,發射時還會有炮彈的音效,並且背景音樂一直在循環播放着,一個demo就差很少完成了,是否是很快!

  

  (6)可是你們是否以爲咱們的遊戲背景太單調了,不要緊,Unity3D爲咱們提供了Skyboxes-天空盒子,讓咱們的背景一秒變爲燦爛的藍天!(有關天空盒子的詳細內容請參閱參考文獻中關於天空盒子的介紹,這裏再也不闡述)這裏咱們向場景中添加一個Sunny的天空盒子:

  ①在Assets處單擊鼠標右鍵,選擇Import Package->Skyboxes,在彈出的選擇框中選擇Sunny1的mat、與Sunny1有關的tif資源。這裏注意不要將所有的天空盒子都導進來,那樣文件會很大!

  ②點擊主菜單欄Edit->Render Settings,在右側的屬性欄中找到Skybox Material:

  單機右側的選擇按鈕,在彈出的選擇框中便可看到咱們剛剛導入的Sunny1這個天空盒子,雙機選中它,這樣咱們就讓遊戲背景一秒變爲陽光燦爛的藍天,是否是心曠神怡啊!

  (6)如今,咱們再來看看遊戲效果:是否是變爲藍天啦?這樣,咱們的CrazySphere v1.0就開發好了!

  

3、總結

  經過幾天的Unity3D初探學習,咱們學習了Unity3D的基本知識、3D模型基礎、物理引擎基礎,並綜合這些知識作了一個小遊戲:CrazySphere-瘋狂擊箱子的遊戲,還實現了背景音樂、音效效果的播放,加入天空盒子讓遊戲背景好看。固然,本系列做爲初探,不可能學的很深刻,但至少咱們能夠入門,能夠初步領略到Unity3D的強大魅力以及咱們.NET程序員的學習優點。

  不知不覺之間,已經寫了四篇關於Unity3D的學習筆記了,同時這也是個人第一個系列的博文,對個人博客生涯具備重要的意義,再次感謝給我鼓勵的園友們,讓我做爲一個新人倍感榮幸。另外,本文是基於傳智播客的Unity3D的兩次公開課爲基礎,整理而成的,衷心感謝傳智播客以及楊中科的分享,還有老楊的鼓勵。立刻就要開學了,又要回成都了,苦逼的研究生生涯還得繼續,好想早點畢業啊!被學校派到外邊實習,老師(實驗室指導老師,非個人導師,個人導師仍是蠻不錯的)也不許時發工資,天天還乾的累死累活的。可是,仍是想在此祝願各位園友碼年吉祥,2014越碼越健康

  明天就是我外婆70歲的生日了,在此也祝願她老人家生日快樂,身體健康!

  本文最後會附上本次小遊戲案例的Demo文件供下載,裏面有本次用到的全部素材。另外,該Demo中還使用了GUI自定義了鼠標顯示,將鼠標顯示替換爲一張瞄準星的貼圖,以下圖所示:

參考文獻與資料

  (1)傳智播客Unity3D公開課:http://net.itcast.cn/subject/Unity3D/index.html

  (2)XieXuan2007,《Unity3D天空盒》:http://blog.csdn.net/xiexuan2007/article/details/18401075

  (3)丁小未,《Unity3D開發相似保齡球遊戲》:http://blog.csdn.net/dingxiaowei2013/article/details/9734935

附件 

  Demo文件下載:http://pan.baidu.com/s/1eQzKrdw 

 

做者:周旭龍

出處:http://www.cnblogs.com/edisonchou/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

相關文章
相關標籤/搜索