xxl

我使用最新版本的 Spine-Unity Runtime, 我的 Unity 版本为最新版的 Unity 2019 lts。

我需要把 Spine 动作和 Unity 的粒子特效结合起来使用。遇到了以下两个问题。

1. 没有一帧合适的动画可以用来发射特效。

我想象中的效果是这样的:
角色做一个挥手的动作,当手摆动到水平方向时,从手中水平发射出去一个特效。

Snipaste_2022-01-25_07-39-23.png


而实际显示的效果是这样的,如图所示,前一帧手还指向高处,后一帧手已经向下挥舞到下方了。并没有一帧合适的画面可以让我正好从手中水平发射特效。无论我在哪一帧从手中发射特效,特效的发射位置要么过高,要么过低。

Snipaste_2022-01-25_07-45-57.png


2. 跟随骨头轨迹的特效,其拖尾是折线。

想象一个挥剑的动画,剑在挥舞时会带有刀光。

我想象的效果是这样的:

Snipaste_2022-01-25_07-55-54.png


而实际的效果是这样的:

Snipaste_2022-01-25_07-59-55.png


我觉得这两个问题,都是由于动画的帧数不够导致的,如果帧数可以增加一些,就会有足够多的补间画面来组成平滑的过度。
我的游戏因为性能问题,游戏的帧率限定为30fps。是否有办法在保持游戏帧率不变的情况下,单独把Spine动画的更新频率设置的更高,比如45fps或者60fps。

或者你们有其他方案可以达成我的需求?
Bu mesaja eklenen dosyaları görüntülemek için gerekli yetkilere sahip değilsiniz.
xxl
  • Mesajlar: 21

Harald

关于问题(1):
平滑的骨骼动画永远无法预测样本帧的确切位置。这是一个理论问题,并非特定于 Spine 或 spin-unity。

如果你需要精确的方向,比如水平向前发射一个粒子,那么你需要调整你的脚本,让它总是向前发射粒子,它不依赖于动画。您仍然可以通过 Spine 事件触发此类事件,但不要让方向依赖于它。

关于问题(2):
您可以通过禁用 SkeletonAnimation 组件来增加更新计数,并在每个显示的帧中更频繁地手动调用 skeletonAnimtion.Update(deltaTime)。然后您需要相应地调整传递的 deltaTime 参数。如果例如你调用 skeletonAnimation.Update(deltaTime) 的频率是三倍,那么每个单独的 deltaTime 将大约是原始 deltaTime 的三分之一。您可以查看示例场景“Spine Examples/Other Examples/FixedTimestepUpdates”,它以类似的方式控制更新,反之亦然,降低播放帧速率而不是增加它。

不过,我们不建议每帧多次调用 skeletonAnimation.Update(deltaTime) 来解决您的问题。您可以改为调整多边形轨迹实现以更平滑地插入轨迹的角点(以共同创建更平滑的网格)。另请注意,如果多边形轨迹不能提供平滑任何角落的方法,它们看起来总是有点锯齿状。作为替代方案,您也可以不使用多边形轨迹,而是使用一个或多个显示完美圆形轨迹的图像,然后将它们淡入并根据动画缩放它们以创建类似的效果。
-----
Regarding problem (1):
Smooth skeletal animation is never predictable in regards of where exactly your sample frames will land. This is a theoretical problem, not specific to Spine or spine-unity.

If you need precise direction, like firing a particle horizontally forward, then you need to adjust your script so that it always fires the particles forward, it shall not depend on the animation. You could still trigger such an event by a Spine event, but not let the direction depend on it.

Regarding problem (2):
You could increase the update count by disabling the SkeletonAnimation component and call skeletonAnimtion.Update(deltaTime) manually more often than once per displayed frame. Then you need to adjust the passed deltaTime parameter accordingly. If e.g. you call skeletonAnimation.Update(deltaTime) three times as often, each individual deltaTime would then be approximately one third of the original deltaTime. You could check out the example scene Spine Examples/Other Examples/FixedTimestepUpdates which controls updates in a similar way, just the other way around, lowering the playback framerate instead of increasing it.

Nevertheless, we would not recommend to call skeletonAnimation.Update(deltaTime) more than once per frame to solve your problem. You could instead either adjust the polygonal trail implementation to more smoothly interpolate the trail's corner points (to create a smoother mesh alltogether). Please also note that polygonal trails always look a bit jagged, if they don't provide a way for smoothing any corners. As an alternative you could also not use a polygonal trail but instead use one or multiple images that show a perfectly round trail and then fade them in and scale them according to the animation to create a similar effect.
Kullanıcı avatarı
Harald

Harri
  • Mesajlar: 3905

xxl

问题1:
水平发射粒子只能解决方向的问题,但高度仍然是不对的。

问题2:
多谢,你的解答非常有用。
xxl
  • Mesajlar: 21

Harald

xxl yazdı:问题1:
水平发射粒子只能解决方向的问题,但高度仍然是不对的。
Question 1:
Emitting particles horizontally only solves the problem of orientation, but the height is still wrong.
然后,除了固定方向外,您还可以使用固定高度。
Then you could also use a fixed height in addition to fixed orientation.
Kullanıcı avatarı
Harald

Harri
  • Mesajlar: 3905

xxl

我明白了,总结来说,如果想要完全掌控播放效果,就不能使用特效附加到Spine骨骼上的方式,而是使用自定义的配置文件,来配置特效播放的时间和位置。
xxl
  • Mesajlar: 21

Harald

基本上是的。 您可以将时间留给 Spine 事件,或者从您的自定义脚本中触发它,它应该没有任何区别。 在您的情况下,只需要固定位置和方向。
Basically yes. You could leave the time to the Spine event, or trigger it from your custom script, it should not make any difference. Only positions and directions need to be fixed in your case.
Kullanıcı avatarı
Harald

Harri
  • Mesajlar: 3905


Dön 中国Spine用户