简述
和现实世界一样,游戏中也包含各种各样的物体,每个物体都有自己的外表。在虚幻引擎中,材质定义了这些外部。它是什么颜色的?有多亮的?是透明的吗?这些都是在材质中定义的。
在虚幻引擎中,几乎所有的外表元素都使用了材质。你可以将材质应用于各种物体,例如网格,粒子和UI元素。
在本教程中,您将学习如何:
1 操作纹理改变它们的亮度和颜色
2 使用材质实例快速改变物体
3 使用动态材质实例改变物体颜色
在本教程中,您将使用材质和蓝图编辑器。如果您不熟悉它们,请阅读我们的入门教程和蓝图教程。
注
:
博主水平有限,如有疑问,请参见 原英文教程
开始
下载 starter project并解压它。打开项目文件夹并打开BananaCollector.uproject。
注意:如果你收到提示,说这个项目是用旧版本的虚幻4创建的,没关系(引擎经常更新)。您可以选择打开副本,也可以选择在合适的位置进行版本转换。
你会看到一个地面上有一些香蕉。使用W、A、S和D键控制一个红色立方体。你可以通过移动来收集香蕉。
首先,你要改变香蕉材质的亮度。先导航到Materials文件夹,双击M_Banana在材质编辑器中打开它。
为了调整香蕉的亮度,你需要控制香蕉的纹理。
操作纹理
基本上,纹理就是图像,图像是像素的集合。在彩色图像中,像素的颜色由它的红色(R)、绿色(G)和蓝色(B)通道来决定。
下面是一个例子,一个2×2图像每个像素的RGB值。
注意:在虚幻引擎中,RGB通道的范围是0.0到1.0。但是,在大多数其他应用程序中,RGB通道的范围是0到255。这些都是表达颜色的不同方法,并不是说虚幻引擎的颜色范围更小。
纹理操作通过对纹理的每个像素执行操作来实现。操作可以简单到为通道添加值。
下面是一个将每个通道缩小到0.4到1.0范围的图例。这样做会提高每个通道的最小值,使每个像素颜色更淡。
下面是材质编辑器里的做法:
接下来,您将使用乘法节点来调整纹理的亮度。
用乘法节点
乘法节点顾名思义:它将一个输入乘以另一个输入。
使用乘法,你可以改变一个像素的亮度而不影响它的色相或饱和度。下面是一个例子,通过将每个通道乘以0.5,将亮度降低一半。
通过在每个像素上执行这个操作,可以改变整个纹理的亮度。
虽然在本教程中没有涉及到,但您可以使用乘法节点与纹理一起使用。这是一个用瓷砖纹理叠加石头纹理的例子:
白色区域的亮度高,因为通道值乘以1。灰色区域较暗,因为通道的值乘以小于1的值。黑色区域没有亮度,因为通道乘以0。
现在是使用乘法节点的时候了。
调整纹理亮度
断开Texture Sample 节点和Base Color 的链接。你可以通过右键点击或者选择断开链接来实现。或者,你也可以按住Alt键,左键点击。
然后在图中空白空间来创建一个Multiply 和一个Constant 节点。然后,把些节点联系在一起:
这个参数设置将每个像素通道乘以常量节点的值。最后,结果纹理被输出为材质的基本颜色。现在,得到的纹理将是黑色的,因为常量被设置为零(乘以零结果为零)。若要更改乘数的值,请选择常量节点并访问详细信息面板。将值字段设置为5.0。
单击Apply 然后返回到主编辑器。你会发现香蕉很亮。
让我们加入一些不同颜色的香蕉来增添趣味。虽然您可以为每种颜色创建一个新材质,但更简单的方法是创建一个材质实例。
关于材质实例
材质实例是一种材质的拷贝。基础材质中的任何改变都是在材质实例中实现的。
材质实例可以在不重新编译的情况下对材质进行更改。当您点击应用于该材质时,您会收到到一个消息,说着色器正在编译。
普通材质的编译过程只需要几秒。然而,在复杂的材质上,编译时间会明显变长。
以下情况是使用材质实例的好时候。
有一个复杂的材质并且想要快速改变?
想要创建一些可变的基础材质。这些可以是任何东西,例如改变颜色,亮度,甚至是纹理本身。下面是一个使用材质实例来改变颜色的场景。所有实例共享相同的基础材质。
在创建实例之前,需要在基础材质中创建参数。这些会出现在你的材质实例中,并且可以调整材质的属性。
创建材质参数
回到材质编辑器,确保你仍在使用M_Banana材质。
首先,您需要一个节点,它将改变纹理的色调。您可以使用hushift节点。在图中添加一个,并将其链接如下:
接下来,需要创建一个Scalar Parameter节点。该节点保存一个值,并将在材质实例中进行编辑。您可以通过按住S键或左击节点图中的空白空间来快速创建一个。一旦创建,将其连接到 HueShift 节点上的Hue Shift Percentage (S)。
给参数命名也是一个好主意。选择Scalar Parameter节点,然后转到详细信息面板。将 Parameter Name更改为HueShiftPercentage。
还可以将convert Constan节点转换为 Scalar Parameters节点。右击前面添加的Constant 节点,然后选择 Convert to Parameter。然后,将参数重命名为亮度。
你现在已经完成了基本材质的参数设置。点击应用,然后关闭材质编辑器。
接下来,您将创建一个材质实例。
创建材质实例
进入内容浏览器,转到Materials 文件夹里。
选中M_Banana 右击弹出菜单,选择 Create Material Instance。将新对象重命名为MI_Banana_Green。
双击MI_Banana_Green打开它,会在材质实例编辑器中打开。
材质实例编辑器由三个面板组成:
1 详细信息面板:您可以在这儿设置一些的参数。
2 实例父类:显示当前实例的父类材质的列表。当前,唯一的父类是M_Banana。
3 视图。包含一个预览网格,它将显示你的材质实例。通过按住左键并移动鼠标来旋转。通过滚动鼠标滚轮来缩放。
要查看香蕉网格上的变化,请查看详细信息面板并找到预览区。左键单击“Preview Mesh ”旁边的下拉菜单,选择SM_Banana。现在你会看到香蕉而不是球。
接下来,您将编辑参数,将香蕉的颜色调整为绿色。为了使参数可编辑,左键单击每个参数旁边的复选框。
设置Brightness 为0.5,HueShiftPercentage为0.2,你得到如下结果
现在您已经创建了您的材质实例,现在是时候将它应用到一些香蕉上了!关闭该材质实例,并进入主编辑器的视图。
使用材质实例
在场景中的Actors 可以单独编辑。这意味着如果你改变一个香蕉的材质,它不会影响其他的香蕉。你可以用这种方法把一些香蕉变成绿色。
选择任意一个香蕉,然后进入详细信息面板。在列表中,选择StaticMesh组件。
修改StaticMesh组件的属性, 将材质修改为MI_Banana_Green。
重复操作,就能得到分布黄色和绿色香蕉了。看看你是否能创造一个新的材质实例来制作一些紫色的香蕉!
动态变化的材质
材质不完全是表达外观,你也可以用它们来做游戏设计。接下来,你将学习当玩家收集更多的香蕉时,方块颜色如何动态地从白色变到到红色的。
在创建材质实例之前,需要设置方块材质。
转到你在Materials 文件夹中,然后双击M_Cube来打开它。
首先,您需要创建颜色。您将看到一个Constant3Vector节点,连接到Base Color上。这个节点非常适合选择颜色,因为它有红色、绿色和蓝色通道。
由于红色已经创建好了,还需要创建白色。添加另一个Constant3Vector节点。您可以左击图中的空白空间来完成此操作。
通过双击Constant3Vector节点,打开颜色选择器。
可以使用滑块或将1.0的值输入到R、G和B通道中,将颜色设置为白色。然后,点击OK按钮。
想要把颜色从白色变成红色,你需要一种平滑过渡的方法。有一种简单的方法是使用linear interpolation(线性插值)。
线性插值是什么?
线性插值是找到a和b之间的值的一种方法,例如,你可以用线性插值来得到介于100和200之间的值。
例如,您可以通过添加alpha值来平滑地将一个值从100过度到200。
在本教程中,您将用收集到的香蕉数量来控制alpha。
应用LinearInterpolate节点
首先,添加一个LinearInterpolate 节点。
接下来,创建一个Scalar Parameter节点并将其命名为ColorAlpha。然后,像这样连接你的节点(注意在顶部是白色的):
概要:LinearInterpolate 节点将输出A值。这是因为alpha 的初始值是0。当alpha趋向1时,将输出接近B的值。
现在材质已经齐全了。还有其他的事情要做,点击应用,然后关闭材质编辑器。如果你按下Paly,你会看到现在立方体是白色的而不是红色的。
要改变立方体的颜色,您需要编辑ColorAlpha参数。然而,有一个问题。当游戏运行时,您不能在一个材质实例编辑参数。解决方案是使用dynamic material instance(动态的材质实例)。
关于动态的材质实例
与一般实例不同,动态的材质实例可以在您游戏过程中改变。你可以使用蓝图或c++。
您可以通过多种方式使用动态实例,比如更改物体的不透明度,使其看不到。或者,当物体变湿时,你可以增强物体的反射率。
动态材质实例的另一个好处是它们可以单独编辑。
下面是一个改变单个实例以屏蔽对象区域的例子。
创建一个动态的材质实例
在内容浏览器中,转到Blueprints文件夹,双击BP_Player打开它。
首先要做的是创建一个新的动态材质实例,然后将它应用到立方体网格中。当虚幻引擎的生成actor时就好了,这是Event BeginPlay节点的作用。
确保您在事件图中,然后找到Event BeginPlay 节点。
现在,添加一个动态材质实例(StaticMesh)节点。该节点将同时创建并使用一种新的动态材质实例给立方体网格。
接下来,您需要指定立方体应该使用哪些材质。点击Source Material 的下拉菜单,选择M_Cube。
为了方便今后引用该材质,最好将其存储在一个变量中。一种简单的方法是在Create Dynamic Material Instance节点上右键Return Value。弹出菜单后,选择Promote to Variable。
如果你看一下”我的蓝图”标签,你会发现你有一个新的变量。重命名为CubeMaterial。你可以通过按F2快捷键完成。
最后,将Event BeginPlay节点链接到 Create Dynamic Material Instance 节点。
概要:一旦虚幻引擎的生成BP_Player,它将创建一个新的动态材质实例,并将其应用于StaticMesh组件。然后,它会将这些材料存储到一个名为CubeMaterial的变量中。
下一步是创建一个计数器来跟踪收集到的香蕉的数量。
创建香蕉计数器
您从 Event BeginPlay 节点往下移一点,您将看到下面的设置。这是你更新香蕉计数器和材质的地方。
当立方体与另一个物体重叠时,On Component Begin Overlap节点将执行。接下来,Cast to BP_Banana节点检查重叠的参与者是否是一个香蕉。如果actor 是一个香蕉,那么它就从游戏中消失。
首先要做的是创建一个变量来存储收集到的香蕉的数量。然后,每次当立方体与香蕉重叠时,变量就会加1。
创建一个新的Float 类型变量,并命名为BananaCounter。将BananaCounter变量拖放到事件图中并选择Get。
想要要将计数器加1,则添加一个IncrementFloat 节点。创建后,把BananaCounter连接到它。
接下来,将DestroyActor 节点连接到IncrementFloat节点。
现在,每当玩家收集一根香蕉是,变量BananaCounter 就会加1。
如果你现在使用BananaCounter作为alpha,你会得到意想不到的结果。这是因为LinearInterpolation 节点需要在0到1的范围内取值。可以进行规一化转换将计数器值控制在0到1的范围内。
为了正规,简单地给BananaCounter设置一个最大值。这个值是玩家想要在立方体完全红色之前收集香蕉的个数。
添加一个float / float节点,并将其顶部的pin连接到IncrementFloat节点底部的pin。
将 float / float 节点的底部输入为6。这意味着玩家一旦收集了够6根香蕉,这个立方体就会彻底变红。
有一个小问题。当玩家收集超过6根香蕉时,你会得到一个大于1的。要解决这个问题,要使用Clamp (float) 节点将alpha值保持在0到1的范围内。
添加一个Clamp (float)节点,并将Value pin连接到 float / float节点上。
现在,你有了一个alpha值了,可以把它设置到材质上了。
更新的材质
将CubeMaterial变量拖动到事件节点图中并选择Get。
接下来,将CubeMaterial变量的pin拖放到一个空白的空间上,然后释放左击。这会生成一个节点列表,选择的任何节点都会自动链接到该变量。添加一个Set Scalar Parameter Value节点。这个节点设置给定的参数。
现在,您需要指定更新的参数。将Parameter Name 设置为ColorAlpha。这是您在立方体材质中创建的参数。
将 Clamp (float) 节点的结果链接到Set Scalar Parameter Value node.
节点的Value pin上。
最后,将IncrementFloat节点链接到Set Scalar Parameter Value节点上。
以下是执行顺序:
1。On Component Begin Overlap (StaticMesh)节点在立方体网格与另一个物体重叠时执行。
2。Cast to BP_Banana:检查重叠的actor是不是香蕉。
3 DestroyActor:如果重叠的actor是一个香蕉,将它销毁。
4 ncrementFloat:将变量BananaCounter加1。
5。float / float:将计数器除以指定的数字以使其归一化化。
6。Clamp (float) 得到的结果是一个不高于1的值。
7 Set Scalar Parameter Value。设置ColorAlpha参数值:将立方体材质的ColorAlpha参数设置为所提供的值。
是时候测试一下了!单击Compile,然后关闭蓝图编辑器。
点击play开始收集香蕉。这个立方体刚开始是白色的,当你收集香蕉时,它会逐渐变红。一旦你收集了6根香蕉,它就会彻底变红。