Ilingis 发表于 2022-6-22 14:57

Unreal Engine 4 Tutorial 03 材质

资源与声明:

1-本文章部分图片与文字来源 Tommy Tran《Unreal Engine 4 Tutorial for Beginners》
https://www.raywenderlich.com/663-unreal-engine-4-blueprints-tutorial
本文章提供自己的见解看法,与学习笔记,如有侵权 欢迎联系删除,若文章有误,欢迎指正讨论;
本章教程主要实现的是一个玩家(Actor)吃香蕉的游戏,有点像神庙逃亡类型跑酷游戏的吃金币;
关键点有两个:
1-用蓝图修改香蕉的颜色。
2-在香蕉消失的时候计数,让玩家的材质动态改变。

1-静态材质修改

下载启动项目并解压缩。要打开项目,请转到项目文件夹并打开BananaCollector.uproject。
注意:如果您收到一条消息说项目是使用早期版本的虚幻编辑器创建的,那没关系(引擎经常更新)。您可以选择打开副本的选项,也可以选择就地转换的选项。
您将看到一个包含香蕉的小区域。按Play使用W、A、S和D键控制红色立方体。您可以通过移动来收集香蕉。


首先,您将修改香蕉材质以更改其亮度。导航到Materials文件夹并双击M_Banana在材质编辑器中打开它。


要调整香蕉的亮度,您需要操纵它的纹理。


1-1处理纹理

在最基本的情况下,纹理是图像,图像是像素的集合。在彩色图像中,像素的颜色由其红色 (R)、绿色 (G)和蓝色 (B)通道决定。
下面是一个 2×2 图像的示例,每个像素的 RGB 值都被标记。


注意:在虚幻引擎中,RGB 通道的范围是 0.0 到 1.0。但是,在大多数其他应用程序中,RGB 通道的范围是 0 到 255。这些只是显示相同信息的不同方式,并不意味着虚幻引擎的颜色范围更小。
纹理操作通过对纹理的每个像素执行操作来工作。操作可以像为通道添加值一样简单。
<hr/>Clamp法
下面是将每个通道钳制在 0.4 到 1.0 范围内的示例。这样做会提高每个通道的最小值,从而使每种颜色更亮。


以下是您在材质编辑器中的操作方式:



接下来,您将使用Multiply节点来调整纹理的亮度。
<hr/>Multiply点乘法
Multiply 节点顾名思义:它将一个输入乘以另一个输入。
使用乘法,您可以更改像素的亮度而不影响其色调或饱和度。下面是通过将每个通道乘以 0.5 将亮度降低一半的示例。


通过对每个像素执行此操作,您可以更改整个纹理的亮度。


尽管本教程中没有介绍,但您可以将 Multiply 节点与遮罩纹理结合使用。使用遮罩,您可以指定基础纹理的哪些区域应该更暗。这是使用瓷砖纹理遮盖石头纹理的示例:



掩蔽有效,因为灰度代表 0(黑色)到 1(白色)的范围。


白色区域具有全亮度,因为通道乘以 1。灰色区域更暗,因为通道乘以小于 1 的值。黑色区域没有亮度,因为通道乘以 0。
现在,是时候使用乘法节点了。
1-2调整纹理亮度

断开Texture Sample节点和Base Color引脚之间的链接。您可以通过右键单击任一引脚并选择Break Link(s)来执行此操作。或者,您可以按住Alt键并左键单击电线。


创建一个乘法和一个常数节点。您可以通过按住M键(用于 Multiply 节点)或1键(用于 Constant 节点)然后左键单击图表中的空白区域来快速创建这些。之后,像这样链接所有内容:


此设置将遍历每个像素并将每个通道乘以Constant节点的值。最后,将生成的纹理作为Base Color输出。
现在,生成的纹理将是黑色的,因为乘数设置为零(乘以零结果为零)。要更改乘数的值,请选择Constant节点并转到 Details 面板。将值字段设置为5。


