第一款游戏中,玩家将以第一人称控制一个角色去探索一个环境,并在时间限制结束前收集硬币。如果计时器超时,游戏就结束了。另一方面,如果玩家在计时器到期前收集到所有的硬币,那么他就赢了。控制将使用工业标准的WASD键盘设置,其中W向前移动,A和S向左或向右移动,D向后移动。玩家可以用鼠标控制头部的移动,通过与硬币碰撞来收集硬币
第一章
1.1、Unity资源商店下载标准资源包
- 点击连接https://assetstore.unity.com,进入商店搜索Standard Assets (Unity Asset Store是找到其他开发者制作的资源的好地方,其中有3D模型甚至完整的项目)
- 点击添加至我的资源
- 在unity中可以点击window——》Package Manager中查看(包管理器用于向当前项目中添加包和从当前项目中删除包,记住包只是资源的集合)
从Unity资源商店添加的任何包都会出现在这里(注意:书上这种下载方式很慢,这里有一篇文章介绍的下载方式很快)链接:
Unity 官方标准资源下载(standard assets)2种方式
Unity3D 官方资源包Standard Assets导入
1.2、创建一个场景
场景指的是3D空间,即游戏世界的时空——事物存在的地方。在我们的游戏中,场景代表一个关卡。场景和关卡在这里可以互换使用。在其他游戏中,你可能会发现一个场景包含多个关卡,但在这里,我们将每个场景限制为一个关卡。创建方法1.File | New Scene 2.ctrl+n
1.3、在场景中添加地板
- 打开Standard Assets文件夹,然后访问Prototyping/Prefabs文件夹
- 拖动FloorPrototype64x01x64到场景中
将场景布置成如下模样
在布置场景的时候,可以使用对齐的技巧:1)选中物体,然后按w调出移动工具 2)然后按住v,移动鼠标到物体的某个顶点 3)按住鼠标左键拖动物体,将顶点拖动到要对齐的位置
1.4、增加照明和skybox
启用skybox:skybox是一个围绕整个场景的大立方体。每个内部面都有一个连续的纹理(图像),用于模拟周围天空的外观.
1.5、给物体增加阴影和高光:启用场景照明
场景中的所有对象都是基于光的旋转来照明的,所以通过旋转光对象,你实际上是在改变一天中的时间。Ctrl + Z撤消方向光的任何旋转
为了准备最终和最佳的照明,场景中所有不可移动的物体都应该标记为静态——先选中要所有设置静态的物体(多个物体可以同时设置),然后在Inspector里面勾选Static复选框。当你为几何图形启用静态复选框时,Unity会自动计算背景效果中的场景照明,如阴影、间接照明等,如果物体没有阴影,那应该是关闭了,通过如下步骤启用:选中所有物体——》在Inspector面板找到Mesh Renderer——》Lighting下拉框里找到Cast Shadows——》设置成on
测试游戏
现在我们做出了一个静态的场景,接下来我们将角色被添加到场景中,以第一人称的方式漫游和探索世界。
1.打开Standard Assets/Characters/FirstPersonCharacter/Prefabs 文件夹.
2.找到名为FPSController的资源,添加进场景当中,之后就可以启动项目了(注意,在播放模式的时候可以切换回编辑场景对场景进行编辑,但是在停止播放之后,你在播放期间对场景的修改都会撤销。Ctrl + P轻松停止播放)
1.6、项目的控制台消息
音频监听器(audio listener组件):是附加到对象上的组件,它表示一个耳点。它使我们能够听到场景中的声音。默认情况下,每个相机都附加了一个音频侦听器组件。
控制台窗口是显示任何错误、警告或信息消息的地方。有时,一条消息只出现一次,有时则出现多次。(可以通过window | General | Console手动访问此窗口)
如图指出了一个关于重复音频侦听器的问题,因为我们的场景现在包含两个摄像头,但是Unity不支持在同一个场景中有多个活动的音频监听器。。我们可以删除默认摄像头中的 audio listener组件。如果删除人物中的audio listener组件,那么我们就不能从第一视角听到声音。
1.7、提升场景:
到目前为止我们可以在第一人称视角下四处奔跑并探索环境,但是游戏中岛屿像是悬空的、我们可能走到边缘,掉进一个无限下降,游戏还缺少最重要的收集硬币、。接下来就来解决这些问题。
一、添加水平面步骤
1.打开Standard Assets/Environment/Water/Water/Prefabs文件夹
2.将WaterProDaytime资源添加到场景里面,并且通过设置平面尺寸(X, Z)来扩充,直到远处的地平线。
在运行游戏的时候可以注意到,我们添加的水面是一个摆设(走到水面上会穿过水面无限往下面掉),这是因为Unity不能识别物体是固体还是半固体,但是我们可以通过附加一个Box Collider组件来非常快速地使一个物体固体化,实现步骤:选中水资源,为其添加组件——Component | Physics | Box Collider。
如图所示,当我们给一个物体添加Box Collider组件之后,在水(橘色圆框)的周围会出现绿色的网格,在游戏中我们可以在绿色的框内行走不会无限下掉(方框和圆之间的差集也可以行走)
1.8、添加硬币
使用unity的Cylinder物体,对它进行缩放形成一个硬币形状,通过右键——GameObject | 3D Object | Cylinder进行创建。创建Cylinder(圆柱体)物体带有默认的Capsule Collider组件,当你缩放对象时,碰撞器(Capsule Collider组件)也会改变大小。Collider碰撞器用来检测玩家何时与硬币发生碰撞。做到这里我们可以使用ctrl+s保存场景scenes
第二章
在本章中,我们将完成上一章开始的收集游戏,到目前为止,该项目具有完整的环境、第一人称控制器和一个简单的硬币对象。本章通过使硬币对象可收集和添加一个计时器系统。总的来说,本章将展示以下主题:
1.创建Materials 2.编写c#脚本 3.unity 标签 4.使用粒子系统 5.使用预制
2.1Working with Materials
目前我们的硬币看起来不好看,并且不能收集。本小节先使用Materials改善硬币外观。这里需要注意Materials(材质)和texture(纹理)是不同的,Materials定义了一个表面的光泽或光滑程度,纹理是加载在内存中的图像文件,它可以通过UV映射包裹在3D对象周围。材质定义了如何将一个或多个纹理组合并应用到对象上以塑造其外观
2.2、创建硬币材质
1.Assets下面新建立一个Materials文件夹,然后Create|Materials创建一个材质。
2.然后就在Inspector里面设置材质的属性,首先就要设置Shader属性,该属性决定了使用哪种算法来给对象着色。这里我们Shader选择Standard
3.通过Albedo属性设置材质的颜色,然后设置Metalic的值为1(表示全金属表面)
4.将这个创建好的材质拖拽到硬币上面(或者拖拽到硬币Inspector|Materials|Mesh Renderd)。Mesh Renderer组件包含一个Materials字段,它列出了当前分配给对象的所有Materials。
2.3、unity中编写脚本
脚本中有两个自动生成的函数:Start和Update。Start被调用一次(且只调用一次),Update每帧被调用一次。我们创建好一个脚本之后就可以通过拖拽把它添加到物体上面。
2.4 colliders(对撞机)
现目前,我们的FPSController物体已经有一个碰撞器,它包含在FPSController物体的Character Controller组件当中。(如下图胶囊形状)
并且我们的Coin对象有一个Capsule Collider(胶囊对撞机)组件,它是在前面创建圆柱体原语时自动添加的。这个对撞机在场景中近似硬币的物理体积。
接下来我们移除自带的Capsule Collider(胶囊对撞机)组件,更换对撞机的形状:Inspector | Remove Component| Component | Physics | Box Collider。
现在有个问题,Coin是用来收集的,但是我们现在人物不能穿过Coin,解决步骤:选择Coin | 启用Is Trigger复选框
几乎所有碰撞器类型都会出现Is Trigger设置。勾选它之后,它可以让我们检测碰撞和与其他对撞机的交集,同时允许它们通过。
2.5、OnTriggerEnter函数
当一个GameObject与其他的GameObject发生碰撞,unity称这种行为叫OnTriggerEnter,注意,两个GameObject都必须包含Collider组件。并且至少其中一个Collider的isTrigger属性已启用,并且还需要一个Collider包含Rigidbody(刚体)组件。
现在我们人物已经能够穿过Coin对象,并且两者发生碰撞时会调用OnTriggerEnter函数,但是我们还需要弄清楚是什么对象与Coin发生了碰撞,接下来就是用unity的Tag
使用Tag:选中物体 | Inspector | Tag | 选择Player
现在我们编写c#代码:(注意这里有错,Destory()函数应该写OnDestroy)
总结:
1.当GameObject与Coin物体发生碰撞时,OnTriggerEnter函数会调用一次
2.OnTriggerEnter函数会将碰撞的GameObject对象当作参数传入函数
3.目前的Coin没有添加RigidBody组件,并且Collider也就是一个Trigger(触发器),于是我们可以理解为Coin有一个静态触发对撞机,任何物体与一个具有Static Trigger Collider的对象碰撞时都会调用OnTriggerEnter函数。
4.当Destroy函数被调用时,OnDestroy事件被自动调用,它会减少硬币计数。
2.6、使用Prefabs(预制件)——有些操作没整明白
现目前,硬币的基本功能已经完成,我们需要向场景中添加多个硬币,如果我们采用复制的办法来向场景中添加多个硬币,那么就会出现一个问题——如果我们要对硬币进行修改,就需要一个个的去修改每个硬币,这样做是很笨的。于是我们要使用Prefabs(预制件)。
prefabs可以让GameObject转换成Assets,然后可以根据需要在场景中频繁地实例化Assets。
于是我们总结prefabs的作用:
1.频繁创建物体时,使用prefab可以节省内存
2.使用prefabs我们可以对多个相同物体同时进行同样的操作
3.使用prefab可以动态的加载已经设置好的物体
使用Prefabs: project窗口创建Prefabs文件夹 | Hierarchy 窗口中拖动物体到Prefabs文件夹中,
在创建prefabs的实例对象的时候尽量将新建的对象作为子对象放在被转换成prefabs的对象下面:
对Coin的修改应用到预制件:选中Coin对象 | Inspector | Overrides | Apply All (注意这里的Coin其实就是预制件的实例对象)。
进入预制件模式:点击Hierarchy面板中对象名称旁边的箭头,进入预制模式
如何将预制件转换回独立的GameObject:右键单击场景中的一个预制实例 | Prefab | Unpack Completely:
其中Unpack Completely与Unpack选项的区别:Unpack Completely会将预制件中的任何预制件子对象也进行转换称普通的GameObject
2.7、创建一个计时器
首先建立一个空对象用于挂载脚本:Hierarchy | GameObject | Create Empty, 接下来创建一个名为Timer.cs的新脚本文件,并将其添加到场景中的LevelTimer对象(刚创建的空对象)中。
Tips: c#中声明为public类型的变量,在unity编辑器的Inspector窗口中显示为可编辑字段,对于这些字段,开发人员可以直接在Inspector窗口中设置它们的值,如果一个变量是private类型的,我们也可以前面添加[SerializeField] 属性让他强制可以见:见上图和下图示例:
到这里我们已经实现了计时器,如果计时器时间到了,就会重新加载场景,但是,到这里我们需要实现胜利的条件。
2.8、添加烟花
步骤:Standard Assets | ParticleSystems | Prefabs文件夹 | 拖拽Fireworks 粒子系统到场景当中,默认情况下Fireworks烟花会在场景启动的时候开始播放,我们可以禁用启动播放:选中 Fireworks | Inspector | 禁用 Play On Awake。
使用代码在正确的时候启动烟花:
1.首先我们需要Tag标记所有的烟花,目的是需要在代码中通过标签来搜索场景中的烟花
2.添加Tag标签:选中Fireworks | Inspector面板 | Tag | Add Tag | 输入标签名称 | Save
3.将标签分配给FireWorks: 选中Fireworks 对象 | 在标签菜单栏中选择标签
4.编写脚本:
1.GameObject.Find()通过对象名称在场景中搜索对象,如果找到多个匹配对象,则只返回第一个(注意尽量避免使用该方法查找对象,因为他的速度很慢)
2.使用GameObject.FindGameObjectsWithTag(“标签名”)函数返回带有某个标签名的数组对象
3.我们调用GetComponent来访问游戏对象和组件并调整参数链接: 点击了解更多GetComponent
2.9如何编译和打包游戏
1.Application menu | File | Build Settings
2.Build Settings 对话框中点击Add Open Scenes后,在Scenes In Build 窗口包含了所有场景列表,你也可以选择将场景拖动到Scenes In Build 窗口
3.Unity根据它们在列表中的顺序自动为场景分配一个编号。0表示第一项,1表示下一项,依此类推。第一个场景(场景0)将始终是开始场景。
4:选择目标平台
5.第一次构建之前,可以通过Player Settings选项来微调重要的构建参数,如游戏分辨率、质量设置
6.Resolution and Presentation选项指定屏幕大小和分辨率:Fullscreen Window就是游戏屏幕为全屏,然后点击Build And Run
7.就可以得到如下文件结构:
collongame_data文件夹包含运行项目所需的所有数据
MonoBleedingEdge包含了我们游戏所需要的c#和MonoDevelop库
dll包含我们的游戏所需要的原生Unity引擎代码
UnityCrashHandler64.exe拥有与你的游戏相同的生命周期。它会随着游戏自动启动和关闭,并处理发生的任何崩溃。