Hello ,今天给大家模拟unreal中灯泡接触不良的效果制作。
先理一下思路,一般游戏中的灯光不只是有直接从引擎里面拉出来的物理灯光,更需要有emissive的模型灯光,即我们的mesh文件,所以整个灯在闪烁的时候,物理灯光比如point light的强度变化要和模型灯光的emissive变化是要同频并且强度变化要一致。
所以最方便的就是直接在模型灯光的BP中控制强度和emissive的值。
如下,手残党直接拉的一个圆柱体当做模型灯光,并给了一个简陋的emissive材质;
注意自发光的大小一定要暴露出来,方便在蓝图中读取。
然后右键给这个mesh创建蓝图,并在蓝图中添加一个point light。
日常生活中接触不良的灯泡的闪烁频率其实是不一样的,也就是每个亮度的持续时间是不一样的,所以我们需要在设置物理灯光的intensity和模型灯光的emissive之前进行亮度持续时间的设置,所以在Event Graph中,在Event BeginPlay 添加一个Delay节点。
而Duration值的话需要输入一个随机数Random Float in Range,范围大概在0到0.5之间,因为推迟的时间不能长,接着开始给模型的emissive设置一个随机值,首先用节点Set Scalar Parameter Value on Materials获取材质里面暴露出来的参数emissive power,Parameter Value同样给一个随机值,范围0-1。
然后用节点set intensity设置物理灯光的intensity,强度的话我们先用前面模型灯光的随机值乘上10000(因为物理灯光的intensity有点大)。由于需要不停的变换值,所以我们把最后的输出结果连到最开始的delay上面进行一个循环。
Compile后在场景中运行可以看到,两个灯光都在变化,但是仔细看就会发现只是变化频率一致,而强度变化并不一样,在物理灯光近0的时候,而模型灯光还是近1的值。
这是因为给到模型emissive的random值并不会同时被运用到物理灯光的intensity上,而是在走到set intensity的时候就变了一个随机值,所以我们现在要改的是将模型随机了以后的emissive的值给到物理灯光的intensity。我们就需要一个中间值来进行传递,才能保证两边的数值是一样的。
我们在左侧新建一个float的变量current emissive,然后拉到蓝图中选择set,将模型的随机emissive值给到set,然后把set放在set scalar parameter value on material之前。
再拉一个surrent emissive到场景中然后选择get,把get到的值输入到set scalar parameter value on material的parameter value和set intensity的new intensity中
再次编译就可以看到我们开始的效果,两个灯光属性的变化一致,同时增强或者减弱,并且时间和强度随机。
一般为了使用方便,我们还需要把里面的数值参数暴露出来,是否闪烁也可以添加开关,方便艺术家在外部进行调整,完整节点如下: