从零开始做一款Unity3D游戏<一>——亲自上手使用Unity(二)

简介: 从零开始做一款Unity3D游戏<一>——亲自上手使用Unity

3.使用预制体

预制体是 Unity 中最强大的工具之一,不仅在创建关卡时很有用,而且可用来编写脚本,使用起来十分方便。预制体可视为能够保存并复用的 GameObject,其中可以包含任意的子对象、组件、C#脚本以及属性。一旦创建,预制体就像类的蓝图一样,场景中的每一个副本都是预制体的独立实例。结果就是,你对基础预制体所做的任何修改都会改变场景中的所有实例。

实践:创建角楼

要在竞技场的四个角落放置四个同样的角楼,使用预制体是最合适的方式。可以按如下步骤创建预制体:


(1)在 Hierarchy 面板中使用 Create  Create Empty 创建一个空对象,命名为Barrier 01。

(2)创建两个基础的 Cube 对象,缩放并摆成V形。

(3)创建另外两个 Cube 对象,将它们放到已有物体的一端

(4)在 Project 面板中创建一个新的文件夹,命名为 Prefabs。然后把 Barrier_01 拖进去,Barrier 01就会成为预制体.

8310c4f4fc5d47d0965bf74b57dac977.png

刚刚发生了什么

Barrier_01及其所有子对象现在成了预制体,这意味着可以从Prefabs文件夹中拖放Barrier_01预制体的副本到场景中或直接在场景中复制一份来用。Hierarchy 面板中的Bamier_01将变为蓝色以表示状态变了,同时 Inspector 面板中多了一行用于预制体的功能按钮。

实践:更新预制体

角楼的中央有一块空白,因此作为玩家的掩体并不是很合适。下面更新Barrier_01预制体,添加另一个 Cub 对象并应用所做的更改。


(1)创建一个Cube 对象,将它放置到角楼地基的交汇处。

(2) Inspector 面板中的 Prefab 标签会变为黄色,表示场景中的预制体被修改了Unity 会将新的Cube对象标记为白色,从而表明它不是预制体的一部分。

(3)单击Apply 按钮,保存修改并更新预制体.

刚刚发生了什么

Barrier 01 预制体现在包含一个新的 Cube 对象,整个预制体应该又变回了蓝色现在场景中有了角楼预制体,你也可以添加其他更具创意的预制体!

实践:完成关卡

我们已经有了可复用的障碍物,接下来创建关卡中剩下的物体以实现前面图 6-8所示的草图效果。

(1)复制三次 Barrier 01 预制体,将每个对象摆放到竞技场的不同角落。

(2)创建一个空对象,命名为 Raised Platform。

(3)创建一个 Cube 对象并进行缩放以符合平台的要求

(4)创建一个Plane 对象并缩放为坡道,然后旋转放置,使之与平合和地面相连

(5)复制坡道,然后重复刚才的旋转放置步骤。

(6)再次重复上述步骤两次,直到有四个坡道通往平台,如图6-14 所示。

image.png

刚刚发生了什么

你已经成功为第一个游戏关卡创建了白盒环境!

试验:创建可拾取道具

将你从本章学到的内容整合到一起可能要花上一段时间,但这是值得的。

(1)创建一个Capsule 对象,将其摆放至合适位置并进行缩放。

(2)创建并附加一个新的材质到 Capsule 对象上。

(3)将Capsule 对象做成预制体并重命名为Health Pickup。

执行完以上操作后,

8d40bc540bd94149a9a9d3eeae53ec29.png

做多了,旁边的动画效果先不用做,后面会讲解 。

光照基础


Unity 中的光照是一个范围极广的话题,光照分为两种:实时光照和预计算光照这两种光照都会考虑物体的属性(如颜色)、光的强度以及朝向场景的方向等,不同之处在于Unity 对光照行为的计算方式。


实时光照会在每帧进行计算,任何通过光线路径的物体都会投射实时阴影,就像真实生活中的光源一样。然而,这种方式会显著降低游戏的性能,并且消耗会随着场景中光源数量的增加而以指数级增加。预计算光照则会将场景的光照信息存储到一张名为光照贴图(light map)的纹理中,随后应用到场景中。预计算光照是静态的,可以节省计算性能,但是当物体进入场景中时,光照不会实时发生变化。

创建光源


