redhat9i 发表于 2021-8-19 20:39

unity怎么去实现act战斗?

对于战斗系统几乎是零基础,想要自己学会写一个战斗系统,要做些什么准备呢,或者说有那些参考的开源项目呢,请大神指教。

xiaozongpeng 发表于 2021-8-19 20:41

你想要的是这个效果吗

acecase 发表于 2021-8-19 20:45

前言

战斗系统可以说是游戏开发中最困难的系统之一,因为它要求极高的灵活性,可拓展性,可维护性。
大体来说,战斗系统包含技能系统,Buff系统,状态系统,数值系统,寻路系统,网络同步(如果是网游的话)等。其中每个模块都需要花费精力去深入研究。
我个人对战斗系统还是比较感兴趣的,平时也在学习和研究,并且制作了一个开源的Moba游戏的战斗系统。(目前即将登顶开源社区码云的游戏分区榜首)
烟雨迷离半世殇/NKGMobaBasedOnET以及其配套的技能系统技术博客:
基于行为树的MOBA技能系统:总目录接下来我就来分享一下我对学习制作战斗系统需要的知识储备吧。
独到且深入的游戏理解

没错,这个明明看起来是策划大哥的学习内容,却是我们开发战斗系统的第一要义。
原因有很多,首先如果没有独到的游戏理解的话,涉及战斗系统的细节就会手足无措,例如LOL中的攻速机制,并不是简单地根据攻速控制动画播放速度,而是有很多公式和潜规则在里面,具体可参见:理解并实现LOL中的攻速机制。
其次,这方面理解不够,可能会让我们在和策划对战斗需求的时候花费很多时间去理解策划的本质需求,从而更好地架构我们的战斗系统。
网络同步方案

如果制作网游的话这是必须要了解的,因为需要在每个玩家的终端去同步其余玩家的数据,目前主流的有状态同步和帧同步(这两种方案不同的人有不同的命名,意会即可,具体可见 @flashyiyi 大佬的修正歧义:帧锁定同步(frame lock sync)&按帧同步(frame sync)&状态同步(state sync))。
两种方案剖析和使用典型可见:
云风lockstep网络游戏同步方案
《守望先锋》架构设计与网络同步
编辑器拓展

之所以把编辑器拓展放到最后,倒不是因为他有多难,而是制作一个好的技能编辑器需要前面的知识储备,心中有了大体脉络,才能制作出易用,灵活的技能编辑器。
这是必不可少的,因为战斗系统本身需要灵活,可拓展,所以需要一个专门的编辑器去制作技能。
目前主流的主要有三种技能编辑器
一:线性数据配置
优点是简单直观
缺点是无法应对复杂的技能逻辑,尤其是带有跳转或分支,而非线性的技能逻辑。
下图来自:https://github.com/m969/EGamePlay



二:Timeline
优点是所见即所得,精确的帧事件把控,适用于帧同步的游戏,例如题主所提到的ACT
缺点同样是无法优雅的应对带有条件跳转的技能逻辑,一般还需要配备一个FSM可视化编辑器来配置多Segment。
下图来自 @Gordon 大佬专栏:https://www.zhihu.com/column/c_199694379



三:行为树
优点是可以配置任意技能逻辑,因为行为树本身就是图灵完备的。并且逻辑十分直观。
缺点是如果要做到精确的帧控制和所见即所得需要颇费一番功夫。
所以它适用于一些状态同步的项目,例如Moba。
下图来自本人开源Moba项目:https://gitee.com/NKG_admin/NKGMobaBasedOnET



总结

战斗系统还包含很多零散复杂的的模块,其中有些内容我并未在文中列举,只列举了两个大头,题主可以自行前往我在回答开始的那个战斗系统博客或者youtube的GDC进行学习。
最后,祝君武运昌隆。

c0d3n4m 发表于 2021-8-19 20:48

上面有的回答都是什么水货?还有人说厉害,我也是醉了。。。

【Unity】sd快打旋风复刻,3个主角全啦_哔哩哔哩_bilibili
【Unity】我又来开发我的小游戏啦_哔哩哔哩_bilibili
这是我下班时间做的,有时间就做,没时间就放着,这个视频里展示的内容做了差不多四五个月左右(资源都是从原版扒出来的),其实仅仅只是实现这个玩法简单的很。
然而,如何让开发流程更加简单高效,如何让代码更有组织更加健壮却不是一件简单的事。
我在真正开始做这个玩法之前,花了至少2个月时间做了资源管理,ui框架,有限状态机框架,行为树及对应的编辑器,ab打包及管理及编辑器,观察者消息框架,基于scriptobject的配置表,对象池,资源池等等等,可以称得上是写了一个功能非常之齐全小框架。

