赞
踩
游戏介绍:
《生死轮回》是一款基于虚幻引擎4开发的Cyberpunk题材横版Roguelite动作游戏。这款游戏基于C++和Blueprints进行Gameplay与功能开发。
视频的内容由两部分构成:
结合这款游戏,介绍"战斗系统"和"无缝随机地图"的设计及实现技术细节。
作为制作人和Gameplay程序员,李伟将遵循自己在游戏开发过程中的路径展开讨论:从简单的单点功能设计到技术实现细节,到各模块的内容交汇在一起构成复杂的游戏性系统。
正文:
战斗系统
主要讲“近战武器”+“受击者反馈”这两个系统。
一、近战武器设计
技术目标
实现30多种武器的基础伤害功能,拉开不同武器的感受差异
特性分析
武器形状(精确的攻击范围)
目标角色反馈(对不同目标:机器人,人类做出不同的反馈)
表面材质反馈
击打顿感:利器和钝器
1 近战武器框架:
2 近战武器检测实现
<1>线性检测
玩家挥动武器时,从一个端点朝另外一个端点不断的发出射线,扫描自己击中的物件的一个过程(之前坦克游戏博客篇有涉及,比如DrawDebugLine函数等)。
<2>由角色驱动的检测通知
角色在挥舞武器时检测,自定义攻击检测的通知节点,在攻击动画播放时调用代码。
trace可以写在Tick中,也可以自定义Timer。
<3>受害者队列
创建了一个数组,每次击中时判断敌人是否在里面,如果不在就加进去,进行伤害处理;如果再次击中,就把他排斥在外。
但同一个敌人可能会在Trace过程中被多次检测,多次受到伤害(保证起始到结束不重叠即可)。
3 近战武器击中反馈实现:
<1> 击中目标
IsInHurtList和Teamid来进行判断
<2> 飞溅的血液和清脆的金属
使用HitResult获取目标角色被击中的位置信息,然后播放粒子效果(类似坦克发射子弹点,播放粒子效果)。
使用HitResult获取物理材质,基于这个播放对应效果。
<3>摄像机震动
使用PlayerController的ClientStartCameraShake
<4> 击打顿感
SetGlobalTimeDilation函数,可以设置整个游戏世界的时间播放速率。
二、受击者反馈
2.1 受击者特性分析
动画、推力和溅血
1 推力
ABaseCharacter实现了角色和敌人的共有特性及功能
2 受击动画反应
在ApplyPointDamage函数中,最后一项为DamageType,团队对这个进行了扩充,定义了自己的受击类型。
基于受击类型,进行受击动画反应(播放蒙太奇动画)。
3 溅血等细节表现
泛起溅血贴花的效果,当敌人承受攻击后,四周的地面和墙壁将会泼洒血迹。
2.2 角色死亡特性分析
死亡效果呈现
<1> 布娃娃效果
注释[1] [2]:
在早期电脑游戏中,开发者通过手工制作一组按动作顺序的角色图像,并接连显示出来以达到角色动画的目的。这种技术对处理器的要求很低。
随着电子科技的不断发展,在游戏中实现即时动画逐渐变成现实。开发者用三维绘图工具制作一个角色模型,并在合适的位置给角色安装骨骼,通过游戏引擎中的骨骼控制模板,控制这些骨骼的移动,而角色的表层随着骨骼的移动而发生相应的变化。这样的技术让游戏中的角色有更加多变丰富的动作可以变现。
但由于技术的限制,诸如骨骼的移动没有类似肌肉的物质来约束,以致游戏引擎在控制移动骨骼时,常常出现将骨骼移到一个在现实中不可能实现的位置,就像布娃娃,该系统由此得名。
第一个使用了布娃娃系统的游戏是《侏㑩纪公园:侵入者》,虽然该作漏洞百出,但还是因为率先使用了物理引擎而被载入史册中。
当前的游戏设计中,布娃娃系统常用在动作游戏以及射击游戏中,且技术有了很大进步。玩家控制角色身体的一部分,其余部分跟着运动,进而营造一种丰富的动作表达。
为角色绑定好布娃娃效果,在敌人死亡时,激活角色SkeletalMeshComponent的物理模拟。
<2> 断肢系统
在伤害类型中定义很多的断肢情况。
直接关节处解绑是一个想法,但是团队在开发过程中找到了更简单的方法。
基于不同的伤害类型,使用HideBoneByName,传入对应的骨骼,进行隐藏肢体。
然后还要生成一个具有物理效果的肢体。
接下来就是无缝Roguelite地图:游戏共有7个大关卡,每个关卡在每次进入时都和上次不同,整个过程无缝连续,具有如同线性游戏的连贯游戏体验。
三、具体实现
不记录对于游戏的优缺点分析。
3.1 实现方案参考
<1> Procedural动态生成——死亡细胞
可以先看下YouTube这个视频介绍[3]。
制作了大量的随机房间,对其进行分类
定义好出口和入口,按照预设的算法规则,在关卡初始化时,动态的将这些出口和入口进行连接。
图片来源:[4]
<2> 房间过渡式动态生成——HADES
图片来源[5]:
制作大量房间,玩家每离开一个房间,按照一定的拓扑规则,黑屏加载下一个,卸载当前的。
3.2 随机地图设计
按照线性游戏的制作思路开发了一个完整关卡,然后对其按照区域拆分。让每一个区域有满足整体和周边风格的迭代。
在对区域进行多次美术迭代后,思考是否也能对每一个美术区域的逻辑,进行多次迭代,以丰富关卡体验。
区域由“美术”和“逻辑构成”
<1> 关卡区域拆分
每个主关卡,由自己和按照区域划分的包含在其中的大量迭代子关卡构成。
<2> 主关卡构成
3.2 随机区域实现(略)
希望国产独立游戏,国产单机游戏越来越好。
参考:
[1] 维基百科
[3] How Do Procedural Game Worlds Work In Video Games?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。