本篇介绍蓝图构造函数Construction Script
****的博客添加图片太麻烦了,而且链接网页图片会出现错误,如果需要看详细文章,请访问我的微信公众号《猎梦虚幻研究社》
先来看一下这个函数长什么样子:
很尴尬的发现这个函数没有官方中文名,所以我就暂且称呼它为蓝图构造函数。
其实这是单独一个函数,应该放在函数类别的文章里来介绍,但因为这个函数比较特殊,所以我还是决定将它放在蓝图中讲解。
Construction Script如果直接翻译的话,就是构造脚本,在引擎中作为初始化函数来使用。
类似于C++中的构造函数,作为蓝图构造函数的Construction Script也是用于类的初始化。如果不了解编程的人,对于初始化函数第一个想到的应该是Event Graph中的BeginPlay事件。
构造函数和Begin Play的区别在于,同样是初始化,但是构造函数是在对象生成的时候就进行的初始化,或者说在类被实例化(创建出新的实例或者对象)时会执行一次,而Begin Play则是在游戏开始时进行的初始化。也就是说构造函数要更加早于Begin Play事件,并且构造函数相比之下更加的灵活,而且甚至可以在游戏运行之前就进行初始化。
而正是因为可以在游戏运行之前就进行初始化,所以这个函数也可以用来帮助我们开发,制作一些简易的工具来进行使用。虽然它不如Tick等函数来的直观,但是它仍然是一个值得去认识去学习的函数。(至少我的蓝图学习就是从Digital Tutors上看构造函数教程开始入门的)
上面说到Construction Script是蓝图构造函数,那既然是蓝图的构造函数,那就说明和C++本身的构造函数还是有区别的。
这里,对于想要学习C++开发游戏的朋友来说,这个蓝图构造函数在C++中实际上是OnConstruction这个函数。这是一个创建于AActor的虚函数,形参表中只有(const FTransform& Transform)这一个参数。可以在自己的类中直接重写这个函数,然后在里面写逻辑即可。
蓝图构造函数不同于C++原生的构造函数的地方在于,C++原生的构造函数仅仅只在被实例化的时候会执行一次,而蓝图构造函数则能在编辑器中被反复调用。
对于蓝图构造函数,当你将类拖放到场景中时,它就被实例化了,这时就会调用一次。而当你拖动物体,旋转物体,缩放物体甚至修改它的参数,对他进行编译时,都会调用这个蓝图构造函数。这样能够反复利用的原理让这个函数有了更广泛的应用空间。
这里我引用官方蓝图教学视频的一个例子来讲解。
任意创建一个Actor类蓝图(现有的或者新建的都可以),打开蓝图在ConstructionScript函数中,添加一个SetActorRotation函数,并添加一个RandomRotation函数作为旋转的输入,具体如下图:
给这个Actor类一个StaticMesh组件,并且设置任意模型。编译过后将这个蓝图拖放到场景中,这时你应该就已经能发现,在拖动的时候,会不停地更改旋转角度。这也就是我之前说的,在任意移动旋转甚至改变变量或者编译时都会触发Construction Script函数。
当然,并不推荐把初始化随机角度的功能用这种方式实现,就算用也不能直接使用SetActorRotation,因为这样会改变蓝图根组件的旋转,从而影响在这个蓝图上的后续开发。这里的例子只是为了帮助你如何理解蓝图构造函数。
就我个人而言,通常使用蓝图构造函数时都是设置物体的大小或者材质的,比如说在某个Actor里为它的StaticMeshComponent设置一个特定的材质,或者创建动态材质,如下图:
当然,这只是个人习惯。
前面提到,我最初学习蓝图的时候是在Digital Tutors上看的蓝图构造函数教程来入门蓝图的。DT上作为例子讲解的是一个快速创建围墙和在区域内快速铺满植物的一个工具性蓝图。
我在这里简单介绍一下第一个快速创建围墙的方法。
首先要在变量Variables面板里创建一个Vector坐标,我命名为EndPoint:
对于这个变量,我们要将它显示在场景中。这时在细节面板,先勾选Editable,然后再勾选下面的Show 3D Widget,这时先编译,再将默认值设置为X:100, Y:100, Z:0这样,如下图:
现在要用到两个新的函数,分别是AddStaticMeshComponent和SetStaticMesh,并且要用到一个For循环和一些数学函数和一些额外的辅助变量。我直接给出完整的蓝图截图,如果有兴趣可以试着做一遍,如果没能完成,也并没有什么影响,因为实际上这个功能也没有什么实用性。
现在让我们看一下这个围墙的使用效果
中间的间隔是由Width变量决定的,如果场景中有多个蓝图,可以直接在场景中点击蓝图然后在右侧细节面板对每个蓝图分别设置参数。
但是一定要注意,千万不能把Width设置的太小了,如果间距过小,会导致瞬间创造出很多的模型,一般的电脑就直接卡死了,所以要注意。
蓝图构造函数的实际使用等到以后真正需要时再做研究。