type
status
date
slug
summary
tags
category
icon
password
Light_Bulb_Basic.h
这是一篇关于Unreal示例项目阅读的笔记
notion image
这是Unreal的内容示例展示了引擎的不同方面和功能,里面包含了很多很有趣的示例,也是入门学习Unreal的非常好的示例
比如在这个相当于Hello World的示例里面就展示了常用的打开关卡和非常常见的Static Mesh和Skeletal Mesh
notion image
notion image
并且提供了一个可以玩的小球,可以看到Play或者Simulate之后它在不断地上下弹跳、变换形状并且在撞击处产生波纹
notion image
notion image
可以看到小球的逻辑
notion image
通过Add Timeline增加一个所需的Timeline,并且命名了Bounce
notion image
双击它,可以在这里创建四种曲线,并且在上面设置Auto Play和Loop
notion image
notion image
这里创建了命名为Impact的Event曲线和命名为Movement和Scale的Float曲线,分别控制了小球的撞击发生的事件、移动和大小的变化。Movement和Scale作为Lerp中Alpha的输入来控制小球的位置和大小变化
可以看到在小球最高点的时候,输入的alpha是1,大小是正常的。而在最低点的时候,输入的alpha为0的时候,小球是一个被压扁的形状,同时在最低点的时候。Impact Event曲线会触发并生成撞击时候的波纹。可见这里的波纹并不是由一个撞击事件产生的,而是被设定好的硬编码。
notion image
notion image
 
notion image
 
只要愿意,我们可以让小球在最高点释放波纹
notion image
但是,波纹的时代过去了,现在是替身的时代!
notion image
 
这个小球功能实现的核心是TimelineComponent,可以很快地用代码实现一个,是很好的上手UTimelineComponent的示例。
首先添加一个继承自Actor小球的c++类
notion image
notion image
notion image
notion image
TimelineBall.h
Timeline_Ball.cpp
notion image
notion image
再根据c++类创建出蓝图类,填充所需的数据之后就可以实现效果了

Interactive Stands

接下来是三个展示了交互相关的

1.D Slider 通过值传递进行交互

Slider分为两个部分,上面的滑动条,下面根据滑条的值设置分辨率和值
notion image
从最上面的Slider开始看,里面的逻辑可能很多,但是其实并不复杂
在BeginPlay中,先判断这个滑动条是否为自动滑动的,如果是,才会执行后面的逻辑。滑动条的自动滑动是由TimelineComponent控制的,这里的TimelineComponent是命名为Timeline 0。一开始将Timeline 0的播放速率设置为AutoMoveSpeed的值,在将开始时间设置为StarValue后,就开始播放Timeline
notion image
根据曲线中Position的值不断更新Slider的位置,并且通过函数OutputValue输出当前滑条所在的值
notion image
Outputvalue函数中通过当前滑条所在位置和开始结束的位置计算出当前滑动的百分比,并将值输出至值Value中。同时可以通过IsNotClamped变量控制是否将值控制在一定范围内。
notion image
notion image
Tick中判断滑条是否是自动滑动的,如果不是,才会执行后面的逻辑。首先通过AllowScrolling函数设置禁用鼠标滚轮操作滑条移动,那么哪里启用滚轮移动呢
notion image
在PlayerCharacterBluprint中,如果判断准星悬浮在滑条中才会AllowScrolling(实际上是做一个射线操作,在一定距离内,从人发出的射线撞击到滑条就会判定悬浮在滑条上)。SetColor也是一样。
notion image
notion image
SetColor输入的值还会改变IsActive,只有IsActive被设置为true滑条才会真正可以被控制移动。
notion image
设置完一系列值后通过Outputvalue更新value的值,并且通过InUse值判断是否执行后面的操作
notion image
InUse值通过鼠标左键设置,当左键按下的时候才会被设置为true
notion image
在Verctical为false时计算鼠标左右滑动时候滑条应该滑动多少,并且通过AddRelativeLocation将计算出的值应用到滑条的位置变化上。至于Vertical为true的情况我并没看懂。
notion image
notion image
而后面的SetRelativeLocation其实就是限制滑条左右滑动的范围,不让它无限往外滑动
notion image
那么下面的改变就很简单了,他是录取Slider中Value的值来不断变化,通过PlayerNear判断玩家是否在旁边,PlayerNear由OnComponentBeginOverlap事件触发时设为true。如果为真,就设置MID这个MaterialInstance的值,至于什么时MaterialInstance后面会讲(挖坑ing…)。它在ConstructionScript中被设置,传入的Value会改变材质的分辨率。
notion image
notion image
同时读取Slider中的value来设置Text,让Text不断变化。
notion image

1.F 通过事件驱动交互

E的原理和F差不多,所以直接就写F了
上面的交互来说,要不断地Tick滑条里面的Value值,在游戏中,减少Tick的逻辑可以大幅提升性能。
F分为两部分,前面的灯台和后面的灯泡,当玩家触碰了灯台之后,灯泡就会亮起。对于碰撞检测来说,如果每一帧都去做判断然后才去让灯泡亮起,这会使得游戏的性能非常糟糕
notion image
首先看灯泡的逻辑。它自定义了事件Toggle light。当事件被触发后才会执行逻辑。如果被设置为开,会UpdateLightColor设置MaterialInstance中的Emissive color来实现发光的效果。这个MaterialInstance的逻辑和上面的大致相同。
当被设置为开灯时,会通过Timeline中的曲线来模拟灯打开时候的突然很亮然后又恢复正常亮度的情况。
notion image
notion image
灯台的逻辑就简单很多了,当触发了和胶囊体开始重合的时候,就会去触发灯泡亮灯的事件。
notion image
重新实现一遍他们的逻辑
灯泡
Light_Bulb_Basic.h
Light_Bulb_Basic.cpp
灯台
ButtonLight_Bulb_Basic.h
ButtonLight_Bulb_Basic.cpp
 
[ContentExamples]ExampleProjectWelcom[ContentExamples]ExampleProjectWelcom
Loading...
lltouchingfish
lltouchingfish
lltouchingfish
Announcement
🎉NotionNext 4.5已经上线🎉
-- 感谢您的支持 ---
👏欢迎更新体验👏