带你读《Unity游戏开发(原书第3版)》之三:模型、材质和纹理

简介: 本书主要介绍Unity2018的使用和游戏开发流程中涉及的各种知识。每一章的结构特别清晰,先综述该章要介绍的内容,然后一步步深入讲解,中间穿插着很多动手做的实践操作,可以让读者加深对某个概念、方法的理解,每章的最后还有一个小测验和一个稍微大一点的实践练习,用于巩固该章的学习内容。

点击查看第一章
点击查看第二章

第3章

模型、材质和纹理
在本章中,你将学习关于模型的知识以及如何在 Unity 中使用它们。首先你需要了解网格和3D对象的基本原理。接下来,学习如何导入自己的模型或者使用从Asset Store中 获得的模型。最后我们将探讨Unity的材质和着色器功能。

3.1 模型的基础知识

如果没有图形组件,视频游戏肯定不会有那么好的效果。在2D游戏中,图形由称为精灵(Sprite)的平面图像组成。你只需改变这些精灵的X坐标和Y坐标的位置并按顺序翻转其中几个精灵,就可以欺骗观众的眼睛,让他们相信自己看到的是真正的运动和动画。但是,在3D游戏中,事情没有那么简单。在具有第三根轴的世界里,对象需要具有体积才能欺骗眼睛。由于游戏中包含大量的对象,所以我们需要快速处理出现的事情。网格,简单地说就是一系列互连的三角形。这些三角形彼此相连,构成了条带,然后组成基本的形状,最后再构成复杂的图形。这些条带提供了模型的3D定义,可以非常快地进行处理。尽管如此,也不要担心,Unity 会帮你处理好一切,不必你亲自管理它。在本章的后面,你将会看到三角形怎样组成了 Unity Scene 视图中的各种形状。
注意:为什么是三角形?
你可能想知道为什么 3D 对象完全由三角形组成。答案很简单:计算机将图形按照一系列的点来处理,也就是我们通常说的顶点。对象所具有的顶点越少,绘制速度就越快。三角形具有两个性质让人们非常喜欢。第一个性质是当有了一个三角形的情况下,只需要再添加另一个顶点,就可以创建一个新三角形。所以创建一个三角形需要3个顶点,创建两个三角形只需要4个点,创建3个三角形只需要5个顶点。这使得它们非常高效。另一个性质是:通过使用这种三角形联合在一起形成的形状,你可以对任何3D对象进行建模。其他任何形状都不具备这样的灵活性和性能。
注意:术语:模型还是网格
术语模型(model)和网格(mesh)很相似。通常可以互换使用它们。不过,它们之间也有区别。网格包含定义3D对象的形状的顶点信息。当我们谈论模型的形状或形式时,实际上说的是网格。因此,网格也称作模型的地理信息,所以模型就是包含网格的对象。
模型使用网格定义它的维度,但它也可以包含动画、纹理、材质、着色器及其他网格。一般的规则是:如果一个对象包含除顶点信息以外的任何其他内容,那么它就是模型,否则就是网格。
注意:2D
本章主要讨论渲染3D对象相关的内容,如果只想制作2D游戏,那么什么内容最实用呢?还需要学习本章的知识(或者说任何有关3D的内容)吗?当然需要!就像我们在第2章中说到的那样,根本就没有纯粹的2D游戏。精灵只不过是作用于平面的3D对象。灯光也可以应用在2D对象上。甚至2D和3D使用的摄像机都是一样的。这里学到的所有内容都可以应用在2D游戏中,因为2D游戏包含在3D游戏内。使用Unity勤加练习,你会发现2D游戏和3D游戏的界限非常模糊。

3.1.1 内置的3D对象

Unity有几种基本的内置网格(或图元)可以使用。它们提供了一些简单的形状,可以用在简单的功能上,或者将它们组合在一起构建复杂的对象。图3-1显示了可用的内置网格(前面的章节中我们已经接触过立方体和球体)。
提示:使用简单的网格建模
你是否遇到过在游戏中需要一个复杂的对象,但却找不到合适的模型的情况?在 Unity 中嵌套对象可以让你轻松地使用内置的网格创建简单的模型。只需把网格挨着放在一起,让它们组成你想要的模型的粗略外观即可。然后把所有的对象都嵌套在一个中心对象之下。这样,当移动父对象时,所有的子对象也会被移动。这可能不是在游戏中创建模型的最优雅的方式,但它在原型制作的过程中非常实用。

image.png

3.1.2 导入模型