每个场景默认都会使用直射光(Directional Light)作为主光源,但你也可以像创建其他游戏对象一样在层级中创建光源,即使刚刚接触光源控制方面的知识,也无须担心。光源同样是 Unity 中的对象,可以按需进行摆放、缩放和旋转。

image.png

我们先了解一些实时光源对象以及它们各自的性能:

  • 直射光(Directional Light)非常适合用来模拟自然界中的光,例如阳光。直射光在场景中并没有实际的位置,但直射光发出的光线会照射到场景中的所有物体上,并且始终指向同一个方向。
  • 点光源(Point Light)本质上就像漂浮的灯泡,从中心向四周发出光线。对于点光源,可以在场景中指定位置和光照强度。
  • 聚光灯(SpotLight)则向给定方向发射光线,但光线被限制在一定的角度内,就像现实世界中的聚光灯或泛光灯一样

Light组件的属性


Light 组件的所有属性都可以进行配置,从而创建令人沉浸的环境,你需要了解的最基础属性是 Color、Mode 和 Intensity,这三个属性分别决定了光照的颜色、模式(实时光照或预计算光照)和强度。

在Unity中制作动画


在 Unity 中可以为对象制作动画,范围可从简单的旋转效果直到复杂的角色移动及行为。所有动画都是通过Animation 和Animator 窗口控制的。


动画片段是在Animation 窗口中通过时间线进行创建和管理的,对象属性会按照时间线进行记录并播放以创建出动画效果。

Animator 窗口则使用Animation Controller 来控制不同动画片段之间的变换

创建动画片段


任何需要应用动画片段的游戏对象都需要 Animator 组件,而Animator 组件需要附加有Animation Cotroller。在创建新的动画片段时,如果项目中还没有控制器,Unit就会创建一个并将其保存到动画片段所在的位置,然后就可以通过控制器来管理动片段了。

实践:创建新的动画片段

下面通过创建动画片段来使 Health Pickpu 预制体动起来。

(1)使用Window|Animation|Animation打开Animation 面板,然后将Animation面板固定到Console 面板的旁边。


(2)确保Health Pickup 被选中,然后单击Animation 面板中的Create 按钮。


(3)使用弹出的界面创建一个名为Animations 的文件夹,将新建的动画片段命名为Pickup Spin。

4e896343eb374c6196753bd978f47a02.png

刚刚发生了什么

因为项目中没有任何Animator Controller,所以Unity 在Animations 文件夹中创建了一个名为 Health Pickup 的控制器。只要选中 Health Pickup 对象,创建动画片段的同时就会向预制体添加一个设置了 Animator Controller 的Animator组件.

记录关键帧


现在已经有动画片段了,在 Animation 窗口中,我们可以看见空白的时间轴。本质上,当修改 Health Pickup 对象的z轴旋转值或其他可用于动画的属性时,时间轴会将这些改变记录为关键帧。然后由 Unity 将这些关键整合在一起变为一段完整的动画,就像将电影胶卷上每个独立的画面一起播放就会形成运动的图像一样。

image.png

实践:旋转动画

为了使Health_Pickup 预制体每秒绕着z 轴完整地旋转 360°,可以仅设置三个关键帧,然后让Unity 处理剩下的事情。

(1)单击Record 按钮,开始编辑动画。

(2)将光标置于时间轴的0:00处,保持 Health Pickup 的z轴旋转值为0

(3)将光标置于时间轴的 0:30处,设置 轴旋转值为 180,

(4)将光标置于时间轴的 1:00处,设置z 轴旋转值为360。

(5)单击 Record 按钮,结束动画的编辑

(6)单击 Record 按钮右侧的 Play 按钮,查看整个动画播放效果。

image.png

刚刚发生了什么

现在,Health Pickup 对象每秒会绕着z轴按0°、180”和360%来转,从而实现了循环旋转的效果。如果现在开始游戏,那么上述动画会一直持续下去直到游戏停止。

曲线与切线


除了为对象属性设置动画之外,Unity 还可以使用动画曲线来控制动画随时间进行变化。到目前为止,Animation 窗口一直处于 Dopesheet 模式,可以在Animation窗口的底部进行切换。单击 Curves 标签,你将在右侧看到一条带有一些点的动画曲线这些点可以代替之前记录的关键帧。旋转动画应该是平滑的(表现为动画曲线是线的),因此让一切保持原状即可。通过拖动或调整动画曲线上的点可以在动画运行时加速、减速或者改变动画中的任何点。