建议想 好代码的老哥有时间就多研究研究GameFramework,真的很受启发。
https://gameframework.cn/
以前我滥用设计模式,单例满天飞,遇事不决就是manager of manager,这样的代码虽然可以做出游戏,但作为程序员,我真的很鄙视这种行为,所以我又重新开始钻研各种设计模式,研究各种框架。
然后我找到了这个GameFramework,我不知道写这个框架的大佬到底经历了怎样的学习过程,以及在实际工作中攻克了多少疑难杂症,反正我愿尊称他为码农界的莎士比亚,太特么优雅了!
然而已经工作了快4年的我,到现在感觉自己仍然只是处于架构这座大山的山脚,愚钝如我,路还是长的很。

说了些题外话,权当抛砖引玉了。。



忘了回答问题了。。。
基础知识,向量,欧拉角(四元数),贝塞尔曲线,unity的物理引擎,动画系统,2d的spine,龙骨等等吧,做战斗系统就是各种坐标,动画,旋转,碰撞,这些得先学会吧。

然后再学习状态机,行为树。算法方面感觉其实研究一下AStar也就够用了。

再然后就研究设计模式来提高抽象能力,战斗系统归根结底还是GamePlay的一部分,必须具有一定的架构能力,否则这玩意越写你越想删库跑路。。

比如我问你,要你把你一个普通攻击的技能拆分出来,你觉得它是哪几个模块组成的?

然后看了你的描述,感觉还是先自己学习一些网上的小demo,照着例子做一两个,先做一下了解吧,比如siki老师的《泰斗破坏神》我就觉得非常适合初学者(siki老师真的是带出了一帮unity开发者哈哈哈)。

最后我再简单聊聊怎么实现act,其实就是实现技能,这个范围可有点大了,只能把我掌握的东西说说。

如果把技能抽象,那就是选择目标,产生结果。
因此我们需要选择器,需要释放器,需要效果器
以我这个视频为例,主角的连击是不打到怪就保持第一击,打到怪才会进行接下来的连击,而跳跃攻击是从上升到下落,只要有怪接触就要使其受到伤害,可以说这两种释放方式都不同于一般的技能。
因此我把释放器分为,普通攻击释放器和跳跃攻击释放器和一般技能释放器。
每个技能对应一个释放器,每个释放器会管理若干个效果器,而上面也说到技能的本质是选择目标产生效果,因此每个效果器要有一个选择器来为其提供对应的目标。
技能又分为主动和被动
主动技能的效果一般有几种触发方式:
1.由动画关键帧触发,就是把上面说的那些选择目标产生结果的逻辑绑定到这个动画的关键帧来执行 ,每一个关键帧对应一个效果器。
2.一定时间内一直触发,就是update一定时间
3.产生另一个或多个对象,并在它们的动画关键帧或者一定时间内触发,也是基于前两个的,只不过把效果器的持有者换给产生的对象。
被动技能就是一堆buff,把效果付给某个目标。
有时间也可以多看看知乎老哥分享的技能编辑器,也是很受启发的。
我开发的角色动作系统概述-战斗,3C相关
五:方便扩展的被动技能,Buffer系统(和编辑器)
如何实现一个强大的MMO技能系统——序章

kirin77 发表于 2021-8-19 20:55

要做些什么准备?其实非常简单,就2件事情——搞清楚act和即时回合制游戏的区别,然后花点时间翻一下我猴叔回答的所有动作游戏相关的答案(当然你也可以在gameres或者公众号千猴马的游戏设计之道看我的文章,我的文章一般不发知乎)。
Act和即时回合制游戏的区别

这是一个玩家脑袋里非常混沌,但是作为专业开发者必须非常清晰的概念。在市面上有很多被称作“动作游戏”的游戏,他们压根就不是动作游戏,从技术上区分动作游戏,只有一个key——看他的实现方式,也就是如果实现的时候是通过帧作为单位,来制定每一帧的各种碰撞框,并且为每一帧制定数据的,他才是动作游戏;反之,以动作为单位的,比如使用了motion matching、animator、行为树之类,从逻辑上就是以动作和管理动作为根基的游戏,他们都不是动作游戏(只是因为电影里面动作电影的称呼套到游戏上混淆了才叫动作游戏,并且套上了act的类别,这其实是外行分析作祟导致的错误结果)。
当你明白这个之后,你才能真的开始着手只做一个act游戏,不然你会搞混了act到底要什么。这里我给你几个实实在在的例子,区别出act游戏和即时回合制游戏:
标准的ACT游戏包括且不限于:恶魔城系列、街机吞食天地系列、格斗x人组系列、恐龙快打系列、怪物猎人系列、kof系列、饿狼传说系列、侍魂系列、街霸系列、忍者龙剑传(仅限FC系列)。
标准的即时回合制(伪动作游戏)包括且不限于:xx无双系列、魂系列、只狼、忍者龙剑传(非FC)系列、原神、塞尔达野炊、战神系列。
理解act游戏与即时回合制游戏的区别,对于游戏开发的思路不同,是一个非常基础且重要的事情:
动作游戏中,如何引导玩家避免一直使用普通攻击?因为当你的设计思路不同的时候,游戏就走向迥然不同的结局了,而其中有一个最有意思的细节是——即时回合制游戏是可以做大型MMO网游的,因为它可以使用CS架构,而动作游戏,是只能用p2p的(你们常听到的lockstep之类的帧同步其实就是p2p联网技术的一种)。
做动作游戏,有哪些开发细节?