内置的模型很不错,但是大多数时间,游戏需要复杂的艺术资源。幸好,Unity允许将你自己的3D模型导入到项目中。操作非常简单,只需把包含3D模型的文件放入Assets文件夹中,就导入到项目中了。之后,可以把它拖入场景或层次结构中,围绕它构建游戏对象。Unity天生支持.fbx、.dae、.3ds、.dxf和.obj文件,所以基本上你能够使用几乎所有的3D建模工具。
导入自己的3D模型
按照下面的步骤操作,就可以将自定义的3D模型导入到Unity项目当中。

  1. 创建一个新的Unity项目或场景。
  2. 在Project视图中,在Assets文件夹下创建一个名为Models的新文件夹,右键单击Assets 文件夹,然后选择Create > Folder命令。
  3. 在本书配套文件的Hour 3 文件夹中找到Torus.fbx 文件。
  4. 将操作系统的文件管理器和Unity编辑器并排摆放,在文件管理器中单击Torus.fbx文件,然后把它拖到你在第2步中创建的Models文件夹中。在Unity里单击Models文件夹,查看新的Torus文件。如果操作正确,Project视图将类似于图3-2中展示的样子。(注意:如果你使用的是早期版本的Unity,或者更改了Unity设置,可能会发现自动创建了一个Materials文件夹。遇到这种情况不要慌张,我们会在后面的章节介绍材质相关的知识。)
  5. 将Torus从Models文件夹拖到Scene视图中。注意Torus游戏对象添加到场景中的时候包含一个网格过滤器和一个网格渲染器。这两个组件可以让Torus对象显示在屏幕上。
  6. 当前场景中的Torus非常小,所以我们在项目视图中选中Torus资源,然后在Inspector视图中查看。将缩放系数从1改为100,然后点击Inspector下面的Apply按钮。

image.png

警告:网格默认的缩放大小
Inspector视图中网格的大多数选项都是高级选项,我们不会很快讲解它们的用法。现在我们感兴趣的属性是比例因子。不同的软件可能有不同的缩放比例。默认情况下,Unity将一个单元作为一米,其他软件,比如说Blender可能将一个单元视为一厘米。一般情况下,当你导入一个模型的时候,Unity会自动推断导入的模型的缩放比例。有的时候,比如在本例中,它就没有正确推断,所以需要你手动调节缩放系数。将缩放系数从1更改到100,也就是告诉Unity将模型放大100倍,从而将以厘米为单位的模型转化为以米为单位的模型。

3.1.3 模型和Asset Store

你不需要成为建模专家也能使用 Unity 创建游戏。Asset Store 提供了一种简单有效的方式来查找预制的模型并把它们导入到项目中。一般来说,Asset Store 上的模型分免费或付费两种,它们要么是独自发布,要么存在于相似模型的集合中。一些模型自带纹理,还有一些只包含网格数据。
在Asset Store中下载模型资源
让我们学习如何从 Unity Asset Store 中查找和下载模型。按照下面的步骤操作,找到一个名为 Robot Kyle的模型,然后把它导入到我们的场景中。

  1. 创建一个新场景(使用File > New Scene 命令)。在Project 视图的搜索栏中输入Robot Kyle t:Model(见图3-3)。
  2. 在搜索筛选区域中,单击Asset Store按钮(如图3-3所示)。如果看不到这个按钮,那么可能需要调整编辑器窗口或者Project视图窗口的大小,当然,也需要保证因特网处于连接的状态。

image.png

  1. 选中Unity Technologies发布的名为Robot Kyle的模型。选中一个资源,然后在Inspector视图中就可以查看发布者的信息(见图3-4)。

image.png

  1. 在 Inspector 视图中,单击 Import Package按钮。此时,可能需要你提供Unity账户凭证(Account Credential)。如果这一步操作有困难,没关系,随书资源中我已经附带了这个资源,只需要导入它即可。
  2. 打开Import Package 对话框后,保持一切都处于选中状态,并选择Import。

6.在Assets > Robot Kyle > Model 下找到机器人模型,然后把它拖到Scene视图中,注意此时模型在Scene视图中可能相当小,需要靠近一些才能查看它。

3.2 纹理、着色器和材质

对于不熟悉过程的新手来说,将图形应用到3D模型的过程可能会让人产生畏难情绪。Unity提供了一种简单、特定的工作流程,它能让你精确掌控物体的表现,这种能力相当强大。图形资源可以分解为纹理、着色器和材质。每个概念都会在单独的一节中介绍,图3-5 显示了它们是如何密切协作的。注意,纹理并不会直接应用于模型,而是把纹理和着色器应用于材质。然后再把那些材质应用于模型。这样,无须许多工作就能快速、干净地替换或修改模型的外观。

