规则和目标
目录
第一种方式,检测玩家角色进入该体积时的运动方向来判断生死(踩)
对于这款游戏
- 不断前进到达终点则游戏胜利,根据消灭敌人、用时和跳到旗帜的高度结算分数
- 坠落方块、碰到敌人就意味着死亡游戏失败,重生或开始新的游戏
- 踩到敌人头上、拾取道具发射子弹便可消灭敌人
我们通常在GameMode(游戏模式)里面创建游戏规则。现在实现下面几个事件
- 玩家死亡
- 消灭敌人
- 结算分数
BP_MyGameMode
第一排暂停游戏,创建UI并添加到显示,把UMG提升为变量,第二排获取出生点,第三排记录BP_player
开始游戏事件,不要忘了回到UMG中添加调用这个事件,这里仅仅设置了角色的位置,还没有清除角色状态,后面还要修改
关卡底部的DeadBox和触碰到敌人都会触发这个事件,显示菜单UMG
BP_DeadBox(Actor)
添加一个box碰撞体积,一旦角色进入就会执行BP_MyGameMode里面的PlayerDead事件
BP_MyPlayerController
绑定Setting键事件
选中组件中的self,再细节面板中设置Input
清除状态事件
之前获得效果之后,一定时长后清除效果,我们要做的,结束游戏的时清除计时器并调用清除效果函数即可
首先将计时器返回值提升为变量
调用一个清除函数,再把上面的恢复函数复制一份下来即可
BP_MyGameMode中把BP_MyPlayerController提升为变量方便使用
在StartNewGame中接入即可
还有一个问题,场景中的Wall由于存在一个Bool变量
如果我们在第一次游戏触发了生成道具,那么第二次就不会触发
所以我们在新游戏开始之前还要重置IsCanSpawnItem布尔变量
在StartNewGame设置所有Wall的IsCanSpawnItem为true
角色攻击敌人
第一种方式,检测玩家角色进入该体积时的运动方向来判断生死(踩)
之前角色跳到AI头上,会被顶上天,现在我们修改该AL的各个碰撞值,除了最外层的胶囊体设置只允许Pawn进入外其他全设置为没有碰撞
再添加一个胶囊碰撞体积将AI包裹,比原来的胶囊体稍微大一些
测试一下角色的运动方向
可以看到当我们正面碰上AI时Z轴分量为0,而从上方击中AI时Z轴分量为-数,那么我们就简单的按照Z轴的数值进行判断是否踩中AI。
最后如果Z轴分量小于0则AI阵亡,否则玩家阵亡。
第二种方式,拾取道具,发射子弹,攻击敌人
增加按键映射
修改TouchInterface,把B键映射到F按键
新建BP_Bullet子弹蓝图(Actor)
StaticMesh组件(球)
ProjectileMovement组件(弹道移动),设置碰撞值为穿过任何,修改大小
让子弹生成后一定时间自动消失,之前的Item道具里面也可以设置一个
发射子弹
BP_Player增加一个布尔变量,用来确定发射方向
朝X正方向(右)移动时AxisValue为整数设置Direction为true,后面根据这个来设置子弹的生成位置
绑定F开火事件
我们再增加一个子弹数进行限制
和一个最大子弹数,创建一个重新装弹的自定义事件,当我们拾取道具之后,再调用这个事件对当前子弹数进行设置,才允许开火
AI_Character_Normal中修改碰撞检测,与子弹碰撞则死亡,并销毁子弹
添加子弹道具
首先回顾一下之前我们道具制作的思路,道具的类型我们在枚举值中进行定义,道具的作用我们在PlayerController里面定义,然后在Item道具类中当玩家与拾取道具后进行调用。Item道具类又是由Wall生成并随机设置其类型,
总结新增道具流程
- 增加一个枚举值
- 定义其具体功能
- 设置什么时候调用
- 道具生成时设置类型
修改道具枚举蓝图,增加一条Bullet枚举值
具体功能我们已经在BP_Player中实现了,那么设置在与玩家发生碰撞的时候调用这个功能
BP_Item中提升BP_player为变量,再下面开启E_ItemType时调用BP_Player中装弹事件
BP_BaseWall蓝图中,对于三种道具,使用一个随机Bool值已经不够了,我们随机一个范围为012的int值对ItemType道具类型进行设置
修改UI
分数
声明分数变量
新游戏清除分数
显示分数
水平Box
左边文字
右边文本框
调用AddGrade
修改AI_Character_Normal
BP_MyGameMode里面的PlayerDead事件之前有一个目标值是没有用的,删掉即可
状态条
GameMode
UI_Menu
修改PlayerController
修改GameMode
完结
本教程到这里就结束了,内容还是比较完整的,也有很多可复用的思想,如果对你有所帮助,点个赞关注支持一下,谢谢。