单击应用,然后返回主编辑器。你会看到香蕉现在亮了很多。



让我们通过添加一些不同颜色的香蕉来调味。尽管您可以为每种颜色创建新材质,但更简单的方法是创建材质实例。
1-3材质实例

关键就是,整几个可变的参数,能让我们对一个材质做少部分的个性化修改;提高性能;
so 我们需要提出参数与创建实例;

材质实例是材质的副本。在基础材质中所做的任何更改也会在材质实例中进行。
材质实例很棒,因为您可以在不重新编译的情况下对它们进行更改。当您在材质中单击应用时,您可能已经注意到一条通知,说明着色器正在编译。


这个过程在基本材料上只需要几秒钟。然而,在复杂的材料上,编译时间会显着增加。


在以下情况下使用材质实例是个好主意:

[*]拥有复杂的材料并希望快速进行更改
[*]想要创建基础材料的变体。这些可以是任何东西,例如改变颜色、亮度甚至纹理本身。
下面是一个使用材质实例创建颜色变化的场景。所有实例共享相同的基础材料。


在创建实例之前,您需要在基础材质中创建参数。这些将显示在您的材质实例中,并允许您调整材质的属性。
1-4创建材料参数

返回材质编辑器并确保您仍在M_Banana材质中。
首先,您需要一个可以改变纹理色调的节点。您可以为此使用HueShift节点。将一个添加到您的图表并像这样链接它:


接下来,您需要创建一个标量参数节点。该节点包含一个值,并且可以在材质实例中进行编辑。您可以通过按住S键并左键单击图表中的空白区域来快速创建一个。创建后,将其连接到HueShift节点上的Hue Shift Percentage (S)引脚。


命名参数也是一个好主意。选择标量参数节点,然后转到详细信息面板。将参数名称更改为HueShiftPercentage。


您还可以将常量节点转换为标量参数。右键单击之前添加的Constant节点,然后选择Convert to Parameter。之后,将参数重命名为Brightness。


您现在已经完成了基础材料的参数化。单击应用,然后关闭材质编辑器。
接下来,您将创建一个材质实例。
1-5创建材质实例

转到 Content Browser 并确保您位于Materials文件夹中。右键单击M_Banana并选择Create Material Instance。将新资产重命名为MI_Banana_Green。


双击MI_Banana_Green打开它。这将在材质实例编辑器中打开它。
材质实例编辑器由三个面板组成:



[*]详细信息:这是您的参数和其他常规设置将出现的位置
[*]实例父级:显示当前实例的父级材质列表。在这种情况下,唯一的父母是M_Banana
[*]视口:包含将显示您的材质实例的预览网格。按住左键并移动鼠标来旋转相机。通过滚动鼠标滚轮进行缩放。
要查看香蕉网格上的更改,请转到“详细信息”面板并找到“预览”部分。左键单击Preview Mesh旁边的下拉菜单,然后选择SM_Banana。您现在将看到香蕉网格而不是球体。


接下来,您将编辑参数以将香蕉的颜色调整为绿色。要使参数可编辑,请左键单击每个参数旁边的复选框。


将Brightness设置为0.5并将HueShiftPercentage设置为0.2。你最终会得到这个:


现在您已经创建了材质实例,是时候将它应用于一些香蕉了!关闭材质实例并转到主编辑器中的视口。
1-6应用材质实例

您放置到场景中的演员可以单独编辑。这意味着如果您更改一根香蕉的材料,它不会影响其他香蕉。您可以使用此行为将一些香蕉更改为绿色。
选择任何香蕉,然后转到详细信息面板。在组件列表中,选择StaticMesh组件。


Details 面板将使用StaticMesh组件的属性进行更新。将材质更改为MI_Banana_Green。


重复这个过程几次,以获得更好的黄色和绿色香蕉分布。看看你是否可以创建另一个材质实例来制作一些紫色香蕉!


2-玩家动态材质

2-1创建插值的参数