image.png

3.2.1 纹理

纹理是应用于 3D 对象的平面图像。它们负责将模型变成色彩斑斓令人着迷的游戏对象,而不是单调生硬的形状。将2D图像应用于3D模型听上去可能有些奇怪,但是一旦你熟悉了这个过程,就会发现它真的很直观。我们来看一个汤罐头。如果你取下罐头的标签,就会看到它是一张平面的纸。这个标签就像是纹理。打印完标签之后,用它将罐头包装起来,这样就能够吸引顾客的目光。
和所有其他的资源一样,很容易在 Unity 项目中添加纹理。首先为纹理创建一个文件夹,Textures 是一个不错的文件夹名。然后把想要添加到项目中的纹理拖到你刚刚创建的Textures文件夹中。大功告成!
注意:展开操作
将纹理的工作过程想象成罐头的包装固然不错,但是更复杂的对象应该如何操作呢?在创建一个错综复杂的模型时,生成所谓的展开(unwrap)是一种常见的做法。展开有点像贴图,它准确显示了平面纹理将如何包装在模型周围。如果查看本章前面 Robot Kyle下的 Textures 文件夹,就会看到一个Robot_Color纹理。它看上去比较奇怪,这是因为它是用于模型的unwrap纹理。unwrap、模型和纹理的生成是一种艺术,本书不会讨论它们。现在这个阶段,初步了解它们的工作原理就足够了。
警告:怪异的纹理
在本章后面将对模型应用一些纹理。你可能会发现纹理有点弯曲或者在朝着错误的方向往上翻转,现在我们只需知道这并不是什么错误即可。将一个基本的矩形2D纹理应用到模型上,就会出现这个问题。模型不知道哪种方式是正确的,因此它将尽其所能地应用纹理。如果想避免这个问题,可以使用为正在制作的模型设计的专门的纹理。

3.2.2 着色器

如果模型的纹理决定了它在表面上绘制什么内容,那么着色器就确定了如何绘制纹理。还有一种看待着色器用途的方式:材质是你和着色器之间的接口。材质告诉你着色器如果要绘制对象需要什么东西,你提供它想要的资源,这样它就可以按照你想要的方式绘制对象。现在还有些难以想象,但是后面当我们创建材质时,你就会理解它们是如何工作的。因为无法在没有材质的情况下创建着色器,本章后面将会介绍大量关于着色器的知识。事实上,关于材质要学习的大量内容实际上是材质的着色器的知识。
提示:思考练习
如果你现在理解着色器的工作方式比较费力,那么可以考虑下面这种场景:假设你有一块木头。木头的物理性是它的网格。颜色、质地和可见的元素就是它的纹理。现在拿起木头,往上浇一些水。木头的网格还是原来的网格,它还是由原来的材料(木头)组成,但是看上去有些不同。它稍微暗了一点并且富有光泽。这个例子中有两个“着色器”:干木头和湿木头。湿木头“着色器”添加了一些东西,让它看起来有些不同,但实际上并没有改变它。

3.2.3 材质

如前所述,材质差不多就是可以应用于模型的着色器和纹理的容器。自定义材质的大部分工作就是为它选择着色器,尽管所有的着色器都具有一些共同的功能。
要创建一种新材质,首先要创建一个Materials文件夹。然后右键单击该文件夹,再选择Create > Material 命令。给材质起个有意义的名称,这样就可以了。图3-6展示了两个使用不同着色器设置的材质。注意它们都使用了Standard着色器。每种设置的albedo(后面会详细介绍)颜色都设置为白色,但是它们的Smoothness设置不同。Flat材质的Smoothness值低一些。所以光看起来特别平,因为光会漫反射。Shiny材质的Smoothness值高,它创建了比较强的灯光效果。两种材质都可以预览,所以你可以看到它在模型上将会如何显示。

image.png

3.2.4 着色器进阶

我们已经学习了纹理、模型和着色器,现在学习怎样把它们结合在一起。Unity有一个非常强大的Standard着色器,这也是本书讲解着色器的重点所在。表3-1 展示了常见的着色器属性。除了表3-1列出的属性外,Standard着色器还有很多其他属性,但是本书主要关注列表中的这些属性。
看上去似乎有许多知识要学习,但是一旦你对纹理、着色器和材质的基础知识变得更熟悉,你会发现对这些属性的理解也就更加深刻了。

