如何一次制作一个动画片段 运行 而不是混合在一起
How do I make animation clips run one at a time and not blend together
我有 look、walk 和 attack 的 2D 动画——每个都有4 个方向——总共 12 个动画片段。动画控制器有以下参数:
- 面向(整数)
- isMoving(布尔值)
- isAttacking(触发)
我只想一次播放一个剪辑。它适用于 look 和 walk 动画,因为根据它们的参数,它们是互斥的。问题是 attack 剪辑,因为它基于触发器。当我进入该状态时,它会与正在播放的 look 或 walk 动画混合。当我进入 attack 动画时,我希望当前动画停止并且 attack 动画在 [=22] 之前 运行 完成=]看或走动画再次播放。
最好,我想通过仅从 Any State
到其他状态(无状态间转换)的转换来实现此目的。我有一堆针对不同角色和设备的动画,而且我将来还会有 look/walk/attack 以外的更多类型的动画,所以我想避免添加还有几十个转换。
我考虑过将 isAttacking
参数从触发器更改为布尔值,但这似乎是一个糟糕的选择,因为那样我就必须有代码和动画事件来跟踪我的 attack 动画并在播放完毕后将 isAttacking
设置为 false,这似乎增加了系统的复杂性和膨胀性
编辑 误读了问题。您最好将检查器中的过渡设置中的过渡持续时间设置为 0。
在动画控制器中:select 过渡,转到检查器,单击过渡列表中的“-”符号。您还可以打开设置并更改过渡效果(如果您需要其他动画)。
你必须将所有状态相互连接起来......这就像 66
转换......不是很有趣......因为......现在自发地添加一个转换:D
我的意思是你可以这样做并使用 HasExitTime = true; ExitTime = 1
用于所有离开攻击状态的转换,以便在转换之前等待动画完成 - 并且对于所有其他人有 HasExitTime = false
顺序不要等待,而是直接开始转换。
但我强烈建议您使用一个小脚本并使用 bool
作为 isAttacking
,这会让您的生活轻松很多。
您可以简单地添加一个脚本 (StateMachineBehaviour) 到攻击状态本身(类似于 GameObjects 上的组件),等待动画完成并重置 bool。您可以将所有转换保留在 Any State
上并根据需要配置它们。
在动画器中选择状态时 window 您会注意到每个状态都有一个带有 Add Behaviour
按钮的检查器,与 GameObjects
:
非常相似
在这里创建一个新的行为并简单地做
using UnityEngine;
public class StopAttack : StateMachineBehaviour
{
private float timePassed = 0;
// OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
//
// Unity's comment above sounds a bit confusing ... but
// simply consider this the Update method of StateMachineBehaviours ;)
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
timePassed += Time.deltaTime;
// while timePassed is smaller than the animation clip's length
// do nothing
if (timePassed < stateInfo.length) return;
// reset the bool
animator.SetBool("isAttacking", false);
}
}
现在为了平滑混合,只需将过渡设置为类似
的东西
- 有退出时间 = 真
- 退出时间 = 0.75 (%)
- TransitionDuration = 0.25(秒,如果
FixedDuration
,% 否则)
根据此过渡持续时间等,您可能还希望攻击动画将 isAttacking
重置得更早一点,例如
if (timePassed < stateInfo.length - 0.25 * stateInfo.length) return;
尝试将动画状态添加到 8 个角而不是 4 个。
因此,例如,您当前可能有 4 个角,UpRight、UpLeft、DownLeft 和 DownRight,因此当它选择一个状态时,它会选择其中的 2 个角,但不知道要坚持哪一个。也许尝试将节点添加到缺失的角中,例如上、下、左、右,然后选择一个相关的动画来适应。
我在我的游戏中使用了它,它似乎至少暂时解决了这个问题。
我有 look、walk 和 attack 的 2D 动画——每个都有4 个方向——总共 12 个动画片段。动画控制器有以下参数:
- 面向(整数)
- isMoving(布尔值)
- isAttacking(触发)
我只想一次播放一个剪辑。它适用于 look 和 walk 动画,因为根据它们的参数,它们是互斥的。问题是 attack 剪辑,因为它基于触发器。当我进入该状态时,它会与正在播放的 look 或 walk 动画混合。当我进入 attack 动画时,我希望当前动画停止并且 attack 动画在 [=22] 之前 运行 完成=]看或走动画再次播放。
最好,我想通过仅从 Any State
到其他状态(无状态间转换)的转换来实现此目的。我有一堆针对不同角色和设备的动画,而且我将来还会有 look/walk/attack 以外的更多类型的动画,所以我想避免添加还有几十个转换。
我考虑过将 isAttacking
参数从触发器更改为布尔值,但这似乎是一个糟糕的选择,因为那样我就必须有代码和动画事件来跟踪我的 attack 动画并在播放完毕后将 isAttacking
设置为 false,这似乎增加了系统的复杂性和膨胀性
编辑 误读了问题。您最好将检查器中的过渡设置中的过渡持续时间设置为 0。
在动画控制器中:select 过渡,转到检查器,单击过渡列表中的“-”符号。您还可以打开设置并更改过渡效果(如果您需要其他动画)。
你必须将所有状态相互连接起来......这就像 66
转换......不是很有趣......因为......现在自发地添加一个转换:D
我的意思是你可以这样做并使用 HasExitTime = true; ExitTime = 1
用于所有离开攻击状态的转换,以便在转换之前等待动画完成 - 并且对于所有其他人有 HasExitTime = false
顺序不要等待,而是直接开始转换。
但我强烈建议您使用一个小脚本并使用 bool
作为 isAttacking
,这会让您的生活轻松很多。
您可以简单地添加一个脚本 (StateMachineBehaviour) 到攻击状态本身(类似于 GameObjects 上的组件),等待动画完成并重置 bool。您可以将所有转换保留在 Any State
上并根据需要配置它们。
在动画器中选择状态时 window 您会注意到每个状态都有一个带有 Add Behaviour
按钮的检查器,与 GameObjects
:
在这里创建一个新的行为并简单地做
using UnityEngine;
public class StopAttack : StateMachineBehaviour
{
private float timePassed = 0;
// OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
//
// Unity's comment above sounds a bit confusing ... but
// simply consider this the Update method of StateMachineBehaviours ;)
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
timePassed += Time.deltaTime;
// while timePassed is smaller than the animation clip's length
// do nothing
if (timePassed < stateInfo.length) return;
// reset the bool
animator.SetBool("isAttacking", false);
}
}
现在为了平滑混合,只需将过渡设置为类似
的东西- 有退出时间 = 真
- 退出时间 = 0.75 (%)
- TransitionDuration = 0.25(秒,如果
FixedDuration
,% 否则)
根据此过渡持续时间等,您可能还希望攻击动画将 isAttacking
重置得更早一点,例如
if (timePassed < stateInfo.length - 0.25 * stateInfo.length) return;
尝试将动画状态添加到 8 个角而不是 4 个。 因此,例如,您当前可能有 4 个角,UpRight、UpLeft、DownLeft 和 DownRight,因此当它选择一个状态时,它会选择其中的 2 个角,但不知道要坚持哪一个。也许尝试将节点添加到缺失的角中,例如上、下、左、右,然后选择一个相关的动画来适应。
我在我的游戏中使用了它,它似乎至少暂时解决了这个问题。