新書推薦:
《
图以载道——传统绘画的图像叙事
》
售價:NT$
390.0
《
骨科康复学(第2版)
》
售價:NT$
1140.0
《
笔记启蒙 : 英国皇家学会与科学革命
》
售價:NT$
390.0
《
汉语副词研究论集(第六辑)
》
售價:NT$
490.0
《
干戈之影:商代的战争观念、武装者与武器装备
》
售價:NT$
340.0
《
镶嵌之美:古希腊罗马的马赛克艺术
》
售價:NT$
1390.0
《
后希腊化哲学:从斯多亚学派到奥利金的发展研究
》
售價:NT$
349.0
《
别纠结啦:不被情绪牵着走的通透生活指南(“当代一休”小池龙之介治愈新作!附赠精美书签!)
》
售價:NT$
295.0
|
編輯推薦: |
Unity 入门经典 引用完整示例项目,快速掌握Unity游戏开发平台 免费提供书中所有源代码熟练掌握基于2D和3D驱动的游戏技能涵盖Unity 5.0
|
內容簡介: |
本书帮助读者使用Unity游戏开发平台构建成功的游戏。
你将使用强大的C#语言、Unity的可视化工作流工具和顶尖的渲染引擎来构建和部署移动、桌面和控制台游戏。Unity的单一基于代码的方式最小化了在开发工具间切换的影响,并将你的关注点集中在制作美妙的交互体验上。
本书教授你如何编写和部署游戏。你将从头开始掌握Unity的工具集,书中介绍了从应用编码者到游戏开发者所需的技能。每个示例项目都阐述了特定的Unity特性和游戏开发策略。阅读完本书内容和完成书中练习后,你将掌握创建生动的基于2D和3D驱动的游戏应用的各方面技能。
主要内容
◆ 编写跑动、跳跃和交互的角色
◆ 构建管理游戏状态的代码架构
◆ 将游戏连接到互联网以下载动态数据
◆ 将游戏部署到平台包括网页和移动等
◆ 涵盖Unity 5.0
|
關於作者: |
Joseph Hocking是一位交互式媒体开发方面的软件工程师。他就职于Synapse Games公司并在芝加哥哥伦比亚学院教授游戏开发课程。
|
目錄:
|
目录
第Ⅰ部分 起 步
第1章 初识Unity 3
1.1 为什么Unity如此优秀 4
1.1.1
Unity的优势 4
1.1.2
要意识到的缺点 5
1.1.3
使用Unity构建的游戏案例 6
1.2 如何使用Unity 9
1.2.1
Scene视图、Game视图和工具栏 10
1.2.2
使用鼠标和键盘 11
1.2.3
Hierarchy标签和Inspector 12
1.2.4
Project和Console标签 12
1.3 开始使用Unity编程 13
1.3.1
代码在Unity中是如何运行的:脚本组件 14
1.3.2
使用MonoDevelop,跨平台的IDE 15
1.3.3
打印到控制台:Hello World! 16
1.4 小结 18
第2章 构建一个让你置身3D空间的演示 19
2.1 在开始之前 20
2.1.1
对项目做计划 20
2.1.2
了解3D坐标空间 21
2.2 开始项目:在场景中放置对象
22
2.2.1
第二步:地板、外墙和内墙 22
2.2.2
灯光和摄像机 25
2.2.3
玩家的碰撞器和视口 26
2.3 让东西移动:应用变换的脚本
27
2.3.1
图示说明如何通过编程实现旋转 27
2.3.2
编写代码实现图中演示的运动 27
2.3.3
本地和全局坐标空间 29
2.4 用于观察周围的组件脚本:MouseLook
30
2.4.1
跟踪鼠标运动的水平旋转 31
2.4.2
在一定范围内的垂直旋转 32
2.4.3
同时水平和垂直旋转 33
2.5 键盘输入组件:第一人称控件
36
2.5.1
响应按下的键 36
2.5.2
设置独立于计算机运行速度的运动速率 37
2.5.3
为了碰撞检测,移动CharacterController 38
2.5.4
调整组件为走路而不是飞翔 39
2.6 小结 41
第3章 为3D游戏添加敌人和子弹 43
3.1 通过射线射击 44
3.1.1
什么是射线发射 44
3.1.2
使用命令ScreenPointToRay来发射 45
3.1.3
为准心和击中点添加可视化提示 46
3.2 脚本化反应的目标 49
3.2.1
确定被击中的对象 49
3.2.2
警告目标它被击中 50
3.3 基本漫游AI 52
3.3.1
图解基础AI的工作原理 52
3.3.2
使用射线发射发现障碍物 52
3.3.3
跟踪角色状态 54
3.4 产生敌人预设 55
3.4.1
什么是预设 55
3.4.2
创建敌人预设 56
3.4.3
在不可见的SceneController中实例化 57
3.5 通过实例化对象进行射击
59
3.5.1
创建子弹预设 59
3.5.2
发射子弹并和目标碰撞 60
3.5.3
伤害玩家 63
3.6 小结 63
第4章 为游戏开发图形 65
4.1 了解美术资源 65
4.2 构建基础3D场景:白盒 67
4.2.1
白盒的解释 68
4.2.2
为关卡绘制地板平面图 68
4.2.3
根据平面图布局几何体 69
4.3 使用2D图像给场景贴图 70
4.3.1
选择文件格式 71
4.3.2
导入图像文件 72
4.3.3
应用图像 73
4.4 使用贴图图像产生天空视觉效果 75
4.4.1
什么是天空盒 75
4.4.2
创建一个新天空盒材质 76
4.5 使用自定义3D模型 77
4.5.1
选择文件格式 78
4.5.2
导出和导入模型 79
4.6 使用粒子系统创建效果 81
4.6.1
调整默认效果的参数 82
4.6.2
为火焰应用新贴图 83
4.6.3
将粒子效果附加到3D对象上 84
4.7 小结 85
第Ⅱ部分 轻 松 工 作
第5章 使用Unity新的2D功能构建一款记忆力游戏
89
5.1 设置2D图形 90
5.1.1
为项目做准备 90
5.1.2
显示2D图像亦称精灵 92
5.1.3
将摄像机切换为2D模式 94
5.2 构建卡片对象并让它响应单击
95
5.2.1
从精灵构建对象 95
5.2.2
鼠标输入代码 96
5.2.3
当单击时显示卡片 96
5.3 显示不同的卡片图像 97
5.3.1
通过程序加载图像 97
5.3.2
通过不可见的SceneController来设置图像 98
5.3.3
实例化一个网格的卡片 100
5.3.4
打乱卡片 101
5.4 实现匹配和匹配得分 103
5.4.1
保存并比较翻开的卡片 104
5.4.2
隐藏错误卡片 104
5.4.3
显示积分的文本 105
5.5 重启按钮 106
5.5.1
使用SendMessage编写UIButton组件 107
5.5.2
从SceneController中调用LoadLevel 109
5.6 小结 110
第6章 在3D游戏中放置2D图形用户界面 111
6.1 在开始写代码之前......
112
6.1.1
直接模式GUI还是高级2D界面 112
6.1.2
规划布局 113
6.1.3
导入UI图像 114
6.2 设置GUI显示 114
6.2.1
为界面创建画布 115
6.2.2 按钮、图像和文本标签 116
6.2.3
控制UI元素的位置 118
6.3 编写UI中的交互 119
6.3.1
编写不可见的UIController 120
6.3.2
创建弹出窗口 121
6.3.3
使用滑动条和输入域设置值 124
6.4 通过响应事件更新游戏
126
6.4.1
集成事件系统 127
6.4.2
从场景中广播和侦听事件 127
6.4.3
从HUD广播和侦听事件 128
6.5 小结 130
第7章 创建第三人称3D游戏:玩家移动和动画
131
7.1 调整摄像机视图为第三人称视角 133
7.1.1
导入一个用于观察的角色 133
7.1.2
将阴影添加到场景 134
7.1.3
摄像机环绕玩家角色 135
7.2 编写程序控制camera-relative的移动 137
7.2.1
旋转角色,以朝向移动方向 138
7.2.2
朝着方向向前移动 140
7.3 实现跳跃动作 141
7.3.1
应用垂直速度和加速度 142
7.3.2
修改地面检测来处理边缘和斜坡 143
7.4 设置玩家角色上的动画
146
7.4.1 在导入的模型上定义动画剪辑 148
7.4.2
为动画创建动画控制器 149
7.4.3
编写操作Animator组件的代码 153
7.5 小结 154
第8章 在游戏中添加交互设施和物件
155
8.1 创建门和其他设施 156
8.1.1
由按键控制开关的门 156
8.1.2
在开门之前检查距离和朝向 157
8.1.3
创建一个变色监控器 159
8.2 通过碰撞与对象交互 160
8.2.1
和具有物理功能的障碍物碰撞 160
8.2.2
用一个压力板来触发门 161
8.2.3
收集当前关卡游戏中分散的物件 163
8.3 管理仓库数据和游戏状态
165
8.3.1
设置玩家和仓库管理器 165
8.3.2
编程实现游戏管理器 166
8.3.3
把物品存储在集合对象中:List与Dictionary 170
8.4
使用和装备物品的仓库UI 173
8.4.1
在UI中显示仓库物品 173
8.4.2
装备一个用来开门的钥匙 175
8.4.3
通过使用血量包来恢复玩家的血量 177
8.5 小结 178
第Ⅲ部分 冲 刺 阶 段
第9章 将游戏连接到互联网 181
9.1 创建户外场景 182
9.1.1
使用天空盒生成天空视觉效果 182
9.1.2
通过代码设置大气环境 183
9.2 从互联网服务下载天气数据
185
9.2.1
使用协程请求WWW数据 188
9.2.2
解析XML 192
9.2.3
解析JSON 193
9.2.4
基于天气数据影响场景 195
9.3 添加一个网络布告栏 196
9.3.1
从互联网加载图像 196
9.3.2
在布告栏上显示图像 199
9.3.3
缓存下载的图像以供重用 200
9.4 将数据发送到Web服务器 201
9.4.1
跟踪当前的天气:发送post请求 202
9.4.2
PHP中的服务器端代码 204
9.5 小结 204
第10章 播放音频:音效和音乐
205
10.1
导入音效 206
10.1.1
所支持的文件格式 206
10.1.2
导入音频文件 207
10.2
播放音效 208
10.2.1
音频剪辑、音源和声音侦听器 208
10.2.2
设定一个循环声音 209
10.2.3
从代码触发音效 210
10.3
音频控制接口 211
10.3.1
建立中心AudioManager 212
10.3.2
音量控制UI 214
10.3.3
播放UI声音 217
10.4
背景音乐 218
10.4.1
播放循环音乐 218
10.4.2
独立控制音乐的音量 221
10.4.3
歌曲间的淡入淡出 223
10.5
小结 226
第11章 将各部分整合为一个完整的游戏 227
11.1
再次利用项目来构建角色扮演RPG 228
11.1.1
将多个项目的资源和代码装配在一起 228
11.1.2
编写指向-单击的控件:移动和设备 231
11.1.3
使用新界面替换旧GUI 235
11.2
开发总体的游戏结构 241
11.2.1
控制任务流和多关卡 242
11.2.2
通过到达退出条件完成一个关卡 245
11.2.3
当被敌人捕捉时关卡失败 247
11.3
处理玩家游戏过程中的进度 249
11.3.1
保存并加载玩家进度 249
11.3.2
通过完成三个关卡打败游戏 253
11.4
小结 255
第12章 将游戏部署到玩家的设备
255
12.1
构建桌面环境:Windows、Mac和Linux 259
12.1.1
构建应用 259
12.1.2
调整Player Settings:设置游戏的名称和图标 260
12.1.3
平台依赖的编译 261
12.2
为Web构建游戏 262
12.2.1
Unity Player和HTMLWebGL 262
12.2.2
构建Unity文件和一个测试Web页面 262
12.2.3
与浏览器中的JavaScript通信 263
12.3
构建移动应用的平台:iOS和Android 264
12.3.1
设置构建工具 265
12.3.2
贴图压缩 268
12.3.3
开发插件 269
12.4
小结 277
附录A 场景导航和键盘快捷键
279
A.1 使用鼠标进行场景导航
279
A.2 一般使用键盘快捷键 280
附录B 与Unity一同使用的外部工具 281
B.1 编程工具 281
B.1.1
Visual Studio 281
B.1.2
Xcode 281
B.1.3
Android SDK 282
B.1.4
SVN、Git或Mercurial 282
B.2
3D美术应用 282
B.2.1
Maya 282
B.2.2
3ds Max 282
B.2.3
Blender 283
B.3
2D图像编辑器 283
B.3.1
Photoshop 283
B.3.2
GIMP 283
B.3.3
TexturePacker 283
B.4 音频软件 283
B.4.1
Pro Tools 284
B.4.2
Audacity 284
附录C 在Blender中建模一个板凳 285
C.1 构建网格几何体 285
C.2 模型贴图映射 288
附录D 在线学习资源 293
D.1 附加的指南 293
D.2 代码库 294
后序 297
|
內容試閱:
|
第Ⅰ部分
起
步
是时候迈出你使用Unity 的第一步了。如果你一点也不了解Unity,那也没关系!本部
分将首先解释Unity 是什么,包括使用它编写游戏程序的一些基本原理。接着将讲解一个
关于在Unity 中开发简单游戏的指南。该指南将教授你一系列游戏开发技术及其大概的工
作流程。
下面开始学习第1 章!
1
第1 章
初识Unity
本章涵盖:
●
是什么使得Unity 成为一个极佳选择
●
操作Unity 编辑器
●
在Unity 中编程
●
比较C#和JavaScript
如果你像我一样,曾经在脑海中有很长一段时间梦想着开发一款视频游戏。但是从玩
游戏到实际开发游戏是一个大的跳跃。这些年已经出现了很多游戏开发工具,而我们准备
讨论的正是这些工具中最现代、最强大的一个。Unity 是一个专业的游戏引擎,它用于创
建针对不同平台的视频游戏。它不仅是一个被成千上万经验丰富的开发者使用的开发工具,
也是当代游戏开发新手比较容易上手的现代开发工具。直到现在,游戏开发新手在制作游
戏特别是3D 游戏时,仍然面临很多巨大的障碍,但Unity 的出现让这些技能变得更容易
学习。
你正在阅读本书,可能是你对计算机技术比较好奇,并且使用其他工具开发过游戏或
者构建过其他类型的软件,例如桌面应用或网站。创建一个视频游戏与编写其他类型的软
件本质上没有什么根本区别,但也有一定区别。例如,视频游戏比大多数网站有更多的交
互,而且会包含很多不同类型的代码,但制作所用的技术和方法很相似。如果你已经克服
了学习游戏开发道路上的第一道障碍,已经学习了编写软件程序的基本原理,那么下一步
就是选择一些游戏开发工具并把编程知识转化到真正的游戏中去。Unity 是开发游戏工作
环境的一个极佳选择。
关于术语的提示
这是一本关于Unity 编程的书,因此它针对的主要是编程人员。尽管很多资源讨论游
戏开发和Unity 中的其他方面,但本书还是把编程放在了首位。
顺便提一下,开发者在游戏开发上下文中有着不同的含义:开发者和Web开发的
编程人员是同义词,但在游戏开发中,开发者指的是为游戏开发工作的任何人,除了刚
刚提及的编程人员,还有其他类型的游戏开发者是艺术家和设计师,但本书将关注编程部分。
第Ⅰ部分
起 步
4
在开始介绍Unity 前,请先到网站www.unity3d.com 下载软件。本书使用的是Unity 5.0,
此版本是编写本书时的最新版本。这个URL 是Unity 最初专注于3D 游戏遗留下来的;它
对3D 游戏的支持依然强大,但是也能很好地服务于2D 游戏。同时,尽管一些高级特性只
对付费版本可用,但基础版本还是完全免费的。本书所有内容都基于免费版本,不需要Unity
Pro;这些版本之间的区别在于高级特性它们超出了本书的讨论范围和商业声明条款。
1.1 为什么Unity 如此优秀
下面仔细回顾一下本章开头对Unity 的描述:Unity 是一个专业级的高质量游戏引擎,
它用于创建针对多种平台的视频游戏。这个答案相当直接地回答了什么是Unity?这
样的问题。然而,这个答案具体意味着什么,为什么Unity 如此优秀?
1.1.1 Unity 的优势
游戏引擎都提供了充足的特性,这些特性在很多不同的游戏中都有用。因此通过使用
引擎,只要加入自定义的艺术资源并增加自己游戏玩法的代码,就可以轻松获得那些特性,
从而实现一个游戏。Unity 有物理模拟、法线贴图、屏幕空间环境光遮蔽Screen Space
Ambient Occlusion,SSAO、动态阴影等。很多游戏引擎以有诸多特性自豪,但Unity 比起
其他尖端的游戏开发工具有两个主要优势:提供了极度高效的可视化工作流和多维度的跨
平台支持。
可视化工作流是相当独特的设计,它和其他大多数游戏开发环境不同。鉴于其他游戏
开发工具通常混杂了必定引发争议的不相关部分,或者需要你自己设置集成开发环境
Integrated Development Environment,IDE的编程类库、构建链和其他陈旧的设计等,而
Unity 中的开发工作流是通过精心设计的可视化编辑器定位的。这些编辑器用于布局游戏
中的场景,将艺术资源绑定在一起并对可交互对象进行编码。这些编辑器的美妙之处在于
它允许快捷高效地构建专业、高质量的游戏,当需要使用视频游戏中的大量新技术时,它
将提供给你难以置信的高效工具。
注意:
其他大多数带有可视化编辑器的游戏开发工具通常被限制得很死,它们支持的脚本也
不灵活,但Unity 没有这个缺点。尽管Unity 基本上是通过可视化编辑器创建所有的东西,
但这个核心接口还是包括了一系列链接到可运行于Unity 游戏引擎上的自定义代码的项
目。通过为项目提供核心接口这种方式很像为诸如Visual Studio 或Eclipse 的IDE 在项目
设置里链接类一样。有经验的编程人员应该考虑这个开发环境,不要误以为它只能通过鼠
标单击,限制了编程能力。
这个编辑器对于快速迭代以及在原型制作和测试游戏的周期中打磨游戏都非常有益。
你能在编辑器中调整物体,甚至是在游戏运行时移动物体。另外,Unity 允许你通过编写
脚本来自定义编辑器,这样可以在界面上增加一些新特性或菜单。
除了编辑器非凡的生产力优势,其他主要长处在于Unity 的工具集提供了高度跨平台
第1 章
初识Unity
5
的支持。不仅是在部署目标方面跨平台能部署到PC、Web、移动设备或游戏主机,还包
括开发工具跨平台能在Windows 或Mac OS 上开发游戏。这个平台潜力很大,因为Unity
最开始作为Mac 独享的软件,后来才移植到Windows。第一个版本在2005 年发布,但现
在Unity 已经更新到了第15 个主要版本中间有很多小的更新和频繁的发布。最初,Unity
仅支持开发和部署在Mac 上,但数月后,Unity 已经更新到也能工作在Windows 上。后续
版本的Unity 中慢慢地添加了更多部署平台,例如2006 年添加了可跨平台的Web 播放器,
2008 年添加了对iPhone 的支持,2010 年添加了支持Android,甚至支持更多游戏主机,比
如Xbox 和PlayStation。最近它们已经添加了到WebGL 的部署,WebGL 是一个用于Web
浏览器3D 图形的新框架。一些游戏引擎也支持和Unity 一样多的部署目标,但是没有一个
让部署到多平台的工作变得如此简单。
同时,除了这些主要的优点外,第三条微妙的优点来自Unity 使用模块化组件系统构
造游戏对象。在一个组件系统中,组件是一个混合搭配功能的包,对象由一系列组件构
建,而不是由层级严格的类构建。换句话说,组件系统是和面向对象编程不同的方法它更
灵活,游戏对象是通过组合的方式而不是继承的方式构建的。图1-1 演示了示例的对比。
移动和站立的敌人分开继承不
同分支,需要重复shooter 类。
每个行为和一种新敌人类型的
改变将需要更多的重构
混合搭配组件,允许一个shooter 组件
不管是移动的还是站立的敌人可以
被单独添加到任何想要的位置,不管
是移动的敌人还是站立的敌人
继承
组件系统
图1-1 继承与组件系统
在组件系统中,物体存在于一个扁平的层级结构,不同的物体有不同的组件集合,而
不像继承结构,不同物体处于树的完全不同的分支中。这种设计加快原型的开发,因为当
物体改变时,你能快速混合搭配不同组件而不必重构继承链。
当没有组件系统时,虽然你也可以编写代码实现自定义的组件系统,但是Unity 已经
有一个健壮的组件系统,这个系统甚至无缝地与可视化编辑器集成在一起。你不仅能通过
代码维护组件,还能使用可视化编辑器附加和移除组件。另外,你不再仅限于只能通过组
合构建对象,也可以在代码中选择使用继承,包括所有基于继承的最佳设计模式。
1.1.2 要意识到的缺点
Unity有很多优点,这让它成为开发游戏的好选择,而我们也高度推荐它,但如果不提
第Ⅰ部分
起 步
6
它的弱点就有点失职了。实际上,混合使用可视化编辑器和复杂的代码,尽管和Unity的组
件系统能高效地组合在一起,但它也不简单并且会产生复杂度。在复杂场景中,你会搞不
清楚场景中哪个物体附加了指定组件。Unity也提供了搜索功能用于查找附加的脚本,但该
搜索是很粗糙的;有时你还是会遇到一些情况,为了找出脚本链接,需要手动检查场景中
的东西。这些情况虽然不会经常出现,但是一旦出现会让你很沉闷。
另一个缺点会让有经验的编程人员吃惊且失望,即Unity 不支持链接额外的代码库。
很多现有的库必须手动复制到每个需要它们的项目中,而不是引用一个中心共享的位置。
对类库缺少中心位置会让它在多个项目中共享类库变得笨拙。这个缺点能通过巧妙使用版
本控制系统来绕开,但Unity 不支持这项功能。
注意:
难以使用版本控制系统例如Subversion、Git和Mercurial在过去是个致命弱点,但现在
Unity的一些版本已经可以使用它们。你可能会找到一些过时的资源提到Unity不能使用版
本控制,但是一些新资源会告诉你.meta文件Unity为使用版本控制系统而引入的机制和项
目中的哪些目录需要放在仓库里,哪些不用。为使用版本控制系统,你可以看看下面页面
中的文章:
http:docs.unity3d.comManualExternalVersionControlSystemSupport.html
第三个缺点是必须使用预设prefab。预设是Unity 中的一个概念,将在第3 章中解释
它,现在你只需要知道预设很强大,而且只属于Unity它和Unity 的组件系统绑定在一起,
但对预设的编辑流程却惊人的粗糙。由于预设极其有用且作为Unity 的主要部分进行工作,
因此希望在未来的Unity 版本中能改善对预设进行编辑的工作流。
1.1.3 使用Unity 构建的游戏案例
前面已经介绍了关于Unity的优缺点,但你仍然需要确信Unity中的开发工具是最好的
选择。请访问Unity图片库http:unity3d.comshowcasegallery,看一看使用Unity开发的游戏
和仿真程序,这个列表已经包含成百上千的游戏和仿真程序,并且在不断更新。本节仅介
绍一些类型和部署平台的游戏案例。
1. 桌面Windows、Mac、Linux
因为编辑器运行在同一个平台上,并通常部署到诸如Windows 或Mac 这样比较常见
的目标平台。下面给出一些不同类型的桌面游戏示例:
● Guns of Icarus Online见图1-2,一个由Muse
Games 开发的第一人称射击游戏。
● Gone Home见图1-3,一个由Fullbright 公司开发的冒险游戏。
第1 章
初识Unity
7
图1-2 Guns of Icarus Online 游戏
图1-3 ?Gone Home游戏
2. 移动平台iOS,Android
Unity 能将游戏部署到移动平台上,比如iOSiPhone
和iPad和Android手机和平板电
脑。下面是一些不同类型的移动平台的游戏:
● Dead Trigger见图1-4,由Madfinger Games 开发的第一人称射击游戏。
图1-4 ? Dead Trigger 游戏
● Bad Piggies见图1-5,由Rovio 开发的物理益智类游戏。
图1-5 ? Bad Piggies 游戏
第Ⅰ部分
起 步
8
● Tyrant Unleashed见图1-6,由Synapse Games 开发的收集类卡牌游戏。
图1-6 ? Tyrant Unleashed 游戏
3. 主机PLAYSTATION,XBOX,WII
Unity 甚至能将游戏部署到游戏主机,开发者依然需要从Sony、Microsoft 或Nintendo
获得许可。因为有这种需求和Unity 容易跨平台部署的特性,主机游戏通常在桌面计算机
上也可以看到。以下是一些不同类型的主机游戏的示例:
● Assault Android Cactus见图1-7,由Witch Beam 开发的街机射击游戏。
图1-7 ? Assault Android Cactus 游戏
● The Golf Club见图1-8,由HB Studios 开发的运动仿真游戏。
图1-8 ?The Golf Club游戏
从这些示例中你可以看到,Unity的强大功能当然可以应用到商业品质的游戏中。虽然
Unity超越其他游戏开发工具的优势明显,但新手可能会误解编程在开发流程中的存在。
Unity通常表现得就像是一个简单的特性列表,它不需要编程,其实这是个错误的观点,它
并没有告诉人们制作一款商业游戏需要什么。让大家误以为真的可以通过单击,使用现有
的组件,甚至不需要编程人员这真是完美,就能制作一个精良的原型。严格来讲,将一
第1 章
初识Unity
9
个有趣的原型变成可发布的精品游戏,是必须要编程的。
1.2 如何使用Unity
上一节讨论了很多通过Unity 的可视化编辑器提高生产率的问题,因此下面介绍界面
看起来是怎样的,如何操作它。如果尚未下载,从www.unity3d.com 下载程序,并在计算
机上安装在安装程序中请确认选中了Example Project。在安装后,运行Unity,开始浏览
界面。
你可能想通过一个示例进一步了解,那么打开所包含的示例项目;刚安装好的Unity
会自动打开示例项目,但也可以选择File | Open Project 来手动打开它。示例项目安装在共
享的用户目录,例如,在Windows 上是在C:\Users\Public\Documents\UnityProjects\;在Mac
OS 上是在UsersSharedUnity。你可能还需要打开示例场景,双击Car 场景文件图1-9 中
高亮显示的文件,场景文件图标是Unity 的立方体,这个文件可以在编辑器底部文件浏览
器的SampleScenesScenes中找到。图1-9 中显示了类似的界面。
Scene 和Game 标签分别
用于观察3D 场景和运
行游戏
整个顶部的区域是工具栏。
左边是查找和移动物体的按
钮,中间是播放按钮
监视器填充了右边区域。它
显示了当前选中对象的信息
通常是组件列表
Hierarchy 以文本列表的
形式展示了场景中的所
有对象,记录它们之间
的关系。在Hierarchy 中
拖动对象来连接它们
Project 和Console 标签
分别用于查看项目中的
所有文件和代码输出的
消息
导航左边的文件夹,然后双击Car 示
例场景
图1-9 Unity 中的部分界面
Unity 中的界面被划分为不同的部分:Scene 标签、Game 标签、工具栏、Hierarchy
标
签、Inspector、Projector 标签和Console 标签。每部分都有不同的用途,它们在构建游戏生
命周期中都很重要:
●
可以在Project 标签中浏览所有文件。
●
使用Scene 标签,可以在浏览3D 场景的同时将对象放置进去。
第Ⅰ部分
起 步
10
●
工具栏中的控件用于处理场景。
●
可以在Hierarchy 标签中拖放对象的关系。
● Inspector 列出了所选对象的信息,包括链接的代码。
●
可以在Game 视图中测试游戏,并在Console 标签中查看错误输出。
这是Unity 中的默认布局,所有不同的视图都有标签,而且可以移动它们或修改它们
的大小,将其停靠在屏幕中不同的位置。后面将介绍如何自定义布局,不过现在默认布局
是了解所有视图用途的最佳方式。
1.2.1 Scene 视图、Game 视图和工具栏
界面中最突出的部分是中间的Scene 视图。这是你观察游戏世界和移动对象的场所。
网格对象也会出现在场景中后面再来给出它的定义。你也能在场景中看到其他对象,它
们由不同的图标和颜色的线条表示:摄像机、灯光、声音源、碰撞区域等。注意在这个视
图看到的东西和运行游戏时看到的不一样。可以在Scene 视图中到处浏览,这不会受到
Game 视图的约束。
定义:
一个网格对象是3D 空间中的可视对象。3D 中的可视对象是由很多连接的线和图形构
成的,因此世界都是由网格构成的。
Game 视图不是屏幕中独立的部分,而是另一个标签,它位于Scene 视图的右侧在视
图左上角可以找到标签。在界面上的有些地方可能有类似这样的多个标签,如果单击一个
不同的标签,视图会被新激活的标签替换。当游戏运行时,你会发现这个视图变成了Game
视图。在每次运行游戏时不需要手动切换标签,因为当游戏启动时,视图会自动切换为
Game 视图。
提示:
当游戏正在运行时,可以切换回Scene 视图,这样你就能在运行的场景中检查对象。
当游戏正在运行时,这个功能对于你查看什么对象在执行什么操作能起到巨大的作用,它
是一个很有用的调试工具,而这正是大多数引擎所不具备的。
上面说的运行游戏,就是简单地按下Scene 视图上方的Play 按钮。界面的顶部是工具
栏,Play 按钮正位于中间。图1-10 为了展示顶部的工具栏,把整个编辑器界面分开了,同
时SceneGame 标签位于工具栏的下面。
工具栏左边的按钮用于场景导航和变换对象如何浏览场景和移动对象。建议你花
一些时间练习浏览场景和移动对象,因为这将会是你在Unity 可视化编辑器中最常用的两
个操作。如前所述,Unity 界面的视图很灵活,Layouts 菜单允许你在布局中来回切换。对
于Layers 菜单,它具有高级功能,现在可以先忽略它后续章节中将介绍Layers。
第1 章
初识Unity
11
播放
工具栏
灯光
网格对象
矩形框
缩放
旋转
平移
导航场景
一些有关场景显示方面的选项例
如,开关按钮决定是否显示灯光
图1-10 编辑器屏幕截图用于显示工具栏、场景和游戏
1.2.2 使用鼠标和键盘
场景导航主要使用鼠标,通过一些修饰键来修改当前鼠标的行为。这三个主要的导航
练习是移动Move、盘旋Orbit和变焦Zoom。具体的鼠标移动操作在本书结尾的附录A
中都已给出。从根本上讲,这三种不同的移动实际是指按住一些AltMac 是Option和Ctrl
的组合键时的单击和拖动操作。花几分钟在场景中移动,以便了解移动、盘旋和变焦的
作用。
提示:
虽然Unity 能使用一个或两个按钮的鼠标,但强烈建议你使用三个按钮的鼠标三个按
钮的鼠标在Mac OS X 中也工作得很好。
通过三个主要的练习已经完成了变换对象,而三个场景导航操作也类似于三个变换操
作:位移Translate、旋转Rotate和缩放Scale。图1-11 演示了如何变换一个立方体。
平移
旋转 缩放
图1-11 应用三种变换:平移、旋转和缩放较浅的线是对象在变换前的状态
当选中场景中的一个对象后,接着你就能移动数学上精确的技术术语是位移、旋转
或缩放它。盘旋是旋转摄像机,变焦是缩放摄像机。除了使用工具栏的按钮,还能通过按
下键盘的W、E 或R 键来切换这些功能。当激活一个transform 时,注意,有一系列有颜
色的箭头或圆圈围绕着场景中的对象,这是Transform 的gizmo,可以单击或拖动gizmo
第Ⅰ部分
起 步
12
来进行变换。
在变换按钮旁边还有第四个工具,即Rect 工具,它用于2D 图形中。该工具组合了移
动、旋转和缩放。这些操作在3D 中是分开的,但是在2D 中是组合在一起的,因为少了一
个需要考虑的维度。Unity 有许多其他键盘快捷键用于在不同任务中加速。可以参考附录A
来学习它们。下面介绍界面部分剩下的内容!
1.2.3 Hierarchy 标签和Inspector
观察屏幕边缘,你会发现左边是Hierarchy 标签,而右边是Inspector见图1-12。
Hierarchy 是一个列表视图,它列出了场景中每个对象的名称,名字是否嵌套取决于它们在
场景中连接的层次。基本上,选择对象的方式是通过名称,而不是在场景中逐个查找。
Hierarchy 将对象连成一组,看起来它们就像文件夹,并且允许你一起移动整个组。
图1-12 编辑器屏幕截图,用于展示Hierarchy 标签和Inspector
Inspector 显示当前所选对象的信息。选择某个对象后,接着该对象的信息便会填充
Inspector。所显示的信息大部分是组件列表,而你甚至可以从对象上添加或移除组件。所
有游戏对象最少有一个组件,即Transform,所以在Inspector 中至少可以看到关于位置和
旋转的信息。很多时候,对象会在Inspector 中列出很多组件,包括它上面的脚本。
1.2.4 Project 和Console 标签
在屏幕底部你会发现Project 和Console 标签见图1-13。与Scene 和View 一样,这两
个不是屏幕中分隔的部分,可以通过标签在它们之间切换。Project 显示项目中所有的资源
美术、代码等。具体而言,视图左边是项目中目录的列表;当选择一个目录时,视图右
边会显示该目录中独有的文件。Project 中列出的目录和Hierarchy 中的列表视图十分类似,
但Hierarchy 只显示场景中的对象,Project 则显示不包含在特定场景中的文件包括场景文
件当保存场景时,它会显示在Project 中。
第1 章
初识Unity
13
图1-13 编辑器屏幕截图,用于展示Project 和Console 标签
提示:
Project 视图镜像了磁盘上的Assets 目录,但你通常不应该直接从Assets
文件夹移动或
删除文件。如果你想执行这些操作,可在Project 视图中进行。Unity 会保持同步那些文
件夹。
代码将消息显示在Console 中。这种消息是你专门输出来调试程序的,但是当编写的
脚本出现问题时,Unity 也会在Console 中发出错误消息。
1.3 开始使用Unity 编程
现在我们观察Unity 中编程工作的流程。虽然可以在可视化编辑器中布局美术资源,
但你依然需要编写代码来控制它们并让游戏变得可以交互。Unity 支持一些编程语言,特
别是JavaScript 和C#。使用它们各有优缺点,但本书还是建议你使用C#。
为什么选择C#而不是JavaScript?
本书所有的代码都使用C#编写,因为相比于JavaScript,C#有很多的优点且缺点也较
少,特别是对于专业开发者而言。
C#的一个优点在于它是强类型语言,而JavaScript不是。现在,在有经验的编程人员之
间存在关于动态类型更适合开发的争议,特别是Web开发,但针对特定的游戏平台比如iOS
通常最好甚至必须使用静态类型。Unity甚至增加了指令#pragma strict来强制让JavaScript
使用静态类型。尽管技术上可以这么做,但它破坏了JavaScript工作的根本原理,而如果你
想这么做,更好的方式是使用一种原本就是强类型的语言。
这仅是一个Unity 中的JavaScript 和其他地方的JavaScript 如何不同的示例。Unity 中
的JavaScript 特别类似于Web 浏览器的JavaScript,但在每个容器中语言如何工作还是有很
多区别。很多开发者将Unity 中的JavaScript 称为UnityScript,这个名字表明了它们之间的
相似性,但是又和JavaScript 做了区分。这种相似但不同的状态给编程人员增加了一
些问题,既要学习Unity 外的JavaScript 知识,又要在Unity 中应用学到的编程知识。
让我们通过编写和运行一些代码来尝试第一个示例。运行Unity 并创建一个新项目;
选择File | New Project,打开New Project 窗口。输入项目名称,然后选择一个位置,保存
这个项目。了解到Unity 项目是一个简单的目录,其中包含了不同的资源和配置文件,所
以你可以在计算机上的任何位置保存项目。单击Create Project,之后Unity 会暂时消失,
此时它是在设置项目目录。
第Ⅰ部分
起 步
14
警告:
Unity 项目会记住它们是在哪个Unity 版本中创建的,而当你尝试在不同版本的Unity
中打开它们时,将会出现警告。有时这些警告无关紧要例如,当打开本书下载的示例时,
出现警告时忽略它即可,但有时,需要在打开项目之前备份一下。
当Unity 重新出现时,你将看到一个空的项目。下一步,讨论如何在Unity 中执行你
的程序。
1.3.1 代码在Unity 中是如何运行的:脚本组件
Unity 中所有代码的执行都从链接到场景对象的代码文件开始。游戏对象是由组件集
合构建而成,而这些集合能包含要执行的脚本。
注意:
Unity 将代码文件当成脚本,使用脚本这个定义,这和JavaScript 运行在一个浏览
器的情况大致一样:代码运行在Unity 游戏引擎中,不像编译代码运行在它自己的可执行
环境中。但不要被这些概念混淆了,因为很多人对这个词的定义是不同的;例如脚本
通常也指短小、完整的实用程序。Unity 中的脚本更像是独立的OOP 类,附加到场景对象
上的脚本是对象的实例。
Unity 中的脚本是指组件并非所有脚本,注意,只有从MonoBehaviour 继承的脚本
才是,MonoBehaviour 是脚本组件的基类。MonoBehaviour 定义一些看不见的基础工作,
实现了组件是如何被附加到游戏对象上,而从它继承提供了一系列自动运行的方法见代码
清单1.1,你可以重写它们。这些方法包括Start,当对象变成激活状态时通常是带有
MonoBehaviour 对象的关卡被加载了会调用它一次。还包括Update,它会在每帧调用。
因此,当把代码放到这些预定义的方法中时就会运行。
定义:
帧是游戏循环代码中的一个周期。几乎所有的视频游戏不仅Unity,包括大多数视频
游戏都是围绕一个核心游戏循环建立的,当游戏运行时,代码会在每个周期中执行。每个
周期都包括了绘制屏幕,因此命名为帧就像是电影也由一系列的帧组成。
代码清单1.1 一个基本脚本组件的代码模板
using UnityEngine;
using System.Collections;
public class HelloWorld : MonoBehaviour{
void Start{
do something once
}
void Update{
包含用于Unity 和Mono 类
的名称空间
用于继承的语法
把一些运行一次的
代码放这里
第1 章
初识Unity
15
do something every frame
}
}
这是创建一个新的C#脚本时文件中所包含的内容:定义一个合法的Unity 组件需要的
最少模板代码。Unity 有一个脚本模板隐藏在应用内部,当创建新脚本时,它复制该模板
并命名新创建类的类名同文件名一样本示例中名称为HelloWorld.cs。这个脚本依然包含
空的Start和Update方法,因为大部分情况下都是在这两个方法中调用自己的代码需要
稍微调整这些方法中间的空白,因为这个模板代码的空白不完全是作者喜欢的。
为了创建脚本,从Assets 菜单注意Assets 和GameObjects 都有Create 的列表,但它
们是不同的菜单或Project 视图中右击的Create 菜单中选择C# Script。输入新脚本的名称,
例如HelloWorld。就像本章随后介绍的一样见图1-15,可以单击并拖动这个脚本文件到
场景中的对象上。双击这个脚本会自动打开另一个称为MonoDevelop 的程序,下面将讨论
该程序。
1.3.2 使用MonoDevelop,跨平台的IDE
准确而言,编程并不是在Unity 中进行的,相当于代码是独立的文件,你要让Unity
指向它。脚本文件能在Unity 内创建,但仍然需要使用一些文本编辑器或IDE 在那些初始
为空的文件中编写所有代码。Unity 自带绑定了MonoDevelop,它是一个开源、跨平台的
编写C#的IDE见图1-14。可以访问www.monodevelop.com 进一步学习这个软件,但使用
的版本是和Unity 绑定的,而不是从网站下载的版本,因为一些修改会妨碍这个基础软件
更好地集成到Unity 中。
不要在MonoDevelop 中单击Run 按钮;
在Unity 中单击Play 来运行代码
脚本文件在主视图区域作为标签打开。
多个脚本文件能同时打开
Solution解决方案视
图显示项目中所有的
脚本文件
默认情况下,Document
Outline文档大纲可能
不显示。选择View |
Pads 并将该标签拖放
到你想要放置的位置
图1-14 MonoDevelop 中的界面
注意:
MonoDevelop 把文件组织成称为解决方案的组。Unity 自动生成了一个解决方案,它
包含所有的脚本文件,所以通常不必关心它们。
把每帧运行的
代码放这里
第Ⅰ部分
起 步
16
因为C#最开始作为Microsoft的产品,所以你可能疑惑是否能使用VisualStudio在Unity
中编程。答案是可以的。支持的工具可以在www.unityvs.com上找到,但还是建议使用
MonoDevelop,主要是因为Visual Studio只能运行在Windows上,因此使用这个IDE会将你
的工作流限制在Windows上。但它也不一定是坏事,如果你已经使用了Visual Studio来编程,
则可以继续使用它,而且跟着本书不会产生任何问题该章之后不会再讨论IDE。将工作流
限制在Windows上,会和使用Unity的最大优点背道而驰,如果你的团队需要基于Mac进行
开发或者你想要将游戏发布到iOS,这样做可能会产生问题。虽然C#最初作为Microsoft产
品并只能在Windows和.NET Framework中一起工作,但是现在它已经成为开源标准的语言,
而且有一个有意义的跨平台框架: Mono。Unity 使用Mono支撑它的编程,
而使用
MonoDevelop允许你保持整个项目的开发工作流跨平台。
时刻记住,尽管代码是使用MonoDevelop 编写的,但代码实际是不能运行的。IDE 只
是一个强大的文本编辑器,只有当你在Unity 中单击Play 后代码才会运行。
1.3.3 打印到控制台:Hello World!
至此,你已经在项目中有了一个空脚本,但场景中还需要一个附加这个脚本的对象。回
顾图1-1中描述的组件系统的工作原理;一个脚本是一个组件,所以需要设置组件在对象上。
选择GameObject | Create Empty,在Hierarchy 列表中将出现一个空的GameObject。现
在从Project 视图将脚本拖到Hierarchy 视图并放置在那个空的GameObject 上,如图1-15
所示,Unity 将高亮验证可以放置脚本的地方,在GameObject 上释放它,让脚本附加到对
象上。为验证脚本是否已附加到对象上,选择该对象并看Inspector 视图。你将看到其中列
出了两个组件:Transform 组件,它是基础位置旋转缩放组件,所有对象都包含该组件,
而且不能移除它;另一个组件就是你的脚本。
单击并把脚本从Project 视图
拖到Hierarchy 视图,并在
GameObject 上释放
图1-15 如何将脚本链接到GameObject 上
注意:
将对象从一个地方拖到其他对象上并释放的行为是很常见的。Unity中很多不同的链接
都是通过将对象拖到其他对象之上来创建的,不只是将脚本拖到对象上。
第1 章
初识Unity
17
当一个脚本链接到一个对象后,其结果将如图1-16 所示,脚本像组件那样显示在
Inspector 中。现在当你播放场景时脚本将会执行,不过现在还不会发生任何事情,因为你
还没编写任何代码。让我们接着下一步!
图1-16 在Inspector 中显示链接的脚本
打开MonoDevelop 中的脚本,回到代码清单1.1。当学习一个新的编程语言环境时最
经典的做法是输出文本Hello World!,将这行文本添加到Start方法中,如代码清单1.2
中所示。
代码清单1.2 添加一个控制台消息
void Start {
Debug.Log"Hello World!"
}
Debug.Log命令将一个消息输出到Unity中的Console 视图。与此同时,由于Debug.Log
这一行代码出现在Start方法中, Start方法会在对象激活时调用一次。换句话说,Start
方法将会在你单击编辑器中的Play 时调用一次。一旦将日志命令添加到你的脚本请确认
保存了脚本,单击Unity 中的Play 并切换到Console 视图,就会看到所出现的消息Hello
World!。恭喜你,你已经编写了第一个Unity
脚本!后续章节中的代码会更复杂,当然,
这也是重要的第一步。
Hello World!简明步骤
下面重申和总结一下最后几页的步骤:
1 创建新项目。
2 创建新的C#脚本。
3 创建空的GameObject。
4 将脚本拖动到对象上。
5 给脚本添加日志命令。
6 单击Play 按钮。
现在可以保存场景,这将创建一个带Unity 图标的.unity 文件。场景文件是当前游戏中
加载的任何东西的快照,因此你可以在以后重新载入这个场景。保存这个场景几乎没有价
值,因为它太简单了只是一个单一的空GameObject,但如果不保存这个场景,当退出Unity
在此添加了日志命令
第Ⅰ部分
起 步
18
再回到这个项目时,就会发现它又变成空的。
脚本中的错误
为了查看Unity 如何显示错误,故意在HelloWorld 脚本中放了一个错误。例如,如果
输入额外的圆括号,这个错误消息将出现在Console 并带有红色错误图标。如图1-17 所示。
图1-17 错误消息
1.4 小结
在本章中,你已经学会了
● Unity 是一个多平台的开发工具。
● Unity 的可视化编辑器包括可以协同工作的几部分。
●
脚本是作为组件附加到对象上的。
●
代码是使用MonoDevelop 编写的内部脚本。
包含错误的脚本
在脚本中的位置
行,字符
错误的描述信息
|
|