image.png

Unity还有本书没有囊括的很多其他着色器,Standard着色器的灵活性非常高,足以满足你的基础需求。
对模型应用纹理、着色器和材质
让我们按照下面的步骤把所掌握的关于纹理、着色器和材质的所有知识结合起来,创建一个看上去相当不错的砖墙效果。

  1. 创建一个新项目或场景。注意:创建新项目将会关闭并重新打开编辑器。
  2. 创建一个Textures和一个Materials文件夹。
  3. 在本书配套文件中找到 Brick_Texture.png 文件,并把它拖到在第2步中创建的Textures文件夹中。
  4. 向场景中添加一个立方体,将它放置在(0, 1, –5)处,并将它的缩放比例设置为(5, 2, 1)。图3-7显示了现在这个立方体的属性。

image.png

  1. 创建一种新材质(右键单击Materials 文件夹,然后选择Create > Material 命令),最后将它命名为BrickWall。
  2. 将着色器设置为Standard,在Main Maps中单击单词Albedo左边的小圆圈按钮图标,然后在弹出式窗口中选择Brick_Texture。
  3. 把砖墙材质从Project视图中拖到Scene视图中的立方体上。
  4. 注意纹理被拉伸得有些超出了墙面,首先选择材质,然后把拼贴的x值改为3,请确保这个操作是在Main Maps中进行,而不是Secondary Maps。现在墙面看上去好多了。现在场景中就有了一堵带有纹理的砖墙。图3-8显示了最终的效果。

    image.png

3.3 本章小结

在本章中,我们认识了 Unity 中的模型。首先学习了如何利用称为顶点的集合也就是网格构建模型。然后,学习了如何使用内置的模型,导入你自己的模型,以及从Asset Store 下载模型。接着学习了 Unity 中的给模型贴图的工作流程,体验了纹理、着色器和材质的使用,最后通过创建一块纹理化的砖墙结束了本章的学习。

3.4 问答

问:如果我不是艺术家,那我还能够制作游戏吗?
答:绝对可以。使用免费的在线资源和Unity Asset Store,可以找到各种艺术资源放到游戏中。
问:我需要知道如何使用所有内置的着色器吗?
答:不用。许多着色器的使用场景非常有限。先学会本章中介绍的着色器,如果游戏项目需要,可以再学习使用更多的着色器。
问:如果 Unity Asset Store 中有付费的艺术资源,这意味着我可以出售自己的艺术资源吗?
答:是的,可以这样做。事实上,并不仅限于艺术资源。如果你可以创建高质量的其他资源,也可以在商店里出售它们。

3.5 测验

花些时间完成下面的练习,确保掌握了本章的内容。
问题

  1. 判断题:因为方形很简单,所以使用方形作为模型的网格。
  2. Unity支持什么3D模型文件格式?
  3. 判断题:Unity Asset Store里面只有收费资源。
  4. 解释纹理、着色器和材质的关系。

答案

  1. 错,网格是由三角形组成的。
  2. .fbx、 .dae、 .3ds、.dxf以及.obj 文件。
  3. 错,里面有很多免费资源。
  4. 材质包含纹理和着色器,着色器用于确定材质的属性以及材质的渲染方式。

3.6 练习

在这个练习中,我们将体验着色器对模型的外观所产生的影响。每种模型使用相同的网格和纹理,只有着色器是不同的。这个练习中创建的项目命名为 Hour3_Exercise,可以在本书配套文件的Hour 3文件夹中找到它。

  1. 创建一个新场景或新项目。
  2. 在项目中添加一个Materials 和一个Textures 文件夹。在本书配套文件的Hour 3 文件夹中找到Brick_Normal.png和Brick_Texture.png文件,把它们拖到Textures文件夹中。
  3. 在Project视图中,选择Brick_Texture。在Inspector视图中,把aniso级别改为3,提高曲线的纹理质量。然后单击Apply按钮。
  4. 在Project视图中,选择Brick_Normal。在Inspector视图中,把纹理类型改为Normal Map。然后单击Apply按钮。
  5. 在Hierarchy视图中选择定向灯光,把它的位置设置为(0, 10, –10),旋转角度设置为(30, –180, 0)。
  6. 在项目中添加4 个球体,并把它们的缩放比例都设置为(2, 2, 2)。然后把它们的位置分别设置为(1, 2, –5)、(–1, 0, –5)、(1, 0, –5)和(–1, 2, –5),这样就可以把它们分散开。
  7. 在 Materials 文件夹中创建4种新材质,并把它们分别命名为 DiffuseBrick、SpecularBrick、BumpedBrick和BumpedSpecularBrick。图3-9展示了4种材质对应的属性,将这个四种材质的属性按照图设置它们的值。

