最近在研究Unity 3D,看了老外Marin Todorov写的教程很详细,就翻译过来以便自己参考,翻译不好的地方请多包涵。

如果你不了解2.5D游戏是什么,它基本上是个3D游戏而你可以想象是压扁的,所以游戏是只是沿着2D轴。

一些好的例子是:Super Mario Brothers WiiLittle 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

使用Unity做2.5D游戏教程(一)的更多相关文章

  1. 使用Unity做2.5D游戏教程(二)

    最近在研究Unity 3D,看了老外Marin Todorov写的教程很详细,就翻译过来以便自己参考,翻译不好的地方请多包涵. 这是使用Unity 游戏开发工具制作一个简单的2.5D 游戏系列教程的第 ...

  2. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

  3. C#开发Unity游戏教程之判断语句

    C#开发Unity游戏教程之判断语句 游戏执行路径的选择——判断 玩家在游戏时,无时无刻不在通过判断做出选择.例如,正是因为玩家做出的选择不同,才导致游戏朝着不同的剧情发展,因此一个玩家可以对一个游戏 ...

  4. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  5. C#开发Unity游戏教程之使用脚本变量

    C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. ...

  6. C#开发Unity游戏教程之游戏对象的属性变量

    C#开发Unity游戏教程之游戏对象的属性变量 Unity游戏对象的属性——变量 通过对上一章的学习,读者应该了解到了,游戏对象上的属性与脚本中的变量,建立联系的方式就是将脚本赋予游戏对象.上一章只是 ...

  7. C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例

    C#开发Unity游戏教程循环遍历做出推断及Unity游戏演示样例 Unity中循环遍历每一个数据,并做出推断 非常多时候.游戏在玩家做出推断以后.游戏程序会遍历玩家身上大量的所需数据,然后做出推断. ...

  8. Unity多玩家网络游戏开发教程1章Unity带有网络功能

    Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件.专门提供了对网络功能的支持. 可是.大部分开发人员第一次接触到的还是Unity自带的网络功能.也就是大家常 ...

  9. 使用Unity创建塔防游戏(Part2)

    How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...

随机推荐

  1. LPCTSTR和CString的关系

    类型理解 LPCTSTR类型: L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都 ...

  2. awk累加

    {a+=substr($14,1,1)}END{a=(a=="")?0:a;print a}' 对a进行累加,如果最后a=0的话,结果为0,否则为a,最后输出a

  3. Gym 100342E Minima (暴力,单调队列)

    3e7暴力,800ms+过,单调队列维护区间最小值. #include<bits/stdc++.h> using namespace std; typedef long long ll; ...

  4. Android(java)学习笔记148:网易新闻RSS客户端应用编写逻辑过程

    1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,bl ...

  5. PWN题搭建

    0x00.准备题目 例如:level.c #include <stdio.h> #include <unistd.h> int main(){ char buffer[0x10 ...

  6. gdb插件使用方法

    0x00 peda peda 安装: git clone https://github.com/longld/peda.git ~/peda echo "source ~/peda/peda ...

  7. java mongodb 增删改查 工具类

    package com.jttx.demo;   import com.mongodb.*; import com.mongodb.util.JSON;   import java.net.Unkno ...

  8. c++ 计算彩票中奖概率

    操作方法: 输入两个数字,第一个数字是备选总数,第二个数字是选择总数,然后返回中将概率. 可以投注多次,结束的时候返回总的中将概率. #include <iostream> using n ...

  9. 【最长连续零 线段树】bzoj1593: [Usaco2008 Feb]Hotel 旅馆

    最长连续零的线段树解法 Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负 责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大 ...

  10. Apache安装错误 APR not found解决方法

    在配置Apache的时候,出现错误 原因是缺少一些依赖包,安装这些依赖包就行了 下载依赖包,注意我这里下载的与参考链接上的有些不同,安装上也有不一样 wget http://archive.apach ...