欢迎光临散文网 会员登陆 & 注册

TomLooman_ActionRoguelike_第八章游戏材质

2023-08-10 08:17 作者:别叫我小红  | 我要投稿

该专栏用于保存对TomLooman的ActionRoguelike项目的学习笔记,学习过程中的思考与记录不一定准确。


教程参考:https://github.com/tomlooman/ActionRoguelike

基于UE5.0的项目实现:https://github.com/CarolBaggins2023/TomLooman_ActionRoguelike_Tutorial

2023_08_05

游戏材质:材质基础知识,闪光材料和驱动材料参数,简单溶解材料,可重复使用的材料函数,用户界面的材料

 

创建材料

每次修改完材料后,要进行Apply,否则修改后的材料不会被应用,类似于蓝图中修改完后要Compile,

在材料的界面中,颜色用三维向量表示(Constant3Vector),金属性、透明度等用常数表示(constant)。

BaseColor参数也可以传入纹理,不只是纯颜色,

如果我们想让某一项的变化实时地体现(不用频繁Apply),或者想从外部修改它,可以将节点转换为参数(变量),然后创建一个该材料的实例,就可以实时地修改了。注意,世界中的物体要将材料的实例作为Material才能实时地看出材料参数的变化。而且不能材料的实例添加新的功能,因为材料实例只是用来调整参数的。

 

 

将材料中的某个节点转换为参数后,如果我们在某个蓝图类中用到了该材料,那么就可以在蓝图中访问该参数并修改。

 

我们想要做一种材料,使用这种材料的物体在受到子弹伤害时会短暂地闪烁一下。

以下是这种材料的材料图界面,这里的逻辑就是用受击时间和当前时间的差作为发光度。这里我们把一个constant节点转换为了TimeToHit变量,当然材料本身是没办法知道什么时候发生Hit,然后给TimeToHit变量赋值的,所以我们要在C++中完成。

 

用C++给材料中的参数赋值的逻辑是,创建一个带MeshComponent成员变量的C++类,然后将这个函数作为类实例的Material,这样就能在C++代码中通过修改成员变量,来修改材料的参数。

同时,因为要在受击时发光,所以在这个C++类中,我们还要带有属性组件类的成员变量,并且将属性组件变量中的委托与该类的成员函数绑定,在成员函数中实现对材料参数的修改。

我们将属性组件中的委托实例与成员函数绑定,并在成员函数中用SetScalarParameterValueOnMaterials,通过变量名称,修改材料的参数。这里的“TimeToHit”就是我们在材料中将节点转换为参数后的名字。

 

之后,我们就可以创建UTargetDummy类的蓝图子类,通过属性组件类的成员变量实现对是否受击的监听。

 

为了在多处复用这个受击发光的效果,我们构建了一个材料函数,将函数的输出值作为材料的发光度。

材料函数通过以下方法创建,

函数逻辑如下,绝大部分与原本的实现相同,不同的是多个个FunctionInput节点,这个节点将我们函数输入暴露在外,所以在使用函数时可以传入一些自定义的值,我们也可以设置默认值。设置默认之后,调用该函数时输入的节点从白色变成灰色。

我们可以在Material中制作一个溶解的纹理(可见的表面逐渐消失,类似与游戏中角色死亡时的效果)。这里用到了TextureSample,可以传入纹理效果。

这里的基本逻辑是,材料中有个clip参数表示显示Texture的阈值,如果Texture在某点的RGB值小于阈值,则不显示,大于则显示。所以我们可以通过外加值与Texture求和,改变Texture上的值大于阈值的占比,从而实现一些位置显示Texture,一些地方不显示的效果。

这里我们包含了用时间作为外加值和将外加值转换为一个参数的做法。

 

 

之前,我们的血条是用ProgressBar做的,通过SetPercent改变ProgressBar。现在我们可以制作一个血条的材料来实现这个效果。大致思路是,我们在血条材料中设置一个参数,这个参数控制血条变化,然后我们用一个使用该材料的Image替换ProgressBar,并在UI蓝图中改变参数。

以下是血条材料图。因为我们是用在UI上的,所以不需要原来这么多参数,将MaterialDomain换为UserInterface。我们用PlayerAlpha的常数变量控制血条变化,控制的方法是用if函数,PlayerAlpha大于线性梯度(下面的黑白图)的部分是白色,小于的部分是红色。

 

将上面的材料用于UI中的Image,

我们可以在UI蓝图中实现如下逻辑。当受击事件发生,角色的属性组件中的OnHealthChanged委托实例发出广播,执行UI蓝图中的OnHealthChanged_Event_0事件,然后获得Image的Material,并修改Material中的ProgressAlpha变量,也就是上面控制材料表现的变量。


TomLooman_ActionRoguelike_第八章游戏材质的评论 (共 条)

分享到微博请遵守国家法律