目录
顶动方块之后有几率产生道具,角色接触到道具,获得效果
生成
1.一个新的Actor类蓝图
2.添加StaticMesh组件并设置成Shape_Sphere,设置位置z=-50,设置碰撞预设值为NoCollision(没有碰撞)
3.再添加一个Sphere Collision球形碰撞体积,调整碰撞体积的大小刚好包裹StaticMesh,
打开Simulate Physics,SimulationGeneratesHitEvents,设置碰撞预设值为PhysicsActor
Mesh一定要在Sphere层级下
在Sphere的细节面板中找到OnComponentHit并点击加号
添加如下蓝图,我们将测试物体碰到玩家角色时触发销毁事件
不出意外当玩家碰到小球道具的时候就会触发销毁事件,下面再使用timer实现自动销毁,顺便把控制器和角色的引用保存一下以便后面制作效果
回到
修改BP_Base_Wall
创建一个SpawnItem自定义事件,生成类节点SpawnActorfromClass,并绑定到顶动事件上
最后接到玩家进入box触发事件的WallJump后
运行游戏,已经能够生成道具了,但是可以无限次生成道具
控制生成次数
很简单我们用一个布尔变量控制该方块是否能生成道具(你也可以设置一个Int型变量用来控制次数)。
现在就只能生成一次道具了
似乎很生硬,我们在它生成的时候给它一个力,让它往右边移动。
效果
制作几个简单的道具效果——增加玩家角色的弹跳力、移动速度
首先到BP_Player玩家角色蓝图中,在游戏进行的时候打印角色的移动速度和跳跃高度
运行测试
接下来制作道具功能
枚举类型记录道具的种类
修改BP_Item道具蓝图
新建一个变量,命名为Type,类型为刚才创建的枚举类型(勾选InstanceEditable(蓝图中可编辑),和在生成时显示,以便后面在生成的时候设置道具的类型)
执行不同事件
添加一个流程控制中的 select(开启)E_ItemType,并接到之前创建的CasttoBP_Player节点后面,把刚才创建的变量拖拽到Selection上。
当玩家触碰到Item道具时,根据Item的Type执行不同的事件,如该道具的Type为JumpHigh,那么我们就增加角色的起跳速度
把Item拖拽到场景中进行测试可以看到,现在角色吃了道具后能跳的更高跑的更快。
但是这里有一个BUG。仔细观察上面的角色获得道具效果事件,角色在获得效果的同时,Item也被释放了,那么谁来让角色回到原来的状态?待会再解决,现在我们先实现在Wall生成Item时设置Item的类型
Wall生成Item
现在我们在创建道具之时对Type进行设置,回到Wall蓝图中,我们可以看到在SpawnActor节点中已经多了一个Type(如果没有先编译)
此时它的值是BP_Item中Type的默认值
我们让它每次生成的时候都随机生成一个布尔变量,然后根据布尔变量设置Type
这样,每次生成的道具就有了两种可能(如果有两个以上道具类型使用Int型变量)
解决持续时间问题
能够想到的最简单的办法是在Item(道具)蓝图中,触发效果之后,先不慌DestoryActor,设置一个Timer等待一定时间后取消掉角色效果再销毁Actor。这样做的是没有问题的,但我们为什么不在一个游戏过程中一直存在的类上创建事件,由Item调用,调用之后便Item可以立马被销毁。
我这里是在PlayerController中对玩家角色进行设置,在GameMode中进行设置更规范一点
PlayerController在游戏过程中不会被轻易销毁,我们只需要将效果函数写到PlayerController,由Item(道具)进行调用就可以放心的销毁了。
修改BP_MyPlayerController
游戏开始的时候记录BP_Player(角色)的最大移速和起跳速度
两个自定义事件用来设置最大移速和起跳速度
两个自定义事件JumpHigh和WalkQuick由Item触发Hit事件之后选择调用,注意这里的Timer的时间设置的3秒,也就是说效果产生后3秒又会恢复到最开始状态
修改BP_Item蓝图
修改之前的Hit事件
后面我们再增加UI显示
总的来说,这章使用枚举变量+碰撞检测直接实现了道具的拾取,也可以使用接口来实现,不过这里先到这里吧