最近在研究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 发现了我们
导入的纹理(图片)并把它进行了压缩。
从菜单栏选择“GameObjectCreate otherPlane”,你会看到在摄像机旁边有一个蓝色长方形。
这个是我们刚刚加到场景(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”
面板中面对着相机这个飞机的模型和选择,这样这个相机将看到这个飞机作为游戏的背景。
现在,为了清楚地看到我们所拥有的场景,我们需要一些光(就像在现实生活中),在菜单栏中选择
“GameObjectCreate otherDirectional Light”,这将会发一些光在你的场景中。在“Hierarchy”
面板中选择“Directional Light”,并在“Inspector”属性面板中设置Position位置坐标为【0,0,0】.
现在我们有了所有的设置和场景的背景,现在是时候添加一些对象并让它们动起来!
5.添加3D对象到场景(Scene)
从菜单栏中选择“GameObjectCreate otherCube” ,这样添加一个立方体到你的场景中。这将是这个游戏
的玩家,所以将它重名为“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