材料不必完全是装饰性的;您也可以使用它们来辅助游戏设计。接下来,您将学习如何在玩家收集更多香蕉时将立方体的颜色从白色动态更改为红色。
在创建材质实例之前,您需要设置立方体材质。
确保您位于Materials文件夹中,然后双击M_Cube将其打开。
首先,您需要一种创建颜色的方法。您将看到连接到Base Color的Constant3Vector节点。这些节点非常适合挑选颜色,因为它们具有红色、绿色和蓝色通道。


由于已经创建了红色,您将创建白色。添加另一个Constant3Vector节点。您可以通过按住3键并左键单击图表中的空白区域来快速执行此操作。
双击Constant3Vector节点调出颜色选择器。


通过使用滑块或在R、G和B通道中输入值1.0将颜色设置为白色。之后,按OK按钮。


要将颜色从白色更改为红色,您需要一种在它们之间平滑过渡的方法。一个简单的方法是使用线性插值。
什么是线性插值?
线性插值是一种查找 A 和 B 之间值的方法。例如,您可以使用线性插值来查找介于 100 和 200 之间的值。


当您控制 Alpha 时,线性插值变得更加强大。您可以将 alpha 视为 A 和 B 之间的百分比。 0 的 alpha 将返回 A,而 1 的 alpha 将返回 B。
例如,您可以随时间增加 Alpha,以将对象从 A 点平滑地移动到 B 点。



在本教程中,您将使用收集的香蕉数量来控制 alpha。
使用 LinearInterpolate 节点
首先,添加一个LinearInterpolate节点。您可以通过按住L键并左键单击图表中的空白区域来快速执行此操作。


接下来,创建一个Scalar Parameter节点并将其命名为ColorAlpha。然后,像这样连接你的节点(注意现在顶部是白色的):
这个ColorAlpha 非常重要,后面会自动检测这个参数名;我们在Player的蓝图中会自定义这个参数的变化;


摘要:LinearInterpolate节点将输出A输入的值。这是因为alpha的初始值为0。随着alpha接近1,输出将接近B输入的值。
材料现已完成。还有更多工作要做,但要查看您目前所处的位置,请单击应用,然后关闭材质编辑器。如果按Play,您将看到立方体现在是白色而不是红色。


要使立方体改变颜色,您需要编辑ColorAlpha参数。但是,有一个问题。游戏运行时,您无法编辑材质实例的参数。解决方案是使用动态材质实例。
2-2动态材质实例的案例

与常规实例不同,您可以在游戏过程中编辑动态材质实例。您可以使用蓝图或 C++ 来执行此操作。
您可以通过多种方式使用动态实例,例如更改对象的不透明度以使其不可见。或者,您可以在物体变湿时增加其镜面反射率。



动态材质实例的另一个好处是您可以单独编辑它们。
下面是更新单个实例以屏蔽对象区域的示例。 还有这种燃烧效果;


让我们从创建一个动态材质实例开始。
2-3创建动态材质实例

您只能在游戏过程中创建动态材质实例。您可以使用蓝图(或 C++)来执行此操作。
在 Content Browser 中,转到Blueprints文件夹并双击BP_Player将其打开。


您要做的第一件事是创建一个新的动态材质实例,然后将其应用于立方体网格。在 Unreal 生成 actor 时执行此操作是个好主意,这是Event BeginPlay节点的用途。
确保您在 Event Graph 中,然后找到Event BeginPlay节点。


现在,添加一个Create Dynamic Material Instance (StaticMesh)节点。该节点将同时创建一个新的动态材质实例并将其应用于立方体网格。


接下来,您需要指定立方体应使用的材料。单击Source Material下的下拉菜单并选择M_Cube。
这里就把这个动态材质和立方体呼应上了;


为了以后轻松引用该材料,最好将其存储在一个变量中。一个简单的方法是右键单击Create Dynamic Material Instance节点上的Return Value引脚。然后,选择提升为变量。


