将游戏动作同步到特定动画时间的好的技术?


10

因此,我在开发的游戏中遇到了一个问题,但这似乎是很多游戏中都涉及的非常基本的问题。

我的游戏要求在角色动画期间的某个特定时间点发生某些游戏功能。因此,正如标题所说,我想知道有什么好的技术和基本策略可以将与游戏相关的事件/功能/动作同步到角色动画中的特定点。

以下是我在各种类型的游戏中谈论的一些简单示例:

  • 您的角色将他们的枪重新装在射手中。您的角色将播放他/她的“重新加载”动画,但重要的是,仅在更换弹匣并握住枪支后的确切时刻调用设置currentAmmo变量的函数这可能是重新加载动画中间的某个时刻。

  • 在基于回合的RPG中,您的角色站在面对一排敌人的队伍中。当被命令进攻时,您的角色之一会奔跑/跳跃到敌人中的一个,并挥舞其巨剑,然后再奔跑/跳跃回到其站立位置。您想确保播放大幅削减动画的确切时刻损坏敌人 -在向上跑和向后跑之间的某个时间点。

  • 隐形游戏中,您的角色可以潜行并与世界上的计算机和按钮互动。也许有一个按钮可以关闭您正在渗透的哨所的电源。当按下动作按钮时,您的角色伸出手并按下按钮,然后返回其闲置状态。您希望在按下按钮时在“ push_button”动画中的确切位置关闭灯。

诚然,我的情况最类似于第二个示例,在该示例中,我创建了一个动画,其中基于回合的角色在攻击过程中前冲,并且我希望在动画似乎与之接触的那一刻施加损害。因为我的游戏使用回合制(想像“最终幻想”或“火焰纹章”之类的东西),所以我需要伤害/治疗/魔法/等。即使我实际上没有使用碰撞/命中框,也可以在每个角色动画的正确时间应用它。

我应该提到的是,我正在使用流行的游戏引擎来制作游戏,而现在我正在通过使用他们的动画事件来处理该事件,或者通过通知来实现接近预期结果的效果-我的角色执行了某个命令并触发了特定于命令的动画(即:“ attack_command”)和我的每个命令的动画资产必须在我的角色ExecuteCommand函数中包括一个动画事件/通知“回调”。换句话说,角色告诉攻击动画播放,然后攻击动画会在动画发生的确切时间向角色发出事件/通知回调,该事件应在造成伤害时进行。

坦白地说,这暂时有效,但是感觉有点不对劲 -就像我在这里遗漏了一部分大图!这种方法感到不对的部分原因是,它将游戏逻辑与动画资产结合在一起。如果我的动画素材资源忘记包括ExecuteCommand()事件/回调,则该命令将无法正确执行,并且需要额外的代码来检查命令动画是否在不执行命令的情况下完成。这太乱了,这意味着我的游戏对其资产有奇怪的依赖性。当然,我希望在攻击动画期间的特定时间点造成损害,但是我对在动画资源中调用游戏代码感到很奇怪。

那我在这里俯瞰什么?有什么好的通用技术可以处理这些类型的情况,您希望在动画中的特定时间发生某些重要的游戏操作?

编辑:澄清一下,这不是引擎特定的问题,我也不是在寻找引擎特定的设计/技术。我对一种通用的动画/游戏同步技术很感兴趣,而无论使用哪种技术,这些技术都可能会在您的游戏项目中使用。


1
我糊涂了。您说您希望游戏玩法取决于动画时间,但是然后您又说您不希望游戏玩法取决于您的资产,动画是一种资产。您如何期望这些愿望兼容?
Anko 2015年

我希望某些游戏元素与动画同步。但是,两件事之间的同步并不总是意味着依赖,对吗?我对人们用来使动画与游戏玩法同步的某些技术感兴趣。我说了我已经尝试过的方法以及目前正在为实现该目的而做的事情-所以我的问题是,是否可以使用一种/更好/另一种方法(动画事件/通知/回调已烘焙到资产)的标准方式?这是您在项目中使用的吗?
MrKatSwordfish

Answers:


5

为了进行同步,您需要确定谁(您的代码,动画或两者都不是)是定时授权 -其他所有人“跳舞”的“拍子”。

不同的安排适合不同的游戏:

  • 动画是定时授权(您当前的设置)

    游戏代码可能会触发动画。当动画达到特定点时,它们会引发游戏代码可能会做出反应的事件(例如重新加载完成)(例如重置可用的弹药)。

    如果动画的精确定时(与游戏状态无关)是游戏的重要部分,或者您特别希望动画师控制定时,请考虑使用这种方法。

    动画工具Blender(3D)和Spine(2D)允许动画师定义游戏代码可以订阅的事件。

  • 代码是时间授权

    与上述情况相反:游戏世界中发生的事件(例如,玩家选择重装武器)使动画得以运行并传递了参数(例如,直到重装完成的时间)。每个动画使用提供的参数来修改其外观(例如,以适当的速度运行动画,以便在指定时发生“重新加载的部分”)。

    动画也可能正在监听游戏事件(例如,玩家取消重载或在重载时蹲伏)并相应地修改其外观。

    如果您的动画可以灵活地安排时间,您的游戏严重依赖程序生成的内容,或者您​​特别希望程序员控制时间,请考虑使用这种方法。

    Overgrowth的角色动画基本上是这样构成的: David Rosen在GDC 14演讲中对此进行了解释(具体参见“ Movement”和“ Mobility Continued”部分)。

  • 隐式定时(外部权限)

    在节奏游戏或其他由外部来源控制时间的情况下(在节奏游戏中,指音乐曲目的节拍),对此类事物进行建模可能是有意义的。游戏代码和动画都可以读取全局时间戳和游戏状态,然后在不进行通信的情况下进行相应的操作。

    如果您的游戏状态和动画在很大程度上取决于外部定时授权,请考虑使用此方法。

当然,您可能想对游戏中的不同系统使用不同的方法。(例如,节奏游戏经常将歌曲的节奏用作外部授权,但是动画仍然会听取玩家的交互事件以取消或更改所保存音符的外观。)


0

我读过某个地方的文章,几乎所有的计算问题都可以通过附加的抽象层来解决,但我认为您的情况并不相同。

对于此要求,我通常会看到一个控制字符状态的层。这样,角色将具有当前动画和当前状态。每个人都有自己的责任。

动画仅负责视觉效果,状态负责处理该动作的游戏特定逻辑。

在我的格斗游戏中,状态是一个继承自BaseState类并具有Update()方法的对象。每个字符都有一个状态集合,但是一次只能分配一个。当前状态的Update()方法每帧调用一次。

它在状态的Update()里面,在这里我执行所有逻辑:在特定帧上设置字符的速度,增加/减少运行状况等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.