尽管动画曲线能够处理好属性怎样随时间变化的问题,但我们还是需要一种方式来修正 Health PickUp 动画重复播放时产生的抖动。我们可以通过修改动画切线来实现目的,因为动画切线控制着一个关键帧是怎样与另一个关键帧融合的。在 Dopesheet模式下,右击任何关键帧

实践:平滑旋转动画

下面调整动画的第一个关键帧和最后一个关键帧的动画切线,使动画在重复播放时可以无缝融合。

(1)在时间轴上右击第一个和最后一个关键的菱形图标,从弹出的菜单中选择Auto。

2)移动Main Camera 到能够看见 Health Pickup 对象的位置,单击 Play 按钮,播放动画时的相机视角

刚刚发生了什么

改变第一个和最后一个关键帧的动画切线为自动方式后,Unity 将使它们之间的变换变得平滑,从而消除了动画循环中开始或结束时的抖动。

粒子系统


当需要制作诸如爆炸或外星飞船的尾焰喷流这种动态效果时,使用 Unity 的粒子特效最合适不过。粒子系统(Particle System)会发射很多精灵图(Sprite)或网格(Mesh)这些就是所谓的粒子,它们共同构成了视觉效果。粒子的属性是可以配置的,例如粒子的颜色,在屏幕上的持续时间。可以将粒子系统创建为独立的对象,也可以将多个粒子系统作为对象组合起来以得到更真实地效果。

实践:添加火光效果

为了将玩家的注意力吸引到场景中放置的可收集对象上,可以为 Health_Pickun对象添加一种简单的粒子特校

(1)在Hierarchy 面板中选择 Create| Effect] Particle System。

(2)将粒子系统放置在 Health Pickup 的中间位置。

3)选中粒子系统并在 Inspector 面板中修改如下属性

  • 将Start Lifetime设置为2。
  • 将Star Speed 设置为0.25。
  • 将Start Size 设置为0.76。
  • 将Start Color 设置为橙色或你想要使用的颜色

(4)展开 Emissions标签并将 Rate over Time 设置为5

(5)展开Shape 标签并将 Shape 设置为 Sphere

695a5b8d32254fe9b22912d7ec15c562.png

总结


本章包含许多对初学者来说很有趣的内容。虽然本书的重点在于 C#语言,但是花些时间来了解游戏开发的整体概念、开发文档以及 Unity 提供的无须编写脚本即可实现的功能也很重要。我们目前并没有深入介绍光照、动画、粒子系统等工具,但是如果你想继续开发Unity 项目,那么花些时间学习这些知识是值得的。


下面将讲解的重点将回到编写 Hero Born 游戏的核心机制上,内容包含设置可移动的玩家对象、控制相机以及理解Unity的物理引擎是如何控制游戏世界的等等。


相关文章
|
4月前
|
存储 自然语言处理 监控
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的Unity官方插件:Localization 。 这个插件方便进行游戏的多语言本地化,让游戏支持多种语言,下面就来看看该插件的使用方法吧!
|
3月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
72 2
|
8月前
|
开发框架 Java .NET
《unity游戏优化》第8章内存优化
《unity游戏优化》第8章内存优化
|
4月前
|
运维 API C#
【Unity游戏破解】外挂原理分析
【Unity游戏破解】外挂原理分析
156 0
【Unity游戏破解】外挂原理分析
|
4月前
|
vr&ar 图形学
【Unity 3D】VR飞机起飞喷火游戏案例实战(附源码和演示视频 超详细)
【Unity 3D】VR飞机起飞喷火游戏案例实战(附源码和演示视频 超详细)
52 0
|
4月前
|
图形学
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
129 0
|
4月前
|
C# 图形学
【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)
【Unity】2D游戏-愤怒的小鸟教学实战(附源码和实现步骤 超详细)
162 1
|
4月前
|
C# 图形学
【Unity 3D】游戏对象、添加删除获取组件、预制体Prefabs简介
【Unity 3D】游戏对象、添加删除获取组件、预制体Prefabs简介
75 0
|
4月前
|
图形学
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
【Unity3D开发小游戏】Unity3D零基础一步一步教你制作跑酷类游戏
|
4月前
|
设计模式 存储 前端开发
【Unity3D日常开发】Unity3d中使用MVC框架
【Unity3D日常开发】Unity3d中使用MVC框架