首先动作游戏是逐帧设计的,每一帧去制作碰撞框,然后游戏运行的过程,实际上就是在推进场上每一个角色的帧,为他们选择正确的“下一帧”。开发动作游戏中有哪些细节?其实在知乎是有很多类似问题的,并且我猴叔都是详细回答的(也许你能真正看到有价值的回答也就只有来自我猴叔的了,其他的都是情感回答没有实际帮助的)
动作游戏中角色移动是怎样的?

其实这当中是有大坑的,你见过的大多教程,他给你的范例都是在平地上移动的,所以逃避了非常非常多的细节问题,但是你真的着手去开发一个动作游戏,哪儿来那么多平地?我猜你想做一个act,大概率也是想做一个“类银河战士恶魔城”的游戏,那么他的地形肯定不“平坦”,所以就有了第一个问题——角色的移动要怎么做?
Unity2D格斗游戏开发问题?然后当你做移动的时候,你突然想到了,还有一个问题——动作游戏里的下跳怎么做?这个细节问题很有意思,因为没有经验的人是想不到的:
Unity2D如何实现同时按“下+跳”跳下平台?当然如果你要做的是kof之类的格斗游戏,就很好的逃避了地形这个问题。
动作游戏的动作该如何管理?

既然是动作游戏,那么顾名思义,他得有角色动作,尽管我强调它是由帧组成的世界,因此“每一帧世界都在变化”(注意,这是动作游戏的核心)。那么一个动作游戏里面,角色的动作要如何管理呢?用animator或者motion matching之类的,你猴叔都不推荐,那你猴叔是不是只驳不立?就让猴叔用20年前做侍魂、10多年前做恶魔城的经验给你讲讲:
动作游戏中人物动作很多时如何管理状态?所以说,动作游戏中的“动作管理”,无非是解决一个input问题,而实际上动作游戏,在程序逻辑上根本不应该存在“动作”这么一个概念的单位。
动作游戏的招式怎么输入?

那接下来,怎么让角色做动作呢?毕竟是动作游戏对吧,除了标准的输入,我还得出招:
格斗游戏的招式指令实际代码是如何判断的?动作游戏中打斗是怎么做的?

既然是动作游戏,总得有打斗对吧,没有打斗,按照外行的分类(用电影的逻辑)可能就成了“爱情游戏”甚至是“悬疑游戏”了,对吧。
动作游戏的打斗,一句话说,就是每一帧碰撞盒之间的判断和处理——但是这是一句高度概括的话,具体到细节,有哪些常见问题呢?先从这个回答感受一下动作游戏的打斗和判定盒:
为什么升龙系的招式判定都很强?首先听说你很关心连招对吧,毕竟“打击感”的核心之一在于连招:
游戏的连招动作是怎么设计的?代码上又是怎样实现的?光是能打出连招还是不够的,我们还需要处理连招的“效果”对吧:
不考虑动作的话unity如何实现类似鬼泣的浮空连击?当然,所有的问题里都忽略了一个你会遇到的小问题,我就在这个回答里给你做个补充:
动作游戏中如何实现一个攻击只有一个伤害或者一个攻击下去连段伤害?

