(蓝图)虚幻4制作超级马里奥(九)Child Actor Component和Construction Script快速制作场景

最后效果如下,Floor细节面板中对生成的Wall数量和位置进行设置

本章我们将实现在构造脚本程序化生成若干个StaticMesh并对其Transform进行设置,从而实现快速搭建场景的目的。通过这个部分你可能会明白各种Component的核心用法。

目录

Component实验

融合Actor实验

Component总结

场景制作

Wall升级——WallType

Wall升级——Child Actor Component生成若干个Wall Actor

Floor升级

几个问题

定制数量和位置结构体

正确设置设置WholeWall

总结


在制作场景元素之前,先做几个实验

Component实验

第一步,新建一个Actor类蓝图,两个Vector变量,分别命名为StartPoint和EndPoint,EndPoint勾选InstanceEditable和显示3d控件

第二步,在构造脚本中创建如下节点

第三步,在场景中放入该Actor,点击中间菱形并拖动一个x或y方向的轴进行移动,此时可以看到,Actor根据EndPoint的位置动态的创建若干个StaticMesh

上面的版本只能在x轴上生成Mesh,进行修改之后,可以正确的在xy平面内生成Mesh

 

我们再给生成的Mesh设置一个Z轴的缩放

稍微修改成了一面墙壁

融合Actor实验

再深入一步,选中场景中的ACtor,使用窗口,开发者工具,融合Actor工具将Actor变成一个StaticMesh

到这里我们获得了一个从场景中程序化生成的StaticMesh,后续可以直接使用

但是,说真的,如果你真想创建一面墙壁,你绝对不想使用这种方式

我们先打开一个单位的StaticMesh,我这里用的是官方的Cube,可以看到三角形48,顶点54

打开融合后的StaticMesh,根据尺寸可以知道有10个单位的cube,而三角面和顶点刚好是10倍的单位数量

这里一个6个面的长方体的墙壁,却用了几百个三角面和顶点,这对性能的影响可想而知,我这里只是举了一个不太恰当的例子,但是这并不能说这个功能鸡肋,一般复杂的3D游戏的场景都是使用专门的建模软件制作,引擎中进行组合

总的来说,使用融合Actor这种方法并不适合相同简单模型的组合,适合多个不同的模型进行组合

Component总结

Component在虚幻4中处处可见

看似类型众多,但是使用方法却是如出一辙,就是一种容器的思想,首先创建一个类型的Component,然后进行填充,再进行设置,Component就差不多介绍到这里,还是赶快进行正题吧

场景制作

整体的思路

之前我们制作了一个能触发随机生成两种道具的Wall,但这是远远不够的,我们需要更多的组合,而且现阶段Wall任然需要我们一个一个的去放置,这显然是不科学的 。

Wall升级——WallType

Wall的状态和道具是否生成有如下三种可能

  • 不移动+无道具
  • 移动+无道具
  • 移动+道具

对于Item道具类而言,之前通过一个枚举变量实现了道具的两种效果。

那么同理可得,我们把这三种组合状态看成一个有三个枚举元素的枚举值,与上面三种状态一一对应,在生成Wall的 时候我们对Type进行设置,在执行角色触发事件时根据Type执行不同事件

BP_BaseWall蓝图中增加一个EWallType类型变量命名为WallType,并勾选蓝图中可编辑和生成时显示,以便我们在生成Wall时设置Type

修改蓝图,当玩家触发事件时,根据WallType执行不同的事件

回到场景中,选中场景中的Wall,在 细节面板中可以设置WallType(如果没有,可能没有编译或者变量旁边的小眼睛没有打开)

Wall升级——Child Actor Component生成若干个Wall Actor

你肯定不想地图中每一个Wall都手动创建和设置,接下来我们用一个新的蓝图来创建连在一起的多个Wall

新建一个整型变量LastIndex命名为WallNum并勾选InstanceEditable(蓝图中可编辑),和在生成时显示,设置默认值为3

