从零开始做一款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的物理引擎是如何控制游戏世界的等等。


相关文章
|
3月前
|
机器学习/深度学习 人工智能 图形学
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
412 9
|
3月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
1073 6
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
1668 6
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
979 4
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
1001 3
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
921 3
|
vr&ar 图形学 API
Unity与VR控制器交互全解:从基础配置到力反馈应用,多角度提升虚拟现实游戏的真实感与沉浸体验大揭秘
【8月更文挑战第31天】虚拟现实(VR)技术迅猛发展,Unity作为主流游戏开发引擎,支持多种VR硬件并提供丰富的API,尤其在VR控制器交互设计上具备高度灵活性。本文详细介绍了如何在Unity中配置VR支持、设置控制器、实现按钮交互及力反馈,结合碰撞检测和物理引擎提升真实感,助力开发者创造沉浸式体验。
914 1
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
1460 0
|
图形学 开发者
【独家揭秘】Unity游戏开发秘籍:从基础到进阶,掌握材质与纹理的艺术,打造超现实游戏视效的全过程剖析——案例教你如何让每一面墙都会“说话”
【8月更文挑战第31天】Unity 是全球领先的跨平台游戏开发引擎,以其高效性能和丰富的工具集著称,尤其在提升游戏视觉效果方面表现突出。本文通过具体案例分析,介绍如何利用 Unity 中的材质与纹理技术打造逼真且具艺术感的游戏世界。材质定义物体表面属性,如颜色、光滑度等;纹理则用于模拟真实细节。结合使用两者可显著增强场景真实感。以 FPS 游戏为例,通过调整材质参数和编写脚本动态改变属性,可实现自然视觉效果。此外,Unity 还提供了多种高级技术和优化方法供开发者探索。
370 0