最近在研究Unity 3D,看了老外Marin Todorov寫的教程很詳細,就翻譯過來以便自己參考,翻譯不好的地方請多包涵。
如果你不了解2.5D游戲是什么,它基本上是個3D游戲而你可以想象是壓扁的,所以游戲是只是沿着2D軸。
一些好的例子是:Super Mario Brothers Wii, Little Big Planet, or Paper Monsters.
一個很好的方法去做2.5D游戲或者3D游戲,是通過一個流行,簡單和價格實惠的游戲開發工具叫做Unity。
所以在這個教程系列里面,我打算讓你看到怎么使用Unity去創作一個簡單的2.5D游戲叫做“Shark Bomber!”
教程目標:
如果你是剛開始接觸Unity,但喜歡學習它,這個教程就針對你。你可以從頭開始一步一步學到怎么去創作一個簡單的游戲。
在這個游戲中,你可以控制一個小的但是全副武裝的飛機,你的工作是去轟炸邪惡的鯊魚,保護那些可愛的小丑魚。
Unity 不使用 Objective-c,所以對與這個教程,你不必具備任何Objective-C 經驗。然而有面向對象語言的經驗是加分的,理想的是 C#,Java,or Actionscript.
請記住,這個是一個Mac環境下開發的用戶教程,windows用戶可能無法精確找到相關設置。所以,請記住,你將只能在ios設備上做測試而不是模擬器。所以一定確保你有一個ios設備。
OK,讓我們潛入Unity,但是確保避免那些鯊魚!
安裝 Unity
首先讓我們安裝這個Unity 工具,如果你已經在你的mac下安裝了就可以跳過此步。
可以參考之前寫過的博客的前半部分:
http://www.cnblogs.com/jiangshiyong/archive/2012/06/20/2555731.html
重要提示:本教程中,您需要選擇“Start Pro / iOS Trial”選項,這樣你就可以發布到AppleStore(而不是簡單的“免費”選項!),或者在破解下只能學習使用,不能發布到AppleStore。
注冊完成后,Unity啟動,你應該看到一個窗口,看起來像這樣:
關閉“Welcome to Unity”彈出框,去到File>New Project,選擇一個磁盤上的某個文件夾並命名項目SharkBomber。確保所有的包都取消選中,然后單擊“創建項目。
現在你面對一塊空白的面板。哇,有很多的按鈕,是吧?不要擔心 - 在下一節中,我們會一點一點去了解它們。
1.Unity 編譯器 介紹:
讓我們做一些額外設置,從一個已知配置里面得到一些東西。
在應用程序窗口頂部的右上角你會發現一個選擇框Layouts,從列表中選擇“Tall”.這將重新排列窗口的內容(默認是"Wide"僅供參考)。
現在找到左上角的欄(及在工具欄的下方),叫“Game”,拖動它到底部窗口附近直到你看到它將撲捉到底部的跡象,就把它拖到那吧。
現在你應該看到下方圖片上的布局:
讓我們快速過一下這些不同的面板:
1.Scene:在這里你可以到處移動你的3D模型,可以瀏覽你的3D世界。
2.Game:這就是你所選的攝像機(主攝像頭)看到的實時畫面直到你使用編譯器。以及當你點擊“Run”時
你的游戲運行,你可以測試你的游戲。
3.Hierarchy:你的對象樹(例如很像HTML DOM),目前你只有一個攝像頭,但我們之后會添加一些東西。列表中的對象目前在現場。
4.Project:這是你項目中的內容,你的資產,音頻文件,一切你現在或以后將要使用到的內容。
5.Inspector:這里你可以看到在場景中所有選定的屬性,你可以調整它們。Unity的獨特之處是,當你運行你的場景時候,Inspector是活動的,所以它也是你的調試工具。
6.Toolbar:這里,你有這些工具來交互在你的場景中的對象,運行和暫停按鈕來測試你的場景,
在你的Unity3D項目中,你可以有許多不同的場景,你可以在它們之間進行切換。目前,你有一個空的場景在編譯器中打開,讓我們把它保存下來。
1.在Project面板中單擊右鍵,選擇“Create>Folder”- 一個新的文件夾出現了。
2.把它重命名為“Scenes”- 你可以通過左鍵單擊文件夾名稱或通過選擇文件夾然后按下“Enter”鍵。
3.現在,你在主菜單上選擇“File/Save scene”-導航保存對話框到【你的項目目錄】/Assets/Scenes下
把這個場景命名為“LevelScene”.
OK - 完成。讓我們來看看 - 在Project面板中打開Scenes文件夾 - 有你的LevelScene場景。爽!
現在,我們開始准備運行游戲-點擊上面的Play按鈕!沒有太大變化-但事實上你的游戲已經在Game面板中運行了!不要忘記停止該游戲,再次點擊Play按鈕(這一點很重要!)。
2.設置一個iPhone Unity3D的項目
關於Unity的優點之一是它可以為iPhone ,Mac,Wii和其它平台開發游戲。在本教程中,我們將建立一個iPhone游戲,所以我們需要先設定一些細節。
從菜單欄中,選擇“File>Build Settings”,然后點擊“Add current”按鈕來為你的項目添加目前所選的場景。添加后你可以看到它得到一個序列為0的編號,這意味着它是游戲開始時第一個要加載加載的場景。這正是我們想要的。
從Platform列表中選擇IOS,然后點擊“Switch platform”按鈕。Unity 的logo現在就出現在Ios一行上。
這是我們所需要的所有設置,單擊“Player settings”,然后關閉這個彈出窗口。你會注意到這個Player setting 在Inspector面板中打開,我們也需要在這里設置幾項事情。
在Inspector面板下的這個“Per-Platform Settings”,確保選擇卡中顯示一個 iPhone圖標選中,如下:
這里有很多設置,你從Xcode中了解過它們中的大部分,所以你一會可以自己探索和玩。
現在使用這個Inspector進行以下更改:
1.在這“Resolution and Presentation”項下,“Default orientation”(默認方向)選擇“Landscape Left”。
2.在這“Other settings”項下,“Bundle Identifier” 輸入框中填入你想填任意內容(除了給出的默認內容)。
3.在這“Other setings”項下,設置“Target Device” 為 “iPhone only”。
最后一觸摸:在左下方,這個“Game”標簽下,你有不同的方向/決議去選,-選擇“iPhone Wide(480*320)”來匹配默認的橫向布局。
如圖,紅線圈住的就是這些設置:
恭喜,你現在有了一個基於“Hello World”的項目,你可以嘗試在你的iPhone上運行。
3.在你的iPhone上運行游戲
為了測試到現在為止我們所做的一切,我們打算在Xcode和你的iPhone上完成測試這個項目。
啟動你最喜愛的Xcode版本 - 關閉歡迎界面如果有一鍵切換回Unity.這是一招Unity如何分辨
用哪個Xcode版本,-只需要運行它。
回到Unity,從菜單欄中選擇“File>Build&Run”,這將再次彈出這個Build Settings,點擊“Bulid
and Run”按鈕。
你會問你在哪里保存你的Xcode項目。在你的項目目錄里面創建一個名為“SharkBomberXcode”文件夾,
(這是你Xcode的東西駐留的地方),作為一個文件名放在“SharkBomber”.
過幾分鍾后這個項目被編譯,你將有一個Xcode窗口打開的叫做 Unity-iPhone的項目。Unity已經生成了
Xcode項目源代碼,你現在可以把這個生成的項目通過Xcode編譯和運行。
你可能想看看源代碼 - 但它實際上是一個導入一些框架的樣板,包括一些dll 文件和一些assets(資源文件)
,所以沒有太多你可以玩的。
你有兩個目的,所以確保你的ios 設備是插入的,並且選擇“Unity-iPhone” target和你的設備。(我不能
在模擬器上運行,如果你夠偉大,但現在我只能連上真機運行),
夢想成真 -點擊Run 按鈕,你的Unity 項目現在運行在你的iPhone上。
干得好,你可以看到Unity的默認啟動畫面,並且藍色背景的場景一角有些字“trial version(試用版)”。
停止運行任務,切換回Unity,並且保存你的項目。
4.設置場景
首先讓我們在scene上設置主攝像頭。在“Hierarchy”面板中選擇“Main Camera”,在Inspector面板中找到
“Projection” 並把它設置成 “Orthographic(正楷)”, "Size" 設置成“10”,在"Clipping Planes " 設置“Near” 為“0.5”,“Far”為“22”。現在你在這個scene里面看到在你的攝像機旁邊有個盒子---這是個界限在這個場景上從你的角度什么將會看到。
請注意我們已經設置相機 “Projection”(投影)為“Orthographic” (正面),這意味着深度坐標不會影響怎么觀看在屏幕上觀看東西--我們將有效地創建一個2D游戲。一會讓我們做一些工作知道你熟悉Unity,然后我們將切換到3D投影。
設置你的相機Position(位置)(在Inspector面板上)x,y,z軸為【0,0,0】,注意從現在開始,當我寫Position(位置)為[x, y , z]時,就是設置這三個屬性的值。
在這個Project 面板中單擊右鍵,然后選擇“Create/Folder”,場景新文件夾“Textures”.然后下載這個背景圖片
http://cdn5.raywenderlich.com/downloads/background.png
我已經把它跟其它一起放在游戲項目中。下載圖片后,拖拽這個背景圖到你剛剛創建的“Textures” 文件夾中,
完成之后, 選中文件夾“Textures”下的“background” texture,並在左邊的“Inspector”面板中觀察這個紋理
(texture)的屬性:在底部Preview面板中會看到“RGB Compressed PVRTC 4bits.”,所以Unity 發現了我們
導入的紋理(圖片)並把它進行了壓縮。
從菜單欄選擇“GameObject\Create other\Plane”,你會看到在攝像機旁邊有一個藍色長方形。
這個是我們剛剛加到場景(scene)中的飛機,我們接下來應用我們已經得到的紋理。
選中“Hieararchy”面板中的“Plane”,在“Inspector”面板中的頂部一個text filed中 的叫“Plane”輸入
“Background”. 這樣操作改變這個對象的名字,這樣就是讓你怎樣重新命名一個對象。有時候不能
命名成功,你需要再點擊下其它的文本框才行。
把這個“background”紋理(texture)從“Project”面板中拖拽到"Hierarchy"面板中的“Background”
對象上。在“Inspector”面板中設置這個飛機(剛才的重新命名Background)的位置(position)為
[4, 0, 20],Rotation(旋轉)為 [90, 180, 0],Scale(縮放)為[10, 1, 5],這就是你在“Scene”
面板中面對着相機這個飛機的模型和選擇,這樣這個相機將看到這個飛機作為游戲的背景。
現在,為了清楚地看到我們所擁有的場景,我們需要一些光(就像在現實生活中),在菜單欄中選擇
“GameObject\Create other\Directional Light”,這將會發一些光在你的場景中。在“Hierarchy”
面板中選擇“Directional Light”,並在“Inspector”屬性面板中設置Position位置坐標為【0,0,0】.
現在我們有了所有的設置和場景的背景,現在是時候添加一些對象並讓它們動起來!
5.添加3D對象到場景(Scene)
從菜單欄中選擇“GameObject\Create other\Cube” ,這樣添加一個立方體到你的場景中。這將是這個游戲
的玩家,所以將它重名為“Player”.設置位置為【-15,5.3,8】.你將會看到這個立方體出現在“Game”面板的屏幕
中的左側--這也是我們的飛機開始啟動的地方,並且將要在海面上移動到達屏幕的另一端。
現在讓我們導入飛機模型!我們將使用免費的3D模型 ,Reiner網站上免費發布的 Reiner`s Tilesets(也看看它的模型的許可http://www.reinerstilesets.de/lizenz/)。開始,下載他的飛機模型(http://www.reinerstilesets.de/zips3d/mesh_airplane_linnen.zip)並對其進行內容進行解壓縮。
在"Project"面板里點擊右鍵並選擇"Create/Folder",重命名這個文件夾為“Models”.從你剛才解壓縮的飛機模型文件夾中拖拽文件“airplane_linnen_mesh.obj”,並把它放到“Project”面板中的“Models”文件夾中。
然后右鍵點擊這個“Models”文件夾並選擇“Create/Folder”,並重命名這個新的子文件夾為“Textures”,這里我們可以保存應用到這個模型的紋理文件。拖拽文件“airplane_linnen_tex.bmp”並把它放到最近新建的“Textures”文件夾中。
下一步,在“Hieratchy”面板中選中這個“Player”對象,然后觀看這個右上角的“Inspector”面板,
那個"Mesh Filter"選項過濾器是條狀的設置你的項目對象的幾何(現在它設置一個立方體的幾何形狀);
在子目錄下里面有個叫“Mesh - Cube”的一行,你會發現一個點在中間的小圓圈,並點擊它 ——
這將打開一個彈出窗口,你應該雙擊這個飛機模型,這將改變的的幾何對象為一個飛機。
現在一個精致的細節——飛機看起來有點搞砸了。我沒有3D專家,但我發現了怎樣在Unity中修復它:在“Project”面板中選中“airplane_linen_mesh”,然后在"Inspector"面板中找到“Normals”選項並選擇“Calculate”,然后向下滾動滑動條並點擊“Apply”(應用)按鈕。
酷,現在你在場景中看到一個流暢的飛機!讓我們來使用它的紋理:在你的“Project”面板中拖拽“airplane_linnen_tex”紋理文件,並把它放到“Hierarchy”面板中的“Player”. Unity 自動應用這些紋理到我們的場景中的飛機模型上。
最后給飛機潤色:為“Player”對象設置 Rotation(旋轉)為 [0,90,350],Scale(縮放) 為[0.7,0.7,0.7],這將對這個飛機進行平面旋轉和縮放,使它看起來像剛飛過海面。下面將要使我們飛機飛!
6.使用C#開始Unity3D編程
正如我們已在Unity的Build Settings 對話框中所看到,Unity 可以創建你的項目到一個 Wii game,一個iPhone game,獨立的Mac game,等等。因為U,nity就是如此無所不能的中間層,你只需要一次編程你的游戲。一旦它需要某種或不同的構建就可以將它轉換為特定於平台的代碼。
奇怪的是,在Unity中編程你將使用C#(而非Objective -C!),當Unity生成你的Xcode項目中時,它將C#代碼自動翻譯成特定於平台的代碼。
在“Project”面板中單擊右鍵並選擇“Create/Folder”,重命名這個新的文件夾為“Class”.右鍵點擊這個“Class”文件夾並選擇“Create/C Sharp Script”,並重命名新文件為“PlayerClass”. 在"Project"
面板中單擊右鍵並選擇“Sync MonoDevelop Project” - 這將打開 MonoDevelop IDE- 只是你可以在C#下編程的IDE.
注意:MonoDevelop是從 Linux中移植過來的程序,正如你所看到的用戶界面皮膚,稱為Gnome(侏儒),所以如果它不時地崩潰是正常的,尤其是當你嘗試改變窗口的大小。如果出現這種情況,只需通過點擊“Sync MonoDevelop Project”重新啟動。
以上是MonoDevelop GUI的三大塊:
1.瀏覽你的 MonoDevelop項目-在in Assets/Class目錄下你將會發現 PlayerClass.cs文件。
2.目前開源類概況。
3.編輯區——有一些語法高亮顯示和代碼自動完成功能,將有助於你的編碼。
瀏覽你的項目找到 PlayerClass.cs文件,在編輯器中雙擊打開它。確認類看起來如下:
using UnityEngine; using System.Collections;
public class PlayerClass : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
這個“using”條款包括庫和框架,UnityEngine庫給你些比如能讓你訪問iPhone的加速器,鍵盤輸入和其他方便的東西之類的。
你可以定義自己的新類並繼承MonoBehaviour,它給你提供了很多免費的東西:當給定事件被觸發時你可以覆蓋被回調的一長串清單方法。
只需幾行在你空啟動和更新方法下面 -這是2個重要的事件。
*Start 被調用在你的對象出現在場景的適合,所以你可以進行你的初始化(類似於viewDidAppear:
in UIController)。
*Update 被調用在每當每幀渲染(即可能是30,60或100次每秒,你永遠不知道多久),這里就是做你的動作,游戲邏輯等
現在讓我們卻換回Unity一會。我們要使飛機飛過海,當它在場景的右側消失后而在左側再次出現。讓我們來測量下我們需要將飛機移動到距離左邊什么位置。在"Scene"面板的右上角,你會看到方向軸 Gizmo- 點擊
這個X手柄(它是一種紅椎,我將管它叫手柄):
這個將選擇場景和使它水平朝向你。再次點擊在這個gizmo左邊的手柄--這將旋轉周圍的場景,你可能需要點擊左側的手柄幾次,直到場景看起來像這樣子:
現在你可以使用鼠標在場景中滾動放大/縮小,並讓它在“Scene”面板中適應大小。確保在上方的工具欄中的移動工具被選中,並在“Hierarchy”面板中選擇這個“Player”.
現在你看到一個新的gizmo(發明)出現,連接在飛機上一個綠色和一個紅色的箭頭。現在你可以拖動箭頭軸,它們將使飛機沿着箭頭的方向移動:
你需要做的是點中紅色箭頭(橫軸),並拖拽飛機到右邊知道超出“Game”面板下方。
開始在“Scene”面板中拖動,同時觀看“Game”面板中的表現。把飛機停留在場景可視范圍之外,並觀看它在“Inspector”面板中的position(位置)。position 的X軸應該在“17.25”附近,-所以這是在場景右邊的邊距,你可以拖拽飛機向左移動距離左邊距坐標為“-17.25”,所以我們將使用“18”和“-18”來包裹飛機的飛行。把飛機帶回到原來在場景左側的位置。
切換回 MonoDevelop,在PlayerClass.cs文件中坐如下改變:
//just after class declaration line public float speed; //inside the Update method if (transform.position.x > 18) {
//get new speed speed = Random.Range(8f,12f); transform.position = new Vector3( -18f, transform.position.y, transform.position.z ); } transform.Translate(0, 0, speed * Time.deltaTime);
正如你所猜想那樣,你剛才在你的類中定義了一個公共類屬性叫做“speed”,但是Unity的特別之處是所有的公共類屬性都可通過這個“Inspector”面板訪問!
所以你可以在IDE中設置你類中屬性的值,你可以監視你的屬性值當游戲一邊實時運行時。它是多么的酷啊!
這個“transform”變量是針對每場游戲對象(場景中的一切都是一個游戲對象)處理對象空間位置:旋轉,位置,縮放等的屬性。因此每次Update的調用是為了變換這個對象的位置,一遍它移動到場景的右邊。
我們不能只是每次調用 Update時候設置變量讓這個飛機移動,因為沒有人知道每秒到底有多少次被實際調用。 相反,我們定義速度為每秒為單位,從上次調用更新所進過的時間分離出速度(Time.deltaTime).通過這種方式,對象總是獨立於當前幀速率以相同速度移動。
調用翻轉有三個值--在每個軸上它有翻轉。 你可以注意到 我們移動飛機在z軸上(第三個參數)-我們只能這么做因為我們要在場景中旋轉這個飛機,所以翻轉Z軸把它移動到玩家角度的右側。
查看"if"語句- 我們檢查 如果transform.position.x大於18(為什么?)。如果如果是的話,我們將飛機的位置設置為相同的數值坐標但是“-18”在X軸。我們使用新建Vector3(x,y,z)設置坐標位置--我們將會使用大量的這些vectors為所有的定位;你注意到我們設置一個隨機速度(8~12),這只是讓飛機更隨機的移動變得更有趣一些。
這是我們准備看這個飛機移動!
切換回Unity.從“Project”面板中拖動這個“PlayerClass”文件到“Hierarchy”面板上的“Player”對象上--這樣你就附加一個類到一個游戲對象上。選中“Hierarchy”面板中的“Player”並觀看右側的“Inspector”面板-- 你將會在下方看到一個新的選項出現叫做“Player Class(Script)”,在那里你可以看到新的公共屬性!“Speed”,為它設值“12”。
ok ,准備好了。點擊Play 按鈕!你可以同時在"Scene"和“Game”面板中看到飛機飛來飛去,從右邊飛出從左邊飛回來。同時可以注意到在“Inspector”面板中Position的X軸也是變化的 -它向你顯示在任何給定的時刻飛機在哪。當然飛機飛行的每時每刻速度都是隨機變化的。
一旦大功告成享受愜意時,不要忘記再次點擊Play按鈕停止這個游戲。
需要休息嗎?沒問題-只需要保存你的Unity項目,你可以稍后再開啟。當你帶個一個Unity項目時候,它默認打開一個空的場景。為了加載你正在工作的場景- 雙擊在“Project”面板中的“LevelScene” -現在你可以繼續工作了。
7.跳動的鯊魚
下載並解壓縮鯊魚模型(http://www.reinerstilesets.de/zips3d/mesh_shark.zip)。同樣,拖拽這個“shark.obj”文件到“Project”面板中的"Models"文件夾中,拖拽“sharktexture.bmp”文件到“Models/Textures”文件夾下。
從菜單欄中選擇“GameObject/Create other/Capsule” - 在“Hierarchy”面板中重命名這個“Capsule”對象為“Shark”.
在你的“Project”面板中拖拽“sharktexture.bmp”紋理文件,並把它放到“Hierarchy”面板中的“Shark”上.在“Inspector”面板中的“Mesh Filter”一項中點擊有一點在中間的圓圈,在彈出的窗口中雙擊這個Shark 模型。現在你應該在“Scene”和“Game”面板中看到Shark的幾何形狀。
從“Project”面板中Models/Textures文件夾下拖拽“sharktexture”到“Hierarchy”面板中的“Shark”對象上- 這會給你的鯊魚一個凶殘的嘴和一對邪惡的眼睛!--我已經准備想轟炸它!
確認“Shark”對象被選中,然我我們在"Inspector"面板中設置以下屬性::Position – [20, -3, 8], Scale – [1.2, 1.2, 1.2] –這將把鯊魚正好放到攝像機可見范圍的右側。--它將會從這里朝着場景屏幕的左端開始移動。
現在我們希望這個鯊魚與我們的炸彈相撞(通過爆炸,轟轟轟)。我們希望這個鯊魚的對撞機或多或少的匹配這個鯊魚的幾何形狀。正如你所看到的那樣在場景中的鯊魚里面有個綠色的膠囊形狀(capsule).這個就是鯊魚的對撞機(collider).讓我們用它匹配這個邪惡鯊魚的型體。
在“Inspector”面板中找到這個“Capsule Collider” 並進行如下設置:Radius to “1″, Height to “5″, Direction “X-Axis”, Center to [0, 0, 0].現在你可以考到膠囊對撞機(capsule collider)已經旋轉過並且或多或少的更加匹配鯊魚的型體!
最后,在“Project”面板中的“Models”文件夾下選中“shark”模型,然后在"Inspector"面板中找到“Normals”選項並選擇“Calculate”,然后向下滾動滑動條並點擊“Apply”(應用)按鈕。。
在“Project”面板中單擊右鍵並選擇“Create/Folder”,右鍵點擊“Class”文件夾並選擇“Create/C Sharp Script”,並重命名新文件為“FishClass.”. 在"Project"
面板中單擊右鍵並選擇“Sync MonoDevelop Project”。MonoDevelop(編輯器) 就會彈出來。打開這個“FishClass.cs”文件並在里面添加如下代碼:
using UnityEngine; using System.Collections; public class FishClass : MonoBehaviour { public float speed = 6f; // Update is called once per frame void Update () { if (transform.position.x < -30 || transform.position.x > 30) { //turn around transform.Rotate(new Vector3(0,180,0)); transform.Translate( new Vector3(-10, -transform.position.y + Random.Range(-4,-1),0) ); //get new speed speed = Random.Range(6f,10f); } transform.Translate( new Vector3(-speed*Time.deltaTime,0,0) ); }
}
這和我們所擁有的飛機非常相似。我們有個速度屬性(單位為每秒)並在Update事件中處理我們使用transform.Translate來移動這個鯊魚。
注意這次我使用:
transform.Translate( new Vector3(x,y,z) );
這只是用來演示其中一些方法可以采用不同的參數 -然而分別通過3個值和1個矢量效果是相同的。
現在,讓我們來看看鯊魚當到達屏幕的范圍做什么(-30~30的范圍情況下,所以有一個當鯊魚在屏幕之外的時刻時,你不能很輕易伏擊當它進入時候)。
當鯊魚到底左右邊界時它會轉身朝着邊界移動一下和改變速度。這樣它只是來來回回,連續來回。
調用transform.Rotate(new Vector3(x,y,z)),通過給定的值明顯的繞軸選擇物體,transform.Translate(new Vector3(x,y,z))你上次已經知道了。
很容易!切換回Unity並把這個“FishClass”腳本 放到“Hierarchy”面板中的“Shark”對象上。現在點擊Play按鈕:你可以看到巨大的鯊魚來來回回等待被轟炸。干得好!
8.添加小魚
讓我們做同樣地步驟對我們的小魚對象。我要把它變成一個很好的快速參考列表:
1.下載並解壓ClownFish model.
2.拖拽“mesh_clownfish.obj”到“Project”面板中的“Models”文件夾里,並把“clownfish.bmp”放到“Models/Textures”文件夾下。
3.選擇“GameObject/Create other/Capsule”並在“Hierarchy”面板中重命名這個“Capsule”為“ClownFish”。
4.點擊“Mesh Filter”下的帶圓點的圓圈按鈕,並從彈出框中雙擊這個clownfish幾何體。
5.拖拽這個“clownfish”模型紋理到 “Hierarchy”面板的“ClownFish”對象上。
6.當選中“ClownFish”對象時,在“Inspector”面板中改變以下這些屬性:
- Position to [-20, -1, 7]
- Rotation to [0, 180, 0]
- Scale to [0.4, 0.3, 0.3]
7.從“Project”面板中拖拽“FishClass”腳本文件到“Hierarchy”的“ClownFish”對象上。這將指派相同的通用的fish class到這個clownfish身上。
8.選擇在"Project"面板中“Models”文件夾下的“mesh_clownfish”,然后在“Inspector”面板中找到“Normals”並選擇它的“Calculate”選項,然后滑動到下方點擊"Apply"按鈕。
點擊Play按鈕並觀看發生了什么-- 現在你擁有兩個移動的魚而無需編寫任何額外的代碼!
一切很完美 - 魚類游來游去,飛機海平面飛行。我們需要一些轟炸。
9.設定炸彈
下載並解壓縮這個Can model.同樣,拖拽這個“colourcan.obj”文件到“Project”面板中的"Models"文件夾下並把“cantex.bmp”文件放到“Models/Textures”文件夾下。
從菜單欄中選擇“GameObject/Create Other/Capsule”,重命名這個對象為“Bomb”.從這個 “Mesh Filter”彈出框中雙擊這個炸彈罐幾何體。拖拽“Project”面板“Models/Textures”文件夾下的“cantex”紋理到“Hierarchy”面板中的“Bomb”對象上。 在“Inspector”面板中點擊 “Capsule collider”中的這個按鈕 ,出現彈出框:
在出現的彈出框中,選擇“Reset” - 這種方式 對撞機(collider)將自動分配集合尺寸。酷吧!
接下來選擇“Project”面板“Models”文件夾下的“colourcan”模型,然后在“Inspector”面板中找到“Normals”並選擇“Calculate”選項,然后滑動到下方點擊"Apply"按鈕。
現在讓我們加入一些新的東西!再次選中這個"bomb"對象,並在“Inspector”面板中找到“Capsule Collider”(膠囊對撞機)中選中這個“Is Trigger”復選框!選中這個可以讓炸彈對象與其他對象碰撞是觸發事件。
但要做到這一點,我們還需要分配剛體(Rigid Body)炸彈(至少一個碰撞對象需要有一個剛體) 。從菜單欄中選擇“Component/Physics/Rigidbody”(在“Hierarchy”面板中的Bomb對象必須選中)。
一旦你這樣做,一個新的選項帶出現在“Inspector”面板中叫做“Rigidbody”。取消選中“Use gravity”(使用重力,我們不會利用重力),並勾選上“Is Kinematic”這樣可以控制編程機身。這是所有我們需要啟動的碰撞內容。
10.預制游戲對象
請記住“Hierarchy”面板顯示的是目前場景中有什么,“Project”面板中持有你所有的對象?這不得不做一些事情來達到我們的目標 -- 有多少炸彈裝上飛機,它們將釋放入海。
我們將做什么 ——我們將預制游戲(它將准備設置場景顯示),但是我們不會把它添加到場景,我們要實例化(或者克隆如果你是個科幻小說迷)這個“prefab”(預制)成一個真正的活動場景中的游戲對象。
在"Project"面板中單擊右鍵並且選擇“Create/Folder”,重命名它為“Prefabs”。右鍵單擊“Prefabs”文件夾並且選擇choose “Create/Prefab”.重命名這個新建的prefab為“BombPrefab”。注意這個小立方體的Icon是白色的——這表示一個空的預制。
現在——拖拽“Hierarchy”面板中的"Bomb"到“Project”面板中的“BombPrefab”上。注意這個立方體的icon現在變為藍色——意味着是一個完整的預制,准備被克隆。同樣重要的——現在觀看“Hierarchy”面板——“Bomb”字體變成了藍色——這意味着現在這個對象是一個預制的實例。
現在,我們有自己的炸彈集合,我們並不需要場景中原來的炸彈——右鍵單擊“Hierarchy”面板中的"Bomb"對象並選擇"Delete"。
讓我們Coding! 切換回MonoDevelop編輯器,並打開PlayerClass.cs文件,在“speed”屬性聲明廈門添加:
public GameObject bombPrefab;
你猜到了嗎?在這個屬性中我們將對BombPrefab保留引用並且按照我們的意願行事。注意屬性的類型為“GameObject”,正如我早前說過的那樣游戲中所有的東西都是一個GameObject(很像Cocoa中的NSObject),所以它是安全的為任何事物設置這樣的類型。
現在切換回Unity並選擇“Hierarchy”面板中的“Palyer”對象。正如你期望那樣,在“Inspector”面板中在“Player Class(Script)”下有一個新的屬性“BombPrefab”。讓我們設置它的值:從“Project”面板中拖拽“BombPrefab”到“Inspector”面板中叫“None(GameObject)”上邊——現在這個字段表示BombPrefab預制附加了值。
我們將需要為子彈創建一個C# class,在“Project”面板中“Class”文件夾上右鍵單擊並選擇“Create/C Sharp Script”,重命名為“BombClass”。右鍵單擊並選擇“Sync MonoDevelop Project”——MonoDevelop工具彈出。打開BombClass.cs並用下面代碼替換內容:
using UnityEngine; using System.Collections; public class BombClass : MonoBehaviour { private float ySpeed = -4f; // Update is called once per frame void Update () { transform.Translate( new Vector3(0f, ySpeed*Time.deltaTime, 0f) ); if (transform.position.y < -11) { Destroy(this.gameObject); } }
}
到目前為止這非常類似於我們所做過的一切——我們translate對象的每一幀,當超出屏幕邊界時候做出適當的反應。在這個炸彈的事例中,我們只是要銷毀對象 ,因為我們總是可以從bomb prefab(炸彈預制)中制造新的。
在代碼中注意到 “this”指的是這個C# bomb class,而這個gameObject屬性指的是在場景中的對象,所以我們銷毀在場景中的對象並把它鏈接到所有的組件上。 在第二部分中,我們將會掉的游戲對象的層次結構,當你訪問組件附加到對象的編程。
11.轟炸鯊魚
你一直在等待最后一部分——無極的暴力:
打開PlayerClass.cs文件,在Update方法的末尾添加:
if (Input.anyKeyDown) { GameObject bombObject = (GameObject)Instantiate(bombPrefab); bombObject.transform.position = this.gameObject.transform.position;
}
讓我們解釋這些代碼行::
1.Input是讓你存取鍵盤,鼠標,加速器和觸摸的類。 當一個鍵被按下時 Input.anyKeyDown是 true,這只發生一次。,即按鈕第一次按下時。然后直到另一個鍵被按下時Input.anyKeyDown 再次是 false。anyKeyDown實際上是一個方便的抽象對象——它實際上是true當一個鼠標按鈕被點擊時,或鍵盤按鍵按下或iPhone屏幕上的觸摸點擊。
2.(GameObject)實例化(bombPrefab)是個神奇的線,沖一個預制(prefab)創建一個實例,並將其添加到場景中。
3.最后我們設置炸彈的position位置跟飛機使相同的。
酷——我們創建了我們的炸彈當玩家點擊屏幕時候,它開始往下掉並且超出屏幕時它會自己銷毀。
讓我們嘗試一下它!切換回Unity並點擊Play按鈕——現在如果你在“Game”面板中點擊,你會看到一個炸彈在飛機的位置點上創建。
點擊很多次——很多炸彈被創建。你應該聽到炸彈的聲音。但炸彈降落不下來!為什么呢?你已經能自己找到問題的解決方法嗎?答案稍后公布。
我希望你想通了,但這里的問題是:你尚未分配這個BombClass腳本到這個 Bomb Prefab(預定炸彈身上),這是為什么降落不下來的原因。在“Project”面板中的"Class"文件夾下拖拽BombClass文件到同樣面板下的“Prefabs”文件夾中的“BombPrefab”文件上。在“Inspector”面板中,如果你看到Bomb Class Script框請勾選住。現在再次點擊Play按鈕。
現在還不是十全十美——這些鯊魚當你打它們時不會死。既然我們已經配置了(colliders)對撞機和剛體組件的炸彈,我們只需要添加代碼來響應碰撞。切換回MonoDevelop編輯器中,並添加如下代碼到BombClass類中:
void OnTriggerEnter(Collider obj) { if (obj.gameObject.name == "Shark") { //reset shark obj.gameObject.transform.rotation = Quaternion.identity; obj.gameObject.transform.position = new Vector3(20f, -3f, 8f); Destroy(this.gameObject); }
}
讓我們再次解釋這些代碼行:
1. OnTriggerEnter是個方法調用,當這個剛體附着與另一個剛體碰撞時,第二個剛體作為一個參數傳遞。
2.這里,我們檢查炸彈命中的對象是否是“Shark”;
3.如果這個鯊魚被命中,然后第一對象旋轉復位。
4.第二,我們設置鯊魚回到原來的位置。
5.最后我們調用 destroy this.gameObject方法,使炸彈從場景中消失。
很容易!難道不是嗎?這是所有你需要的——切換回Unity,運行你的游戲! 命中鯊魚消失,新的鯊魚又進來了。
你可以選擇菜單欄 “File/Build&Run”,然后當Xcode彈出框出現,點擊“Run”,現在你擁有了iPhone上的游戲!
源代碼如下:sample project
在本系列的第2部分,我們要提升一下檔次,使這個游戲真的富有挑戰性和樂趣!
如需轉載,請注明翻譯出處 http://www.cnblogs.com/jiangshiyong/p/3074917.html