Multiplayer Online TPS Battle - UE4 Game Development
Progress
version1.0--2022.10.13
version1.1--2022.10.16
修复了人物被淘汰(血量为0)时可移动的bug。
新增了人物被淘汰的消失溶解动画播放、人物头顶回收机器人的实例生成及回收音效;
新增了人物死亡数的UI、武器现有子弹数和人物携带子弹数的UI;
新增了人物装弹功能及对应动画、音效的功能,还有之前拾取武器的音效;
新增了开火消耗子弹,装弹使携带弹药量减少、武器现有弹药增加的逻辑;
新增了游戏时长UI。
version1.2--2022.10.27
武器大更新!新增武器:
火箭发射器,炫酷爆炸,范围伤害高;
手枪,短小精悍;
冲锋枪,射速快,但是不稳定;
霰弹枪,一枪做掉;
狙击枪,一发入魂,谁敢狙我;
榴弹发射器,小心别把自己炸死 : )
更新的文件意义懒得写了,等工程结束再好好回顾总结 : (
version1.3--2022.10.31
创建了拾取类:子弹和BUFF
- 玩家可以通过拾取场景中随机生成的武器来进行对战
- 玩家可以通过拾取场景中随机生成的弹药来补充军火储备
- 玩家可以通过拾取场景中随机生成的BUFF实现意想不到的效果
- 血量BUFF:恢复50血量
- 护甲BUFF(新增护甲栏UI,击穿护甲后才会损失血量):补充50护甲
- 加速BUFF:提高移速
- 跳跃BUFF:增加跳跃高度‘
- 开启了第二武器栏,玩家现在可以拾取两把武器进行轮换(客户端这边总是出BUG,能正确换武器但是有概率被换下的武器不会出现在后背上-_-||,还没修好)
version1.4--2022.11.3
多人在线对战,需要考虑的延迟问题
服务器检测每个客户端的延迟情况,如果延迟太高,就会有高PING警告(右上角出现红色WIFI闪烁)
为此,新增了延迟补偿机制,即在开火时武器弹药的更换、十字准星的变换等不受延迟的影响,延迟高的客户端玩家也可以正确的到击中的正反馈
修改了对应情况下各种枪械的实现逻辑,给高PING玩家更好的体验
这部分仍待优化
腾讯微云链接:https://share.weiyun.com/Ebyt0PoI 密码:hvk5nn
游戏开发纯纯的个人兴趣,正在朝这个方向不断努力,也希望以后能从事这个行业...
之前暑假也有参加腾讯举办的游戏客户端公开课,还是有所收获的,布置的作业也有在做,但是是用纯蓝图写的,个人不是太满意(模型、效果以及bug过多)。所以在课程结束后,尝试用c++重新写一个项目,继自身的学习以及从网上找的一些资源得到了目前的这个项目,个人感觉还可以?嘻嘻。
为什么游戏名叫 JJJJinx,懂得都懂~~
声明:游戏开发的编辑器为UE4.27,由于UE是向下兼容的,所以低版本的可能打不开这个...Config中为配置文件。Content中为资产、蓝图和地图文件夹,其中资产文件夹中又包括:LearningKit_Games为UE4免费的新手入门包,它包含了最基本的人物骨骼、许多静态网格体以及地图等(我是看上了它可爱的画风所以用的,且它和UE4小白人的骨骼几乎没有区别,重定向很方便);MilitaryWeapSilver也是UE4免费的武器入门包,包含各种武器的骨骼和物理资产以及子弹等附加资产,非常不错子;还有一些乱七八糟的声音、十字准星贴图、字体等。Plugins是自己编写的实现多人游戏插件。最后的Source文件夹则是源代码,下面也会着重介绍。
游戏是基于服务器-客户端托管于UE4在线子系统Steam开发的,目前是可以通过登录Steam在同一个LAN下进行游戏。可能后续还会实现在不同的局域网也可以联机的功能。
Character是咱们游戏的主角,所有与主角有关的状态、UI等都需要在此实现。
BlasterCharacter是实现人物基础功能的文件
设置了相机及弹簧臂组件与人物之间的关系,使得它是一个TPS;设置了人物碰撞;设置了人物移动与摄像机关系;设置了任务转身等。
系统自带每帧都刷新的函数,其中使用了瞄准偏移函数AimOffset(),实现服务器更新人物移动的函数OnRep_ReplicatedMovement()以及实时更新俯仰角使得在服务器看来客户端的人物不至于抽搐的函数CalculateAO_Pitch()以及人物靠近任何静态网格体都隐藏人物网格体的函数HideCameraIfCharacterClos()。
系统自带的游戏开始时自动执行的函数,其中使用了更新人物血量的函数UpdateHUDHealth(),以及实现伤害事件的系统自带函数OnTakeAnyDamage()。
通过计算俯仰角函数CalculateAO_Pitch()更新人物状态
一些游戏输入按键的绑定。
重合时显示可拾取UI
播放开火蒙太奇动画、播放人物消失蒙太奇动画、播放人物受伤蒙太奇动画、播放人物装弹蒙太奇动画
实现人物血量UI的更新,并播放受伤动画蒙太奇,如果人物血量为0,调用GameMode中的人物死亡函数PlayerEliminated()。
人物被击杀后,通过人物消失广播函数MulticastElim()将消息传送给其他客户端和服务器,再通过系统自带计时器函数GetWorldTimerManager().SetTimer()设置人物死亡时间。
播放人物消失蒙太奇动画,在此基础上应用了人物溶解特效,召唤回收机器人及音效。禁用人物移动和碰撞等。
附加在消失动画的溶解材质按照编写的曲线(速率,亮度等)进行溶解
人物死亡消失后经过一段时间,调用RequestRespawn()使得人物重生。
更新人物的击杀数和死亡数
通过调用BlasterCharacter中的函数定义一些有关人物的变量,例如是否在空气中,是否加速、是否装备武器、是否死亡等,并将结果映射到蓝图中的按Bool混合姿势的自变量中,实现人物对应状态动画的播放。
同时解决了人物在扫射过程中偏航角Yaw值不对的bug
以及由于人物骨骼与武器不适配,即人物骨骼并没有在应有的武器位置上而实现的左手IK功能。
修复装弹过程中左手IK不适配的问题,同时右手位置不对的bug也有调整
设置所有通道的冲突响应,设置武器可拾取的圆形检测区域以及人物进入该区域后的拾取UI。
重叠时Pick-Up用户控件可见:调用ShowPickupWidget(),不重叠时不可见。
设置武器状态为未捡、已捡,已捡则不再显示Pick-Up用户控件。
已装备EWS_Equipped、被丢弃EWS_Dropped的状态碰撞、重力设置等
弹药数大于等于0
装弹后,子弹数增加
父类为Weapon
有关Projectile的碰撞设置。
实现发射体的踪迹记录。
摧毁发射体。
父类为Projectile
真实的子弹,应用伤害。
作为枪发射后产生的子弹外壳。
设置物理、重力、碰撞等。
给其静态网格体施加一个力,让它能飞出去。
播放音效后销毁。
主要是用来说明服务器和客户端的网络角色关系,不用于最后的游戏实例。
将十字准星贴图绘在屏幕上。
设置十字准星大小。
实现UI文本与程序绑定
设置人物基础移速和瞄准状态移速(当然也可以蓝图中直接修改)。
设置人物速度和跟随摄像机。
实时更新发射体的路径、击中目标物、十字准星、以及瞄准状态的视野领域。
鼠标左键一直按着就是自动开火。
武器装备,将武器静态网格体绑定在人物手骨骼上。更新武器主人、更新子弹数UI、更新武器类型、播放音效、检查是否为空等
动画播放完成才可再次装弹、期间不可开火
霰弹枪比较特殊,因为弹药要一颗一颗装,并播放对应装弹数的动画音效
播放对应装弹数的动画及音效
有备用弹则装满,没有就不可装
通过通道检测线条,检测到敌人时,十字准星变红,其他状态为白。
实现准星因为人物状态(跑动、蹲下、跳跃、瞄准)改变而扩张或缩小。
机瞄状态下看得更远更清晰,但视野范围变小。
机瞄状态下人物速度改变。
没有武器、没有子弹、装弹中都不可开火
ECS_Reloading执行装弹逻辑,ECS_Unoccupied
游戏地图首先是GameStartupMap,为一个开始界面:创建游戏、加入游戏和退出游戏。当点击创建游戏时,进入地图Lobby;点击加入游戏时则自动搜寻与自己处于一个局域网下的已开始游戏并加入;退出游戏当然就是退出游戏。
当进入地图Lobby的玩家大于等于2(目前设置,便于测试)时,自动进入游戏地图BlasterMap。
调用Elim()
玩家死亡后等待消失计时器结束重新复活,复活位置随机
主要实现一些UI文本与逻辑的绑定,和游戏时间设置
每一帧都要更新游戏时间并确保客户端与服务器的时间同步
SetHUDHealth()、SetHUDScore()、SetHUDDefeats()、SetHUDWeaponAmmo()、SetHUDCarriedAmmo()、SetHUDMacthCountDown()
设置设置设置设置....wnkfkwjflwefj(神志不清)
新添加的功能都会在对应模块写出,更新时间及内容也会在README文件的开头Progress指出。
此项目纯属个人娱乐,记录自己的开发过程,激励自己不断学习 :)