完整的蓝图实现了生成WallNum个AchildActorComponent(并设置ChildActorClass为BP_Base_Wall),设置WallType为MoveOnly。

编译之后,不出意外的话你在视图界面将会看到3个并排的Wall,如果没有看到检查一下是否设置WallNum默认值并点击编译。

回到场景中,把WholeWall拖放到场景中,这样一瞬间就生成了3个连在一起的Wall,并且可以在细节面板中设置Wall的数量

此时你应该明白为什么我们开头要做几个实验。单纯的StaticMesh似乎看不出众多Component的用处,但是这里的ChildActorComponent却能实现一个相对复杂的组合。当然还有很多神奇的用法更好的用法,我这里只是抛砖引玉

Floor升级

接着,和上面相似,我们用BaseFllor来存放WholeWall和Post两种Actor,并对他们的位置和属性进行设置

构造脚本中

注意使用Get的时候选择Ref(引用)的那个

创建两个Vector类型的数组,我们在场景中可以进行增加元素

最后你可以在场景中增加新的Wall和Post,点击并拖动中间蓝色的3d控件便可以设置每一个Actor的位置

 

几个问题

  • 只用设置WholeWall的x和z坐标,Post的X坐标。

解决方法:

使用枚举值对WholeWall的坐标简单的封装设置可以

但我们这里使用int型值进行更精准的控制

然后再修改构造函数来解决上面WallNum的问题

至于Post我们使用一个浮点值进行控制即可

 

  • 新的Actor总是在底部生成

 

  • 如果我们像上一章那样在添加Actor之后再修改Actor的属性就会失败

为什么?

Floor分配空间之后,首先被调用的 是Floor的ConstructionScript构造函数,接着添加了若干个ChildActorComponent,再设置了了ChildActorClass(这里开始调用WholeWall的构造函数,然而并没有设置WallNum)由于WholeWall构造函数已经被调用,之后就算设置WallNum,也不会用来执行生成WallNum个Wall事件,因为构造函数已经被调用了。

解决方法:

就是在BaseFloor构造函数中仅仅生成Componment,并保存到数组

然后在游戏开始后再生成WholeWall存放到Component数组中

在生成之前我们可以修改WallNum再调用的构造函数。

这样做到弊端就是:没有开始游戏的时候无法直观的看到场景

定制数量和位置结构体

新建一个名为E_WholeWallLocationAndFloor的结构体,两个变量浮点型的X和整型的Floor,X用来控制水平方向的位置,Floor用于设置Actor位于第几层

在BP_BaseFloor蓝图中添加这个类型的变量数组,功能类似于之前的WholeWallLocation,一个元素出一个Actor

按照下图修改即可

在默认值增加一个元素,到视口中查看,已经多了一个WholeWall

 

可以把刚才的WholeWallLocation删除

回到场景我们在细节面板中增加新的WholeWall,设置Floor和x(设置的时候最好手动输入,拖动修改引擎可能会因为操作次数过多导致引擎崩溃)

 

 

 

 

现在差不多了,如果觉得不方便,可以把结构体X换成向量类型,使用3d控件进行设置

Post也很简单

 

下面一张图你应该就能明白,这样一层一层封装的作用

正确设置设置WholeWall

新建一个ChildActorComponent类型数组

删掉之前的SetChildActor节点,把Component保存到数组

新建一个自定义事件,注意三个地方

  1. 拆开Transform
  2. 添加一个AttachToComponent(附加到Component)并设置LocationRule为SnapToTarget(和目标的位置一样)
  3. 设置WallNum了

最后游戏开始时调用一下即可

修改一下E_WholeWallLocationAndFloor结构体,让我们可以控制每一个WholeWall的Wall个数

总结

就像前面说的,这种方式由于过多的Actor导致不必要的性能消耗,不适合大规模场景的制作,不过对于快速制作游戏Deao很有帮助 ,本章中有很多的技巧,仅供参考,如果你有更好的方法欢迎评论指点

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锋哥游戏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值