问题标签 [unity3d-mecanim]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Unity 5.5.0f3 在运行时向后播放动画
Unityforums 上的原始问题在这里
我一直在尝试让动画不仅可以减速和加速,还可以根据用户对我的 Hololens 应用程序的输入进行回放。我使用的是 Mecanim 系统,而不是旧版动画。
整个事情应该在运行时通过动态用户输入发生。
我知道这可以通过脚本来实现,因为我在一些 Unity-Collaborate 问题中丢失本地进度和一些文件之前已经工作了。尽管听起来很愚蠢,但从那时起,我就无法记住我所做的与当前方法不同的地方。
现在我正在处理值 Animator.speed,但这仅适用于值 >= 0。
任何帮助将不胜感激!
编辑:如果链接不起作用或对任何人都不可见,这是我的代码:
Edit2:错误地标记为重复!链接的问题不考虑类似的问题,需要不同的解决方案
Edit3:为澄清起见,链接的“重复”使用与我的问题无关的旧动画系统。在 Unity 5.xx 中的新动画系统 Mecanim 中,您无法直接访问动画,如所选答案所示。如第二个答案所示,也无法改变动画速度。
unity3d - 如何知道 Unity 中动画的结束坐标?
我想知道 Unity 动画结束时根骨骼的坐标。我尝试以编程方式将带有 Animator 控制器的单元放到场景中,播放动画并多次执行 Update()。但坐标与真实坐标略有不同。有没有办法在动画结束时知道准确的坐标?
更新。这段代码应该可以正常工作,但不能正常工作:
animation - Mecanim 动画符合游戏逻辑吗?
在我的自上而下 RPG 中,我有几个敌人,比如地精、巨魔、龙……
他们每个人都有两个变量:
baseAttackDuration = float(攻击需要多长时间,因敌人 而异)
所以当角色攻击时,攻击的持续时间等于: attackDuration = baseAttackDuration / increasedAttackSpeed
问题: 现在,我应该如何设置 Mecanim 播放攻击动画,以使动画符合游戏逻辑并准确地持续攻击持续时间?
unity3d - Unity 3d一次播放2个动画
我从 Unity Asset Store 获得了 Skeleton 模型。该模型有几个动画,包括一个行走动画。我还制作了一个旋转动画。我需要播放行走动画,然后播放转弯的动画,但继续播放动画行走。我正在使用动画师(Mecanim)。如果你做了过渡,那么动画就结束了走。我能想到的唯一方法是使用不同的图层。但据我了解,它们是为其他目的而设计的。请告诉我该怎么做。
c# - Unity 3D 动画.MatchTarget 根运动仅影响位置或仅旋转
背景
在 Unity 3D 引擎版本 2017.3.1f1 中,我正在研究由 mecanim 根运动驱动的 3D 角色。我需要将角色绕 Y 轴(向上)精确旋转 180°,然后它会向左或向右走(这是 2D 游戏)。因为它是机械,所以角度并不总是精确的,角色有时会转动 177°,有时会转动 181°。这是一个不需要的错误,导致角色在行走时沿 Z 轴移动。所以我决定使用内置的 animator.MatchTarget() 函数(https://docs.unity3d.com/ScriptReference/Animator.MatchTarget.html)校正最终角度。
问题
Animator.MatchTarget 没有重载函数只匹配旋转,所以我需要输入旋转动画剪辑的最终位置(旋转动画有根运动和位置变化)。我假设成员变量Animator.TargetPositon完成了这项工作:
但它不涉及根运动,因此角色在开始转弯动画时的确切位置结束。还有另一个变量Animator.RootPosition ( https://docs.unity3d.com/ScriptReference/Animator-rootPosition.html ),但它只保存当前字符位置。
解决方法
我能想到的唯一解决方案是在编辑器模式下读取动画数据,存储根运动偏移量,然后在运行时为每个动画应用。该解决方案过于复杂,我正在寻找一种简单的替代方法来“仅匹配旋转并从动画中的根运动读取目标位置”。
谢谢
c# - 将导航和动画结合在一起
所以我已经实现了这个教程:https ://docs.unity3d.com/Manual/nav-CouplingAnimationAndNavigation.html几乎是信的。几乎意味着我正在使用2d freeform directional
混合类型而不是simple directional
他们正在使用的类型。问题是velx
和vely
(主要是这个)的值是波动的。因此,例如,当vely
上升时,它会在某个时候达到 1,但在此之前它会像这样:
..., 0.5, 0.6, 0.5, 0.7, 0.4, 0.6, 0.8
希望你明白我的意思——趋势在上升,但偶尔会下降。这使我的动画抖动,因为混合树在状态之间跳跃得非常快。经过一段时间的实验,我发现,在我的例子中,使用数字 7 作为计算smooth
变量的表达式中的除数,就像这样:
有点工作。这意味着它只有 70% 的时间抖动,而不是总是抖动。有谁知道实现相同效果的更好方法?
c# - Blender 到 Unity 动画 - 跳帧
我决定尝试将带有动画的 FBX 中的 Blender 模型导出到 Unity。该模型的顶门有两个动画,打开和关闭。事情是这样的——我的模型似乎喜欢在模型开始时跳入两个动画的起源,即。如果我导入模型并且门是打开的,并且我决定触发关闭它,它会正确关闭 - 但是当我尝试打开它时,它决定它需要保持在与关闭门动画相同的原点首先,然后它打开 - 基本上导致门在模型之外移动得太远。
我还特意尝试在 Mecanim 动画器控件中依靠 ONE 动画 - 但是当它朝相反方向移动时,它似乎回到了门的正确位置,但它并没有以相同的速度完成,但这样做不规律。最后,当我尝试让一个门动画过渡到具有相反速度的相同门动画(即门接近关门,一个速度为 1,一个速度为 -1)时,它仍然会不规律地跳跃。
这是我尝试的最后一个 Mecanim 动画师设置:
这是尝试在另一个状态下使用相同动画的方法,但速度为负速度而不是正速度。它不像你期望的那样工作。
我在下面的代码中使用状态触发器在这些状态之间进行转换:
有人可以让我知道是否有更好的方法来解决这个问题以及如何解决?我试过在这方面的几篇文章之间跳转,包括他们网站上关于 Mecanim for Unity 的演示教程 - 没有骰子......
unity3d - 如何使动画剪辑一次运行一个而不是混合在一起
我有look、walk和attack的 2D 动画——每个都有 4 个方向——总共 12 个动画剪辑。动画控制器具有以下参数:
- 面对(整数)
- isMoving(布尔值)
- 攻击(触发)
我希望一次只播放一个剪辑。它适用于外观和行走动画,因为它们基于它们的参数是互斥的。问题在于攻击剪辑,因为它基于触发器。当我进入该状态时,它会与已经播放的外观或行走动画融合在一起。当我进入攻击动画时,我希望当前动画停止并且攻击动画运行完成,然后再次播放观看或行走动画。
最好,我想通过让转换只从Any State
彼此状态(没有州际转换)来做到这一点。我有一堆用于不同角色和设备的动画,而且我将来还会有更多类型的动画,除了外观/步行/攻击,所以我想避免添加一个会带来的复杂性还有几十个过渡。
我曾考虑将isAttacking
参数从触发器更改为布尔值,但这似乎是一个糟糕的选择,因为这样我就必须拥有代码和动画事件来跟踪我的攻击动画并isAttacking
在播放完成时设置为 false,并且这似乎增加了系统的复杂性和膨胀
unity3d - 如何使作为动画剪辑的一部分发生的更改永久化?
我想制作一张卡片从正面翻转到背面的动画。两张牌面都有不同的精灵作为背景。
我的卡上有一个Animator
组件。动画师将卡片绕 z 轴旋转 180 度,并在旋转 90 度时更改背景精灵。一切正常。
问题是一旦动画剪辑完成,精灵就会变回原来的精灵。我尝试在动画剪辑事件函数的末尾添加一个动画事件并让动画剪辑执行GetComponent<SpriteRenderer>().sprite = ...
,但这也不起作用。即使我在 Unity Inspector 中更改了卡片的精灵,这也不起作用(精灵实际上并没有改变)。
这是我的动画师的样子(Idle
动画没有附加剪辑):
这是其中一个动画的样子:
有没有办法让我的动画师改变我的游戏对象的精灵,然后让游戏对象保持新的精灵,直到它再次改变?我知道我可以通过协程以编程方式做到这一点,但如果没有必要,我不想做一个解决方法。