如果您查看 My Blueprint 选项卡,您会注意到您有一个新变量。将其重命名为CubeMaterial。您可以通过按F2键快速执行此操作。


最后,将Event BeginPlay节点链接到Create Dynamic Material Instance节点。


总结:一旦 Unreal 生成BP_Player,它将创建一个新的动态材质实例并将其应用到StaticMesh组件。然后它将材质存储到名为CubeMaterial的变量中。
下一步是创建一个计数器来跟踪收集的香蕉数量。
2-4创建香蕉计数器

如果您从Event BeginPlay节点向下平移一点,您将看到下面的设置。这是您将更新香蕉计数器和材料的地方。


On Component Begin Overlap节点将在立方体与另一个参与者重叠时执行。接下来,Cast to BP_Banana节点检查重叠的演员是否是香蕉。如果 Actor 是香蕉,DestroyActor节点将销毁它,使其从游戏中消失。
首先要做的是创建一个变量来存储收集的香蕉数量。之后,每当立方体与香蕉重叠时,您将变量加一。
创建一个新的Float变量并将其命名为BananaCounter。将BananaCounter 变量拖放到事件图表中并选择Get。


要将计数器加一,请添加一个IncrementFloat节点。创建后,将BananaCounter连接到它。


接下来,将DestroyActor节点连接到IncrementFloat节点。


现在,每当玩家收集香蕉时,BananaCounter变量就会加一。
如果你现在使用BananaCounter作为 alpha,你会得到意想不到的结果。这是因为LinearInterpolation节点需要一个 0 到 1 范围内的值。您可以使用规范化将计数器转换为 0 到 1 的范围。
要标准化,只需将BananaCounter除以最大值即可。这个值是在立方体完全变红之前玩家需要收集多少香蕉。
添加一个float / float节点并将其顶部引脚连接到IncrementFloat节点的剩余引脚。


将float/float节点的底部输入设置为6。这意味着一旦玩家收集了 6 个香蕉,立方体将完全变红。


有一个小问题。当玩家收集超过 6 个香蕉时,您将获得大于 1 的 alpha。要解决此问题,请使用Clamp (float)节点将 alpha 保持在 0 到 1 的范围内。
添加一个Clamp (float)节点并将Value引脚连接到float / float 节点的右侧引脚。


现在,您有了一个 alpha,是时候将它发送到材质了。
更新材料

将CubeMaterial变量拖放到Event Graph 中并选择Get。
接下来,将CubeMaterial变量的引脚拖动到空白处,然后松开左键单击。这将显示可以使用此类变量的节点列表。选择的任何节点都将自动与变量链接。添加一个设置标量参数值节点。此节点会将指定参数设置为提供的值。


现在,您需要指定要更新的参数。将参数名称字段设置为ColorAlpha。这是您在立方体材质中创建的参数。


将Clamp (float)节点的结果链接到Set Scalar Parameter Value 节点的 Value 引脚。


最后,将IncrementFloat节点链接到Set Scalar Parameter Value 节点。


以下是执行顺序:

[*]On Component Begin Overlap (StaticMesh):当立方体网格与另一个actor重叠时执行
[*]Cast to BP_Banana:检查重叠的actor是否是香蕉
[*]DestroyActor:如果重叠的actor是香蕉,则销毁它使其消失
[*]IncrementFloat:将BananaCounter变量加一
[*]float / float:将计数器除以指定的数字以对其进行规范化
[*]Clamp (float):对除法的结果进行钳位,这样就不会得到大于 1 的值
[*]设置标量参数值:将立方体材质的ColorAlpha参数设置为提供的值。在这种情况下,该值是BananaCounter的规范化和钳制版本
是时候测试一下了!单击编译,然后关闭蓝图编辑器。
单击播放并开始收集香蕉。立方体一开始是白色的,随着你收集香蕉逐渐变得更红。一旦你收集了 6 根香蕉,它就会完全变红。

页: [1]
查看完整版本: Unreal Engine 4 Tutorial 03 材质