image.png

  1. 将每种材质分别拖到4个球体上。注意球体的灯光和曲度怎样与不同的着色器交互。记住,可以在Scene视图中移动,从不同的角度查看球体。
相关文章
|
3月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
203 3
|
3月前
|
图形学 开发工具 git
Unity与版本控制:游戏开发团队如何利用Git打造高效协作流程,实现代码管理的最佳实践指南
【8月更文挑战第31天】版本控制在软件开发中至关重要,尤其在Unity游戏开发中,能提升团队协作效率并避免错误。本文介绍如何在Unity项目中应用版本控制的最佳实践,包括选择Git、配置项目以排除不必要的文件、组织项目结构、避免冲突、规范提交信息以及使用分支管理开发流程,从而提高代码质量和团队协作效率。
275 1
|
4月前
|
图形学 机器学习/深度学习 人工智能
颠覆传统游戏开发,解锁未来娱乐新纪元:深度解析如何运用Unity引擎结合机器学习技术,打造具备自我进化能力的智能游戏角色,彻底改变你的游戏体验——从基础设置到高级应用全面指南
【8月更文挑战第31天】本文探讨了如何在Unity中利用机器学习增强游戏智能。作为领先的游戏开发引擎,Unity通过ML-Agents Toolkit等工具支持AI代理的强化学习训练,使游戏角色能自主学习完成任务。文章提供了一个迷宫游戏示例及其C#脚本,展示了环境观察、动作响应及奖励机制的设计,并介绍了如何设置训练流程。此外,还提到了Unity与其他机器学习框架(如TensorFlow和PyTorch)的集成,以实现更复杂的游戏玩法。通过这些技术,游戏的智能化程度得以显著提升,为玩家带来更丰富的体验。
66 1
|
4月前
|
缓存 图形学
Unity3D学习笔记12——渲染纹理
Unity3D学习笔记12——渲染纹理
41 2
|
4月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
46 2
|
3月前
|
图形学 开发者
透视与正交之外的奇妙视界:深入解析Unity游戏开发中的相机与视角控制艺术,探索打造沉浸式玩家体验的奥秘与技巧
【8月更文挑战第31天】在Unity中,相机不仅是玩家观察游戏世界的窗口,更是塑造氛围和引导注意力的关键工具。通过灵活运用相机系统,开发者能大幅提升游戏的艺术表现力和沉浸感。本文将探讨如何实现多种相机控制,包括第三人称跟随和第一人称视角,并提供实用代码示例。
151 0
|
3月前
|
图形学 开发者
【独家揭秘】Unity游戏开发秘籍:从基础到进阶,掌握材质与纹理的艺术,打造超现实游戏视效的全过程剖析——案例教你如何让每一面墙都会“说话”
【8月更文挑战第31天】Unity 是全球领先的跨平台游戏开发引擎,以其高效性能和丰富的工具集著称,尤其在提升游戏视觉效果方面表现突出。本文通过具体案例分析,介绍如何利用 Unity 中的材质与纹理技术打造逼真且具艺术感的游戏世界。材质定义物体表面属性,如颜色、光滑度等;纹理则用于模拟真实细节。结合使用两者可显著增强场景真实感。以 FPS 游戏为例,通过调整材质参数和编写脚本动态改变属性,可实现自然视觉效果。此外,Unity 还提供了多种高级技术和优化方法供开发者探索。
57 0
|
3月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
142 0
|
3月前
|
图形学 开发者 搜索推荐
Unity Asset Store资源大解密:自制与现成素材的优劣对比分析,教你如何巧用海量资产加速游戏开发进度
【8月更文挑战第31天】游戏开发充满挑战,尤其对独立开发者或小团队而言。Unity Asset Store 提供了丰富的资源库,涵盖美术、模板、音频和脚本等,能显著加快开发进度。自制资源虽具个性化,但耗时长且需专业技能;而 Asset Store 的资源经官方审核,质量可靠,可大幅缩短开发周期,使开发者更专注于核心玩法。然而,使用第三方资源需注意版权问题,且可能需调整以适应特定需求。总体而言,合理利用 Asset Store 能显著提升开发效率和项目质量。
83 0
|
4月前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
142 0