@author : 黑袍小道
查看随缘,转载标黑袍。
(
分享原因:
1、都8102 世界体了,不是核心底层技术不用藏着(太多可购买可参考了那啥了),这种是游戏人都知道,而且都是基础。总结而已罢了。
2、实例永远只是实例,也只能只是。关键是反推到底层,和做法(这个才能产生变化,引擎和语言,可以做到NX,也可以做到SX 嘿嘿。
)
前言
在利用Unreal实现XXXX,其实实现方式和对应的设计(都有很多种,关键看缘分?开玩笑,这很多要看个人理解。在这部分只说原理和对应实现,尽量保证逻辑单一,可以配置,编辑器可以跳转到其他部分后面会补上对应的编辑器制作。)
(这个差了一下同步)
(有代表性的拳皇,格斗是一种,什么DNF,鬼泣,猎天使,属于一种,骑马已砍杀是一种,黑魂、战神这些又是一种。奇迹,还有俯视角的许多就有很多了。其实都存在不同和相同的方式,当然杨冰【独立制作人】【但作为单独程序的责任需要把逻辑划分清楚,保证扩展】的那个是最值得学习, https://blog.csdn.net/u012999985/article/details/71056425。)
正文:
(若关心元素实现,可以直接跳到实现部分)
额外说明
因为游戏关于这个,一来都是大佬意见和看法,小道只能总结和实现(游戏都没玩过上百通关的,不敢发表看法)
独立游戏开发界: <https://www.bilibili.com/video/av5199528/> ,结论:反馈。
元素
(查看作者知乎:Meta42 来自 <https://www.zhihu.com/question/20344728> )
我们只要把下面所有要素都处理好了,游戏的战斗就有打击感了么?此颜差矣。《孙子兵法》曾经曰过“备前则后寡,备后则前寡;备左则右寡,备右则左寡;无所不备,则无所不寡”,(扯淡的嘿嘿)
- 攻击动作与受击动作
- 特效
- 伤害数字
- 连击与连击计数
- 顿帧
- 慢动作(应该叫局部慢时间。可以到铁拳,火影这些)
- 镜头震动
- 镜头模糊
- 视角切换
- 音效
(以下小道乱说)
关键是需要的重点,打击感对于游戏,就像金钱对于生活,只是手段,而不是目的。
有满屏伤害数字的(打打咚哒哒哒咚咚咚咚【爆】,嘿嘿)加上连击,顿帧,切特殊镜头的【崩,火】
有一丢都没数值的,用镜头收缩、特效、顿或延时帧来的(啪啪噗---(满)---爆-顿-爆)【鬼,猎】
有物理动作,加上动作缓慢的和硬直切换的。(啪嗒-哦-啪啪啪,哈哈)【骑马】
(关于网络同步走的,其实也不能一概否,黑色沙漠,还有逆水寒(技术真的好,别骂小道)这些也有看到的)
综上就出现:、天朝、欧美,日韩几种方式,再加上理论和实践,结果就是一句缘分。【意会意会】
实现元素前的说明
(原文: <http://gad.qq.com/article/detail/26109>,作者:波杰克Po,转载自奶牛关游戏社区)
首先是基础点(抛开这些东西后,打击感就消失了):
操作的映射(准确性和符合预期性) |
(电脑里的人物是玩家的肢体延伸,玩家的操作要即时有效),就好像你开车,像左打了方向,车就即时的向左拐。方向打多少就拐多大的角度。准确和符合预期才能正常的操作。如果往左打了一点点,汽车直接原地转了3圈,或者随机拐一个角度,你就完全不可控了。 |
前摇动作 |
(攻击蓄力),没有这部分,动作会显得软绵无力。 |
攻击动作命中目标 |
(无论是动作还是特效,都得让玩家意识到打中了目标),没有这部分会显得不真实。 |
受击动作表现 |
(只要受击瞬间的动作合理,打击感就能出来),没有这部分同样会显得不真实。 |
攻击受击同步 |
(主要是命中点和受击点的同步),没有这部分会显得不真实。 |
【以上4点如果没做到,最大的影响是不真实,就像一个瘦弱的人轻轻的摸了一下汽车,汽车等了2秒后被击飞了老远的那种感觉。因此要实现打击感的第一点,是要成功的骗过玩家的大脑,让他感受到真实感。像一个魔术师一般,上面的四点是绝不能让玩家看出破绽的。】
其次是进阶点(加进来可以让打击感更好):
命中标识的明显化 |
(受击动作是一个基础的命中标识,但识别度还不够高。)因此还需要夸张的受击特效、身体的反白效果、受击的伤害数字的冒出效果、受击后抖动的效果、被击退、被击飞、被击倒。 |
环境效果 |
(强调一个攻击力度的强弱,除了受击方的表现,另外就是对周遭环境的影响),简单有效的包含:震屏(震动频率与动作匹配)、尘土特效(高速移动一定会带来尘土飞扬的效果) |
击杀表现 |
(杀死目标代表了玩家完成了某个战斗事件,这时候应该给予玩家奖励信息),因此怪物的死亡特效、死亡动作要表现的足够华丽。一定要大,要有爆点。 |
攻击特效 |
(理论上可有可无,但有可以放大效果的表现)可以运用空间扭曲、身体模糊等效果来提升特效的档次。切忌不要喧宾夺主,主体是动作和受击特效,攻击特效一定要让步。 |
音效 |
(实际音效的只能放大已有的打击感,如果本身没有打击感,音效并无大作用)就算完全没音效,依旧可以表现出良好的打击感。特别注意的是,有的情况下一定要和动作切合,和武器材质贴合。 |
第三是高阶点(真正动作游戏向的内容,顿帧、硬直、打断、动作的多样性、镜头、全屏动画表现)
顿帧: |
攻击方命中目标后,攻击方动作、特效,受击方动作、特效,短暂暂停的表现效果。真正动作向的游戏不可跳过的一部分。注意受击方的顿帧表现并非必须的,而是因为顿帧时无法进行其它操作,因此受击顿帧可以用来延长受击硬直的时间。 |
硬直: |
分为攻击硬直和受击硬直。攻击硬直里又分为前摇和后摇。硬直时间是指进入某一状态后,玩家不可操作打断的时间。(如一个攻击动作共4秒,前摇2秒后摇2秒,命中是瞬间的事情。后摇1秒后允许移动OR技能打断。这时候攻击硬直时间为3秒,若玩家主动移动OR技能打断,则时间短;若玩家不操作,任由技能表现放完,则需要4秒。) |
打断: |
在目标攻击前摇结束前,即伤害产生前攻击目标,使目标进入受击状态。(同样是上面的例子,假设A攻击前摇2秒,B攻击前摇1秒,B看到A施放攻击,并按下技能攻击B,这时候的时间若在1秒前,则B命中A,打断成功,A进入受击。若在1秒后,则A命中B,打断失败,B进入受击。) |
动作多样性。 |
这部分决定了战斗的华丽性。单一的武器单一的攻击方式,会让战斗变得单调。动作多样性足够多,就可以打出各种各样的连招组合。(也是为什么格斗游戏单一键位对应单一动作,组合键位对应复杂动作,更多的组合键对应各种大招。如果每个按键对应一个大招就没什么多样性可言了。) |
镜头。 |
根据技能,主要是大招的施放节奏,镜头的转化和缩放能更好的突显出大招的威力。聚集能量的时候缩,施放伤害的时候放。(小道解释这就是为啥,技能要有个技能Sys对吧) |
全屏动画表现。 |
类似火影究极风暴。施放忍术大招的时候,会用一个全屏动画来代替(动画本身设计的决定了好坏)攻击前摇的部分,动画结束时播放命中目标的特效。想到与一个超级蓄力动作,蓄力那么久,威力必然大。 |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
不知理则久崩,我们不能一直都是对着源码CC+CV,对着复制到用时时间翻倍或没头绪(这取舍,得心里明白)。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
实现:
(因为是篇是打击,所以只说打击相关。连招缓存,和连招的程序切换【其实就是个动态修改了Next索引罢了】等都不在这里说明)
基于Unreal,Unity,Cocos 【这里就Unreal,蓝图方便说明而已】【稍后找找之前的 给上来,完全个人不怕那啥,嘿嘿】
(原因:
第一步:
目的:要到数据
1、AnimationNotify(动画通知):当动画局部时间经过通知的时刻,或进入通知的时间区域时候触发通知。
(通知逻辑,其实大部分是可以转到C++,为何要转,具体看优化部分说明)
(这里插入一点注意:如果进入通知时刻全局timescale=0或者动画的timescale=0,然后再开启,会如何?答案:会触发两次,为何?你懂的)
(关于通知的使用其实大可以发掘和扩展:但注意一点,逻辑耦合)
(这里有一个分享也可以看看:作者张瀚荣来自 <https://blog.csdn.net/OnafioO/article/details/78051971> ,当然是否盒子类碰撞检测和射线看具体)
2、HitCheck(伤害区域判定):
这里解决伤害区域判定:
攻击方:
2.1、利用挂在人物上的Box,加上通知区域(实现Transform相对数据变化)
2.2、碰撞发生时是攻击方否为有效时间段:
(都只是标志缓存,可以放到角色上,也可以放到动画蓝图上。但肯定有个统一的接口:因为实现会变化,和加入外部条件)
受击方:
2.3、最基础的做一个打开伤害,为何?(真实或者夸张下,伤害没有瞬间多次,当然这里也可以不用通知直接处理。
上述最后,我们可以做到数据变化上,然后根据需要做外部接口(这样还有机会继续优化和扩展).懒,就直接访问
第二步:
目的:得到数据,做对应的处理而已(这里可以做到对象上,也可以是对象的某一组件上
【分出到自定义的上做也可以,觉得放到自定义上,然后在组合的OB上,做个表对象映射是挺好的选择。便于扩展和配置】
第三步:
就是元素的单个实现:
A |
攻击受击同步 |
这里就是检测而已,取到对应点或者面。命中
B |
命中标识的明显化 |
1、特效:在对应位置和面上播放
2、反白:人物Hit组件(自定义一个,或者就Role做),但注意下因为反白会多次,会消失,
所以最好单独就是个效果Obj,这样处理消失和效果时间叠加减少,和判断其他都容易和清除,也不影响其他)。
大部分是人物Mesh,做动态材质属性变化( createDynamicMateria,使用前判断有无,没有创建,有则修改)
进入(入和出成对)
恢复
3、计算需要的数据,力,类型等效果值
4、进入到伤害动画
5、顿帧、硬值、打断
做之前吧顿帧时间,硬直时间,打断时间都计算好。根据配置做顿帧、硬值、打断开关处理
顿帧:
(攻击方命中目标后,攻击方动作、特效,受击方动作、特效,短暂暂停的表现效果)
硬直:
(硬直时间是指进入某一状态后,玩家不可操作打断的时间。)
力表现:(只是测试,就直接Tween. 若是开物理可以物理, (懒就TW和给力),最恰当得自己封装一个Item模拟)
镜头:
UE有几种做动画的方式。
1、
CameraShake对象,其中包含了Anim:
1、用RotOscillation,LocOscillation,FOVscillation实现
2、用Anim实现
3、打开CameraShake,蓝图做
EventReceivePlayShake D Scale0 〈>EventReceiveStopShake D Immediately" v:shapes="图片_x0020_20">
(以上都可转C++,这里懒就表下)
全局时间和局部时间
以上为大体的使用实现,这里只是击中后时刻做的实现。动画多样性,前后摇动作(后面补上挺杂的,得找找嘿嘿)
备注
CSDN:https://blog.csdn.net/u012999985/article/details/71056425
知乎: https://www.zhihu.com/question/20344728
GAD:http://gad.qq.com/article/detail/26109、 <https://blog.csdn.net/OnafioO/article/details/78051971>