这里我们要回到一个“错误”的概念——那就是“动作”,这个问题因为是人设计的问题,所以得有一个“动作”的概念在里面才比较好理解。
在实际设计中,我们正常的需求是“一次攻击只造成一段伤害”,这非常好理解,我一刀下去应该只有砍中一下对吧;但是很多时候也会有为了酷炫,我们要做到“一刀下去可以造成好几段伤害”,在街机吞食天地2有类似“草薙”之类的神剑,他一刀下去就是好几段伤害;除此之外,还可能因为角色有了某个buff之后,原本一刀一伤害,变成了一刀若干伤害,这在动作游戏里面要如何实现?
首先我们移动作为概念来设计这个逻辑,然后在考虑转到每一帧,这个设计的本质是,你在每个动作下,有这样一个属性struct:
class HitRecord{
   target: CharacterObj; //被命中的角色
   toNextHit:number; //还有多少帧可以再次命中他
}
这是一个在“动作”下的数据,这个数据是当你碰撞发生之后,使用的“动作”会记录这个,如果当前使用的动作中,有一条的target和当前碰撞的角色一致,就忽略此次碰撞。策划在“动作”中设置了一个动作基础的“攻击碰撞间隔帧数”,比如30(假如大于这个动作的总帧数,其实就是值能一刀一次命中了),那么就是第一次碰撞后30帧之内的这个动作的碰撞将被忽略。
为什么有这个问题?因为你一个动作可能有几十帧,其中70%以上的帧都带有攻击碰撞盒,比如100帧的“攻击动作”(这个概念是玩家概念,不是开发者的概念,所以代码中不存在攻击帧或者攻击动作一说),其中有70个帧是带攻击框的,fps60下,也就2秒不到的时间,被命中了第一下的角色,绝对逃不过第二第三下,也就是一次攻击过程,会有几十帧发生,攻击碰撞盒碰上同一个目标的防御动作盒,因此需要这样来规避连续伤害。
动作游戏的AI和难度怎么做?

你可能听说过行为术等等等的玩意儿,其实行为树只是一个数据输入工具,而真当你用行为树去做ai的时候,你会发现,“每一帧世界都在变”这该如何是好?那么游戏的ai(不光是动作游戏)从本质出发是如何制作的?
行为树并非AI?从程序到策划深入谈游戏AI而动作游戏中,除了调整敌人的属性(这些其实都只是增加“强度”而非“难度”,结果是“玩起来更困难”所以被误认为是“难度”而已),加几个动作之外,还有什么可以调整难度的嘛?
除了调数值,动作游戏的怪物难度要如何设计?游戏的buff要怎么做?

其实这个问题本不该在动作游戏的问题下带出来,但是随着游戏的发展,动作游戏带养成元素、带各种战斗“逻辑效果”越来越普遍了。同时,因为本话题下关于buff的回答也比较多,所以我就来简单说说。
buff其实并不是简单的改变角色状态,如果认为buff只是改变角色状态,有一个是一个都是错的。而技能(这里和动作游戏关系不大,因为动作游戏没有“技能”的概念)中,如果带有技能的效果,比如火球术法术,下面有属性是关于火球打多少伤害、怎么飞行的,有一个是一个都是错误的抽象。游戏中的buff是这样的,万变不离其宗——对的做法只能来自这种抽象,否则一定是错的:
如何设计一个易扩展的游戏技能系统?buff的核心是什么?是把原先流程里面写死的if else拿出来,作为一个标志分配给角色,而标志决定了执行什么逻辑。
动作游戏里怎么做buff?

和所有类型的游戏工作方式是一样的,你需要按顺序做这样几个事情:
确定游戏的触发点,比如角色受到伤害的时候,他可能有“攻击者命中时”(onHit)、“挨打者被攻击”(未必是受伤)(beHurt)、“受击者临终前”(用于处理比如免死金牌等效果)(beforeKilled)、“攻击者成功击败目标”(用于处理击败目标时获得额外经验等效果)(onKill)、“受击者被击败后”(用于处理比如被击败后原地会产生一个逐渐扩大的毒云等效果)(beKilled)等等,具体需要什么触发点,这是设计的时候确定的,有了这些触发点,才能有buff。确定每个触发点的接口参数,比如buffOnHit(buffObj, target, damageInfo)等。把这些写到流程里面去。开始制作脚本。
是的,不管什么类型的游戏,设计buff这块都是如此的,角色的很多东西,包括且不限于被动效果都是buff,甚至在游戏中,任务系统也是依赖于buff机制的,当然这是另外一个话题了,完全扯远了,你要是有兴趣,不妨提个问题然后邀请猴叔回答。
总结

当你理解了动作游戏和即时回合制游戏的区别之后,做动作游戏的思路就非常清晰了, 但是要真的做完整一个动作游戏,也非一朝一夕。在知乎绝大多数回答都是“情感类回答”,从情感出发博得认同,也只有猴叔我只谈具体开发,不会关注你们的小心情,爱听不爱听随你们了。

zifa2003293 发表于 2021-8-19 21:05

和引擎关系不大。技术实现可以调研一下lockstep(帧同步),如果有pvp。

DomDomm 发表于 2021-8-19 21:10

@米哈游miHoYo
快来在这个问题下面认真回答问题的大佬拐回家(doge)
页: [1]
查看完整版本: unity怎么去实现act战斗?