20230113
1、新建项目
新建选择 UE 5.1 项目
![](https://img-blog.csdnimg.cn/img_convert/368d05af803622421e3491a54a77b10a.png)
选择蓝图,项目位置
![](https://img-blog.csdnimg.cn/img_convert/c286fd3ebae936f433d2202df66bdf7f.png)
改变编辑器布局,选择经典布局
![](https://img-blog.csdnimg.cn/img_convert/10e0a6f7e11138c946fa0672c67db905.png)
![](https://img-blog.csdnimg.cn/img_convert/b8faf34247212c60db26169435f678b6.png)
2、关卡与蓝图
选择 File -> New Level 准备创建关卡
![](https://img-blog.csdnimg.cn/img_convert/d1e0a9a370bab06d8367c84d90465033.png)
选择 Basic,点击 Create 进行创建
![](https://img-blog.csdnimg.cn/img_convert/72f5dc8d5bc7c3dab2e10d003e8895f1.png)
Ctrl + S 保存新建的关卡
![](https://img-blog.csdnimg.cn/img_convert/5d4ef8e6982395a971dd48ff0a5b1b7c.png)
![](https://img-blog.csdnimg.cn/img_convert/c297717a50a326143ffba0d1a6f19f77.png)
关卡蓝图的打开
![](https://img-blog.csdnimg.cn/img_convert/c6a7a832948d0e5bd40597fa9002d429.png)
![](https://img-blog.csdnimg.cn/img_convert/26fe144bdb8bc5e5a2daf7ee494ea9e7.png)
鼠标右键,添加蓝图事件,这里先删除默认的所有蓝图,然后鼠标右键,选择 事件开始运行(Event BeginPlay),即关卡开始运行时的执行事件,即关卡初始化时的执行事件,只会执行一次。类似于 Vue 中的 mounted,类似于 C# 中的 main 函数。
![](https://img-blog.csdnimg.cn/img_convert/8f1fff25728970e155eed659cc2a77fe.png)
![](https://img-blog.csdnimg.cn/img_convert/2531b0525600a5f369ac6bbb43fb2aee.png)
新建打印字符串事件,将 Event BeginPlay 与 Print String 进行连接,修改需要打印的字符串的值、颜色等
![](https://img-blog.csdnimg.cn/img_convert/4470989b3dc6a9c91e7e440c055da011.png)
然后点击 Compile 进行编译,编译后执行运行,可以看到运行后,游戏界面的屏幕上打印出了设置的字符串。(蓝图本质上还是 C++ 程序,C++ 程序是需要编译的,这样程序才能运行)
![](https://img-blog.csdnimg.cn/img_convert/4c34230ff6abdbe57fc0d2b7277564fe.png)
![](https://img-blog.csdnimg.cn/img_convert/f959d5a09dfec0e4caead0363c5c779a.png)
记得随时点击 Save All,保存所有,进行保存项目,随时更改,及时编译,及时保存。
![](https://img-blog.csdnimg.cn/img_convert/57e53dbdb1cefeb3868e92e4db54585c.png)
新建 Event Tick 蓝图,并与打印字符串相连
![](https://img-blog.csdnimg.cn/img_convert/29a7b8ade477447192455460e0ec156f.png)
Event Tick 就是每秒执行帧率事件的次数,如 60fps,即60帧,则一秒钟会执行60次事件,此处为每一帧打印 Hello,World 事件
![](https://img-blog.csdnimg.cn/img_convert/6ebf6c945479cc0ce8a72aca3bf20348.png)
编译后运行,可以看到每一帧都在打印字符串。
![](https://img-blog.csdnimg.cn/img_convert/04b6397f996c69ee7375e20d42576596.png)
鼠标左键按住进行框选
![](https://img-blog.csdnimg.cn/img_convert/b6e59fa71f95b9f834ed2e9999ca53ee.png)
框选后,按下键盘的 C 键,可以弹出注释框,进行注释,并选中移动等
![](https://img-blog.csdnimg.cn/img_convert/5f3d2b55d69d2d46d8acdb56ec9f4a5a.png)
鼠标悬浮在连接线上,按住 Alt 键后再鼠标左键选中连接线,则可以取消连接。
![](https://img-blog.csdnimg.cn/img_convert/0c01800257bb641d7c12afcac05b3d34.png)
执行顺序,可以看到先连接的打印 Hello,World,再连接的打印 hahahaha,则运行后,会先执行打印 Hello,World,再打印 hahaha,由于是后打印的,所以 hahaha 会将 Hello,World 往后移。
![](https://img-blog.csdnimg.cn/img_convert/7b118f45e944d0ec504f7007c1f45b03.png)
按住鼠标右键,配合键盘上的 W、A、S、D、Q、E 键,可以进行场景的缩放、左右、前后、上下。
可以通过 Place Actors 下将物体拖拽至场景中,配合缩放,以及可以通过按下 Q (选择物体)、W(平移物体)、E(旋转物体)、R(缩放物体)。
![](https://img-blog.csdnimg.cn/img_convert/eb0d2c1b05e64912e702392bf67261f1.png)
也可以通过此界面进行具体数值的物体的旋转、平移、缩放等
![](https://img-blog.csdnimg.cn/img_convert/96aba9bc60b6e78dfc47e9b5ecc3e50b.png)
可以设置物体的全局坐标系或局部、物体坐标系的旋转、平移、缩放等
![](https://img-blog.csdnimg.cn/img_convert/a165e64358cedc46108b379cb5e6a989.png)
将一个立方体拖拽至场景中,然后通过 Edit -> Rename 对其重命名,如重命名为 CubeTian
![](https://img-blog.csdnimg.cn/img_convert/0cdf2f1dec813bab016dcf8af759d05f.png)
![](https://img-blog.csdnimg.cn/img_convert/b72b2d9b84bb56b0639205b89cb5d7a6.png)
然后打开蓝图,通过创建 CubeTian 的引用来对当前立方体进行事件操作、响应、控制等
![](https://img-blog.csdnimg.cn/img_convert/622e01bbd929503ed7dc17a5959d948e.png)
![](https://img-blog.csdnimg.cn/img_convert/222d7ea58502fd1c34175c942b95135d.png)
鼠标左键拖拽出一条线之后,松开,可以设置与当前立方体相关的蓝图事件,比如这里选择 Set World Location(设置世界坐标下的位置)
![](https://img-blog.csdnimg.cn/img_convert/ed176d3eec9857ef9a2facf4d79da595.png)
这里在 Set World Transform 下的 New Transform 下右键,选择 Split Struct Pin
![](https://img-blog.csdnimg.cn/img_convert/b4f879dc73faed5f08e933b69de63da6.png)
可以看到有 Location、Rotation、Scale,即 Set World Transform 可以对物体同时设置位置、旋转和缩放
![](https://img-blog.csdnimg.cn/img_convert/3ae1e866b754f6b59a0e3fe0bc346529.png)
先选中物体,设置初始位置为0,0,50,然后将将物体设置为 Movable
![](https://img-blog.csdnimg.cn/img_convert/b6f28e05270a58971ec1090b4857aa5f.png)
在蓝图中,对物体设置运行时执行位置移动,如下连接方式,连接设置将物体移动至 0,0,20
![](https://img-blog.csdnimg.cn/img_convert/3f9af0d4180eb09635b74f27327522e0.png)
可以看到编译运行前,物体位置在0,0,50,编译运行后,通过蓝图的位置移动,在关卡运行时,就将物体移动到了0,0,200的位置,这就达到了控制物体移动的目的。
![](https://img-blog.csdnimg.cn/img_convert/f8c8de2ed5170045d9a6e2c039ada65b.png)
同理可以设置 Transform,同时设置位置、旋转,缩放
![](https://img-blog.csdnimg.cn/img_convert/be65ffaff8799af49433e2a090a67aef.png)
编译运行后可以看到,物体在位置、旋转、缩放上都生效了
![](https://img-blog.csdnimg.cn/img_convert/b10b3ef4026cef701d14c488699af8c6.png)
根据时间(计时器)进行时间上的物体控制:先创建一个浮点数类型的变量
![](https://img-blog.csdnimg.cn/img_convert/5ecca6c12e081be44d558b23e916f222.png)
创建了变量之后,先执行下编译,然后可以看到右侧出现了默认值,默认为0
![](https://img-blog.csdnimg.cn/img_convert/9aa789437fa2d4628c29399f55d586bc.png)
将变量从左侧拖拽至蓝图中,此时选取 Get time
![](https://img-blog.csdnimg.cn/img_convert/a21941509d24ef0012c698489f1d82b2.png)
将 Time 和 In String 进行连接,可以看到连接前,字符串为 Hello,World
![](https://img-blog.csdnimg.cn/img_convert/0855a8f388bcab9f620a31ba76bb8e4e.png)
连接后,In String 就不是 Hello,World 了,而是 time 的值 520.1314,这里会自动将浮点数的 time 的 520.1314 转换为 Pring String 的 In String 对应的字符串值即 "520.1314"
![](https://img-blog.csdnimg.cn/img_convert/166092fbedd2b83b1cdc302f7b6c9507.png)
编译运行后可以看到,关卡运行时打印了 Time 的值 520.1314
![](https://img-blog.csdnimg.cn/img_convert/e0786c08913fa2cafe4b409744fa0b14.png)
如下,通过先 SET 原始 Time 的值,然后再 get time 的值之后进行加法运算,打印,然后再获取 time 的值再打印,具体流程如下
![](https://img-blog.csdnimg.cn/img_convert/c3da5b6894ee3c92abf478ecf06cf5dc.png)
运行结果如下
![](https://img-blog.csdnimg.cn/img_convert/2ddce117fde8926b9f1fb5ec27515c59.png)
逐帧设置时间的变化,进行打印输出,实现计时器效果
![](https://img-blog.csdnimg.cn/img_convert/86011d2d519db28cfb468a9631706f29.png)
![](https://img-blog.csdnimg.cn/img_convert/298ad3e7811551d204edfbdfd979a308.png)
序列事件:Sequence
![](https://img-blog.csdnimg.cn/img_convert/0a448bf255287bffca52dd9d44c9ba95.png)
![](https://img-blog.csdnimg.cn/img_convert/c9ff55d9dab769d182bc1dac72838ade.png)
![](https://img-blog.csdnimg.cn/img_convert/08be449c9b419d0ce629384667acfee0.png)
让物体动起来:让物体跟随时间进行上下跳动以及各方向旋转效果
![](https://img-blog.csdnimg.cn/img_convert/5e2920ea0b7aa4cf9c8ffaccadad662a.png)
![](https://img-blog.csdnimg.cn/img_convert/2305edb715816fba2c97de3901de23de.png)
根据时间轴进行动态、线性插值的物体动画设置,先添加 timeline
![](https://img-blog.csdnimg.cn/img_convert/7872e28bd456c7c8b4f6e692e0c67564.png)
双击 Timeline 进入编辑状态,通过 Track 添加轨道,在轨道上右键可以添加关键帧,可以设置整个轨道的时间,如这里是 5秒
![](https://img-blog.csdnimg.cn/img_convert/43c9c47783978aa9df1e2ec8ba7e23ff.png)
每个关键帧右键,可以设置线性关系。左键选中关键帧,可以设置关键帧的事件过渡。
![](https://img-blog.csdnimg.cn/img_convert/81ae1129867aac9c2dc8e0ef43433bd5.png)
编辑后可以看到 Timeline 多了一个轨道
![](https://img-blog.csdnimg.cn/img_convert/28bfd05cd08d1b53df561557c85158bd.png)
继续编辑 Timeline,勾选 loop,让该时间轴轨道循环往复的执行。
![](https://img-blog.csdnimg.cn/img_convert/ee2918b58f3bbccc7f9582dcc5984c21.png)
将时间轴与 物体的 Location Z 值进行连接,可以实现物体循环往复的上下移动的效果。
![](https://img-blog.csdnimg.cn/img_convert/7d0fcf0f1c4536cf12dda937c80cae49.png)
![](https://img-blog.csdnimg.cn/img_convert/3adfe7ff1de5391e211b5123762528ed.png)
也可以使用线性插值(lerp)的方式实现平滑的上下移动+各个方向旋转的效果。
将第一个轨道调整为时间长度为1,且为线性关系,用于物体的 z 值调整,并选择 loop,循环执行
![](https://img-blog.csdnimg.cn/img_convert/b233c861f6d237d57c2e58894a31df36.png)
![](https://img-blog.csdnimg.cn/img_convert/1a0efe423441c1d531275ffa39cd565b.png)
![](https://img-blog.csdnimg.cn/img_convert/86b7d7f6ee1164e95d15b9c35f6bfe0a.png)
可以实现物体,不断上下平滑跳动,以及各个方向旋转的效果。
![](https://img-blog.csdnimg.cn/img_convert/f1712388afa894e82f445611ff1c12e6.png)
自定义事件:通过自定义事件,可以简化/美化蓝图布局,提升蓝图的可视性。
右键选择 Add Custom Event
![](https://img-blog.csdnimg.cn/img_convert/d28dfbe5f6692c553590a563ec7c8ab0.png)
创建之后,建议用英文名给事件命名
![](https://img-blog.csdnimg.cn/img_convert/20f35fe609838cde3c8181cb7a6767b5.png)
新建了事件之后,将新建的事件与 Timeline 事件相连,这样同样执物体上下并各个方向循环改变的方法,可以在 Sequence 里直接连接 HoverEvent 即可。
![](https://img-blog.csdnimg.cn/img_convert/d3fb9d6532f0ba08894810f9e1f976cd.png)
![](https://img-blog.csdnimg.cn/img_convert/3d8e5128cd4be94970985b0456fc4f65.png)
这样蓝图就分为了上下两个,布局清晰。
自定义函数:通过添加自定义函数,可以让蓝图更加流程化,实现方法独立
![](https://img-blog.csdnimg.cn/img_convert/b4d61462bddd69ac244897363b59f175.png)
具体的实现方法,流程如下:
![](https://img-blog.csdnimg.cn/img_convert/e0e39c0c08b03ff5e3ff45672908a04e.png)
建立好方法函数后,就可以在蓝图中搜索并使用该方法了:
![](https://img-blog.csdnimg.cn/img_convert/760581173fc2c1a3cdc3652288768e21.png)
![](https://img-blog.csdnimg.cn/img_convert/6b901b355ff291edf77e3e75134c85e5.png)
![](https://img-blog.csdnimg.cn/img_convert/946702bbcf0520995c2573cef539b370.png)
可以看到,输入的值是 3,通过自定义的立方运算函数,得到了正确的打印结果 27
![](https://img-blog.csdnimg.cn/img_convert/1cc66311a28fa9ba556df5c246a5ebd7.png)
通过函数的方式实现物体上下浮动的效果,并且可以控制上下浮动的速度:
按照如下方式构建了名为 UpDownFunc 的函数
![](https://img-blog.csdnimg.cn/img_convert/49b4096c1aa48ce1772a17e42f9f4dc3.png)
![](https://img-blog.csdnimg.cn/img_convert/ed738ac66ff4220ecc3fa957344590cc.png)
最后通过使用函数,可以实现物体上下浮动的范围以及浮动的速度
![](https://img-blog.csdnimg.cn/img_convert/4f903b13bd23c00b692fdfc380b42b64.png)
让多个物体可以在初始位置上下移动,并且每个物体的移动速度、移动范围各不相同:
现在物体是在指定位置上下浮动的,而不是在物体原本位置开始浮动的
![](https://img-blog.csdnimg.cn/img_convert/a03a14c9fac96da54d686ec8f161d67c.png)
现在实现物体按照指定位置上下浮动实现的蓝图逻辑如下:
![](https://img-blog.csdnimg.cn/img_convert/03fb6ac4bf786af2223358e3bfc96a08.png)
![](https://img-blog.csdnimg.cn/img_convert/9059cc007a50936c6942390f122bfa07.png)
选中一个物体,按住 Alt 键,同时用左键拖拽,即可复制一个物体。将物体的属性都设置为可移动(Movable)
![](https://img-blog.csdnimg.cn/img_convert/dd779ea025d80bd37b5abd74378a5acb.png)
在物体的 Static Mesh Compoent 上连接 Get World Transform
![](https://img-blog.csdnimg.cn/img_convert/7ae69ede934f71fae4c8a3aae2ea1b5a.png)
选中 Get World Transform,对 Return Value 执行右键的 Split Struct Pin
![](https://img-blog.csdnimg.cn/img_convert/d8a40a0f1388f07081c9aec197726e9b.png)
得到三个,分别为 Return Value Location,Return Value Rotation,Return Value Scale,由于这里我们是要获取物体原始的位置信息,并最终达到上下浮动的目的,所以这里对 Return Value Location 执行 Promote to Variable,即对位置信息提升为变量。
![](https://img-blog.csdnimg.cn/img_convert/37c1e8f2699f341d0a9eca37fed0be43.png)
提升为变量后,可以看到左侧 VARIBLES 就多了一个名为 Return Value Location 的 Vector 类型的变量。
![](https://img-blog.csdnimg.cn/img_convert/8bf3fe88cc4cbaa582f4ff47305aed41.png)
![](https://img-blog.csdnimg.cn/img_convert/e21ca889ce3121e6460748aadf35d43d.png)
获取 ReturnValue Location 变量,并执行 SPlit Struct Pin
![](https://img-blog.csdnimg.cn/img_convert/65360307cc40cd11c8e95c7774750dd6.png)
![](https://img-blog.csdnimg.cn/img_convert/cc47c248f08397b4189f3b925daacff0.png)
完整实现蓝图的逻辑为:
![](https://img-blog.csdnimg.cn/img_convert/3c8af7ab792a68ae8494936f110f7787.png)
![](https://img-blog.csdnimg.cn/img_convert/14a1b340a753f95cd8a091311ba3bd0a.png)
![](https://img-blog.csdnimg.cn/img_convert/e9eba4a4383cdda294a8921618fc2400.png)
![](https://img-blog.csdnimg.cn/img_convert/0f52a62e3f4c4a908d5b3fd6977e709a.png)
![](https://img-blog.csdnimg.cn/img_convert/364615ad2d9fccd5420798b905ebb578.png)
可以看到,物体是在原始的 xy 的位置上进行的上下浮动。
![](https://img-blog.csdnimg.cn/img_convert/620195a6a2ab8ed300d28a1389330ff9.png)
但这里有个问题是,虽然物体可以在指定的 xy 位置上移动,但不是在初始的 z 值上进行的移动。而是在我们设定的 z 值开始移动的。需要继续调整,调整如下:
![](https://img-blog.csdnimg.cn/img_convert/77a62ccf5926f40177614c77627c6d6f.png)
也还可以设置 Z Min Value 、Z Max Value 等,让物体在指定区间运动等。
当前只是实现了一个物体的在初始位置的上下浮动,如何实现多个物体的上下浮动呢?
这个的前提时,我们可以实现把物体/模型作为参数传到我们的自定义事件中。
选择我们的自定义事件 UpDownCustomTestEvent,在右侧面板中的 Inputs 添加输入变量,添加时选择 Statice Mesh Actor 的 Object Reference
![](https://img-blog.csdnimg.cn/img_convert/d769ceb4bd6a2f135276357c2b70e3b4.png)
重命名新加的输入变量名称,此处修改为 StaticMeshConponentParam.
![](https://img-blog.csdnimg.cn/img_convert/b624fa125354e338272d76c219bd4a24.png)
此时就可以将 StaticMeshConponentParam 和 物体的 Static Mesh Conponent 相连了,此时任何物体的静态网格体就作为了 UPDownCustomTestEvent 事件的输入变量了。
![](https://img-blog.csdnimg.cn/img_convert/43194bb762520cf38f27e55542e385ef.png)
![](https://img-blog.csdnimg.cn/img_convert/8a10992db43376e07abef3cb12daacfd.png)
接下来要做的就是将 CubeTian 这个物体传给我们的自定义事件的 Staticmeshcomponentparam 即可。
![](https://img-blog.csdnimg.cn/img_convert/e0c244fc9ee4f600e4096a7780b7cff4.png)
![](https://img-blog.csdnimg.cn/img_convert/00bbe086174f12736f0aee0ea911ca85.png)
编译运行后可以发现,CubeTian 这个物体依然和之前的效果一样,按照初始的位置进行的上下浮动。
![](https://img-blog.csdnimg.cn/img_convert/aa2d5f7d6fab8dd327b5cc6f28c42b71.png)
同理,此时就可以继续添加第二个物体实现同样的上下浮动了。
![](https://img-blog.csdnimg.cn/img_convert/50302fed7c31614b4e22e569e766278f.png)
蓝图中添加第二个物体
![](https://img-blog.csdnimg.cn/img_convert/ae9da8a32ad06604f0ef198dfa4bb1ed.png)
添加第二个物体的静态网格体
![](https://img-blog.csdnimg.cn/img_convert/1e710775b15c9265e5c585999d006bf2.png)
获取世界变换,并将第二个物体的世界变幻的位置提升为变量
![](https://img-blog.csdnimg.cn/img_convert/566e4b9f7c50be8adc58f86c8ea9d167.png)
将获取位置变量信息并存储到 Return Value Locaiton 0 的事件(SET) 和 Event BeginPlay 的 Sequence 相连,实现关卡运行时就获取第二个物体的位置信息,并将该位置信息存储到 Return Value Location 0 这个变量中,即将第二个物体的位置信息赋值给 Return Value Location 0.
![](https://img-blog.csdnimg.cn/img_convert/1f861afeee123f4754cd48e4fa695800.png)
由于 UpDownCustomTestEvent 事件中目前使用的还是物体1(CubeTian)的位置信息,因此需要调整为可动态获取任意物体位置信息的方式。
![](https://img-blog.csdnimg.cn/img_convert/01a6273190fc8ac938cc19e709bfd760.png)
需要位 UpDownCustomTestEvent 新添加一个 Vector 类型的输入变量,此处命名为 Location
![](https://img-blog.csdnimg.cn/img_convert/81b2e9577fd4a47ff718b82ab075fb85.png)
左键拖拽 Location,选择 Break Vector,进行拆分变量,也可右键选择 Split Struct Pin 进行拆分。为了保证 UpDownCustomTestEvent 的美观性,选择使用 Break Vector 方法。
![](https://img-blog.csdnimg.cn/img_convert/e86ead4ac11105f15a0c7fefaf869833.png)
![](https://img-blog.csdnimg.cn/img_convert/e27c480a60330105e97366dbfef413f3.png)
执行之后如下,生成了 Break Vector
![](https://img-blog.csdnimg.cn/img_convert/820085003fcec6aff331e7dda178c5cf.png)
然后对 X、Y、Z 分别进行连线,如下所示:
![](https://img-blog.csdnimg.cn/img_convert/2339630526f401b7088d4175d38e11b3.png)
然后分别将物体1(CubeTian)和其对应的 Location 变量(Return Value Location)、物体2(CubeTian2) 和其对应的 Location 变量(Return Value Location 0)与 通用的 Up Down Custom Test Event 进行相连,具体如下:
![](https://img-blog.csdnimg.cn/img_convert/23102ae8418e842ef67192069a3fd7bf.png)
然后执行编译,运行,就可以看到,2 个物体在初始位置开始进行上下浮动效果:
![](https://img-blog.csdnimg.cn/img_convert/1070ce7653ce68baee453a5d31a14f97.png)
完整蓝图如下:
![](https://img-blog.csdnimg.cn/img_convert/9a1baf8de170f7dbd2c9e67a89948106.png)
![](https://img-blog.csdnimg.cn/img_convert/d4f9d48e25ee4382e4d63a7721262f4a.png)
![](https://img-blog.csdnimg.cn/img_convert/c0590c05729b4a776149dbd4bcaa2d62.png)
此时虽然可以实现 2 个物体同时上下浮动,但是速度、时间、浮动范围用的都是同一个值,如何实现不同物体,不同速度、不同浮动范围呢?这就需要继续为 UpDownCustomTestEvent 添加输入变量参数,将速度、时间、浮动范围等其他想要个性化控制的信息作为输入变量参数,这里添加了以下几个:
新建了三个 Float 类型的 Speed、ZMin Value、ZMax Value ,然后将 Speed 的默认值设置为 1.0,其他值也可以设默认值。
![](https://img-blog.csdnimg.cn/img_convert/d603ce99cf47194b86bfac7e660f4412.png)
然后将 UpDownCustomTestEvent 中的 Speed、ZMin Value、ZMax Value 分别与 UpDownFunc 函数中的 Speed 、Z Min Value 、Z Max Value 对应连接,连接之后如下:
![](https://img-blog.csdnimg.cn/img_convert/79d09895495934d4026f75a16735852b.png)
此时就可以向传递物体和位置信息的 UpDownCustomTestEvent 里传递或设置 Speed、ZMinValue、ZMaxValue 了。
![](https://img-blog.csdnimg.cn/img_convert/767747b82f8ec04201135014141a80d0.png)
最后可以看到效果是不同的物体上下浮动的范围、速度都不一样了:
![](https://img-blog.csdnimg.cn/img_convert/fedff12fb19e31491f53f7749a4d2b08.png)
完整的蓝图如下:
![](https://img-blog.csdnimg.cn/img_convert/adc31776648b0056116f28fd358c3adc.png)
![](https://img-blog.csdnimg.cn/img_convert/9da3aff53c1899a8a715f73def4b62e9.png)
![](https://img-blog.csdnimg.cn/img_convert/d406c53f3175bd14e421372f42572d0a.png)
![](https://img-blog.csdnimg.cn/img_convert/7c7d3b980ff8709b5d291757d3763712.png)
![](https://img-blog.csdnimg.cn/img_convert/a6722cbb0836ccccb156f1587d794fa2.png)
场景、物体的光源效果:
可以在场景中拖拽入 2 个 Spot Light(聚光灯),然后可以分别设置两个聚光灯的位置、光源强度等
![](https://img-blog.csdnimg.cn/img_convert/b8f95b6a78dc22d8dcc0538fbc97408f.png)
![](https://img-blog.csdnimg.cn/img_convert/1ea7871f45f932e880fa35fe11b61158.png)
然后可以设置场景光源的光照强度为 0,就可以实现周边黑暗,只有 2 个光源照射物体的场景效果:
![](https://img-blog.csdnimg.cn/img_convert/e74b646845ceb8c50ef6cf6347ec9677.png)
![](https://img-blog.csdnimg.cn/img_convert/9f7a2453695b94044ccf6162eee3eddb.png)
还可以继续修改光源的色温、颜色等等。
可以通过在 Outliner 里新建文件夹,将同一类的东西放在一个文件夹,形成一个良好的组织结构。
![](https://img-blog.csdnimg.cn/img_convert/513f9bf3f970114bf7626c795d55ce4b.png)
比如这里新建了 CubeTian 的文件夹,将 CubeTian 的物体和其相关的光源 SpotLight 放在一个文件夹里。
![](https://img-blog.csdnimg.cn/img_convert/f551d02086adaeb0fa5eb59130c7ee81.png)
可以同时按住 Ctrl + L 键 不松手,然后只需要转动鼠标(不需要按住任何鼠标上的任何键)就可以调整天空的时间(白天、黄昏、黑夜等)的天空效果
![](https://img-blog.csdnimg.cn/img_convert/d40d838460cff1354134814ffd678e4e.png)
![](https://img-blog.csdnimg.cn/img_convert/be63c8de5ede2921ebb2b2506797f5af.png)
UE 中的 Actor 和 Component 的含义:Actor 相当于一个角色/人物/演员/物体,Component 相当于这个角色/人物/物体具有的技能、属性、功能、模块等,比如一个人可以吃饭、睡觉、跳跃、奔跑,一个人就是一个 Actor,而这个人拥有的 吃饭、睡觉等的能力相当于 Component。
如下 一个立方体,CubeTian 是一个 Actor,它拥有一个 StaticMeshComponent,就是拥有一个静态网格体(不会变化的网格体)。
![](https://img-blog.csdnimg.cn/img_convert/b0f5125b17784db064ed14acc34c1c62.png)
![](https://img-blog.csdnimg.cn/img_convert/fdb06f83b331dfc5b1a0bc86eda8f2d6.png)
上面我们讲的是通过关卡的蓝图来进行的设置,如果是想要单独创建一个蓝图呢?
蓝图建立的规范与创建 Actor:
一般蓝图会命名为以 BP_ 开头的名称,蓝图的全程为 BluePrint,比如 BP_Cube、BP_TianCube 等。以 BP_ 开头可以一目了然的知道这个东西就是蓝图。创建的 BP_Cube 等蓝图可以放在一个文件夹里进行组织管理
![](https://img-blog.csdnimg.cn/img_convert/1f3d4d8343feae2c90e9d2c4f2bb698a.png)
![](https://img-blog.csdnimg.cn/img_convert/458eeefeba54b31122716b4bc669e4ee.png)
创建蓝图时,可选择的有很多,这里就默认选了 Actor
![](https://img-blog.csdnimg.cn/img_convert/76078590fa5c6fd8f3572a3c21458c8e.png)
在新建的文件夹下(这里文件夹命名为 BP)新建了一个蓝图(这里命名为 BP_Cube)
![](https://img-blog.csdnimg.cn/img_convert/2894b01ae35b9595b31d7ce8aebeb3c0.png)
双击 BP_Cube 可以进行编辑,进入编辑后可以看到新建的蓝图是空的
![](https://img-blog.csdnimg.cn/img_convert/4aee0f3b87f9aedc5185d7b560255a2e.png)
可以在当前蓝图的 Viewport ,在左侧 Conponents 点击 Add 添加物体,比如选择 Static Mesh,或者直接选择 Cube。这里直接选择了 Cube。
![](https://img-blog.csdnimg.cn/img_convert/57d4f3bee92a4037101fee012e33c7ba.png)
这样就可以看到蓝图视口中多了一个立方体
![](https://img-blog.csdnimg.cn/img_convert/42181cd575ce72d3386621c2d69a5a99.png)
还可以继续添加,比如这里添加了一个 SpotLight
![](https://img-blog.csdnimg.cn/img_convert/0bda24cfb3d56d8daa1f5c85baf2a910.png)
可以设置 SpotLight 的光源位置、强度、方向等属性,可以看到 SpotLight 是在 Cube 的下方的(而不是平行的下方),存在着一个父子级关系,也就是当前 SpotLight 是 当前 Cube 的子级,这意味着当 Cube 被拖拽移动时,它的子级 SpotLight 也会跟着移动(如果是平行关系,非父子级关系),则灯光不会跟着物体移动。当然也可以通过拖拽的方式,来改变他们的父子级关系。
![](https://img-blog.csdnimg.cn/img_convert/9fea9bad93a8b5eff37cf9ece6560227.png)
拖拽了物体和灯光之后,执行编译。然后就可以看到蓝图上有了东西,当前蓝图可以直接拖拽至场景中,这样场景中就添加了一个具有灯光的物体。
![](https://img-blog.csdnimg.cn/img_convert/db4dcee8365330f4a34722a779ba37cb.png)
![](https://img-blog.csdnimg.cn/img_convert/643c4850d51a363da79377b358bc72b0.png)
Actor 的蓝图:
选择 Event Graph 窗口,将默认的蓝图节点都可以删掉
![](https://img-blog.csdnimg.cn/img_convert/16c1f871c06effab50e13ce373f98065.png)
然后从左侧将 Cube 拖拽进来
![](https://img-blog.csdnimg.cn/img_convert/ab59321167ae9c271a6e99cba1d1ce35.png)
然后选择设置相对位置(这里的相对位置是相对于蓝图类的视口中心位置)
![](https://img-blog.csdnimg.cn/img_convert/e17b28d64bc42260cc53159508b30639.png)
![](https://img-blog.csdnimg.cn/img_convert/a500c0036669ed994f471aeff051a332.png)
然后建立循环的时间轴,在 0 - 1之间循环,通过 Lerp 插值为 -100 - 300,然后对 Cube 设置连接 Location Z 值,这样在关卡运行时,就可以设置物体在 - 100.0 - 300.0 之间上下浮动
![](https://img-blog.csdnimg.cn/img_convert/93a4d56b0e4356c099ccf95c11b925ad.png)
如:这里拖拽了 5 个 BP_Cube 蓝图类,这 5 个蓝图类在关卡运行时的物体都会上下浮动。
![](https://img-blog.csdnimg.cn/img_convert/aefe89f4e1b46ffd1a42691082e859ac.png)
这里带来一个问题是,由于用的是同一个蓝图,导致每个物体的运动幅度都是一样的,同一个蓝图的多次使用如何带来差异性呢?
第一种方式就是在 Actor 蓝图中设置差异化的蓝图流程,比如在蓝图中添加随机数,用随机数带来差异。
另一种方式就是可以通过抛出输入参数的方式,然后对每个拖拽进来的蓝图物体对抛出的参数进行逐一设置。
如下图所示,新建了 2 个 Float 类型的变量,分别为 zminvalue 默认值为 -100.0,zmaxvalue 默认值为 300.0,然后将其与 Lerp 相连。同时在左侧 VARIABLES 下对这两个变量的眼睛点亮,即暴露这两个变量。
![](https://img-blog.csdnimg.cn/img_convert/383fb777606d5a2535cc6d82d303275b.png)
编译之后,可以看到通过 BP_Cube 拖拽至场景中的蓝图类,有 Zminvalue 和 Zmaxvalue 这两个变量可以设置,对每个进行单独设置后,就可以实现同一个蓝图类的东西有不同的效果。这里只是暴露了这两个变量,也可以像前面一样,设置蓝图,增加 speed、time 等,暴露出来后,可以设置不同的速度等。
![](https://img-blog.csdnimg.cn/img_convert/a894da8b169e601fcf418b4a7d605fc7.png)
效果如下:
![](https://img-blog.csdnimg.cn/img_convert/e5d003d9c189c91f2a41dfad0650cab0.png)
如果已经做好的蓝图类效果很好,想要继承沿用,但是可能里面使用的物体,或者局部特性不一样而已,那可以选择继承父类蓝图,在拥有父类蓝图的同时,当前蓝图还可以做自己的额外蓝图的事件、行为。
父类与子类:蓝图的继承,统一修改等的操作
在新建好的蓝图上,右键选择 CreateChild BluePrint Class
![](https://img-blog.csdnimg.cn/img_convert/a0032648a13c33938b2d8c80c1d3ddfb.png)
![](https://img-blog.csdnimg.cn/img_convert/eb3d4f1e53fc1732ed0a7376f74ab7cb.png)
然后双击 Child 蓝图进入编辑,可以看到子蓝图一进来就有了灯光和立方体。
![](https://img-blog.csdnimg.cn/img_convert/dde6d7b7011eb17e64aa951c9cc5f3f5.png)
Event Graph 中也有默认的继承自父蓝图的 BeginPlay 事件
![](https://img-blog.csdnimg.cn/img_convert/c2c5040fd6d9ac200dc2071b6018e19c.png)
这里我们默认删除所有的,通过手动的方式来选择是否继承父类的事件,以及添加自定义的事件。
先添加 Event BeginPlay 等事件,然后在事件上右键点击 Add Call to Parent Function
![](https://img-blog.csdnimg.cn/img_convert/e7fa22a90cbd0047d64679abca122a35.png)
可以看到 Parent:BeginPlay 的事件又找了回来,可以连接 Event BeginPlay 和 Parent:BeginPlay,这意味着关卡运行时的,当前子蓝图类会继承并运行父蓝图类的事件,同时我们在这里为子蓝图类新加了一个打印字符串,来表明除了可以继承(也可以不继承)父类的初始运行事件,还可以自定义事件。
![](https://img-blog.csdnimg.cn/img_convert/2a253fd1c44c17b942013f3e1987ce78.png)
然后我们将当前子蓝图类的 Cube 从立方体改为圆球。编译保存。
![](https://img-blog.csdnimg.cn/img_convert/eb88de50c121fb513a14a2bf7a900e73.png)
然后将当前子蓝图类拖拽至场景中。
可以看到拖拽进来的子蓝图类同样具有可以设置的参数。
![](https://img-blog.csdnimg.cn/img_convert/b91d95581bcc0b0c1c9fea697fc22dfa.png)
运行后同样执行着上下浮动的效果。
![](https://img-blog.csdnimg.cn/img_convert/98e206e99a4026be000af0a2a9727955.png)
如果此时想要修改所有物体的上下浮动的范围,则可以直接修改父蓝图类默认的 zminvalue 和 zmaxvalue,当所有蓝图类的东西都是默认值时,那么不管是父蓝图类还是子蓝图类的默认值都将跟着改变,达到改变一个蓝图,所有物体的行为都改变的效果。
3、总结
以上就是初步入门,本教程是跟着以下视频教程,进行的学习、总结。
项目工程放到了 Github 上,地址如下: