如何使动画在每个按键上统一重复(Unity3d,C#)
How to make animation repeat on every keypress in unity (Unity3d, C#)
我是 C# 和 Unity 的新手,我想弄清楚如何在我按下某个键时为统一播放的对象制作动画,但我只能让动画播放一次,然后它是坏了,不工作。 (我正在尝试制作一款 FPS 游戏)
我现在的代码如下所示:
void Start()
{
gameObject.GetComponent<Animator>().enabled = false;
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Shoot();
gameObject.GetComponent<Animator>().enabled = true;
}
}
当我按下 运行 并左键单击时,动画会触发并按预期运行,但当我再次尝试时,动画不起作用。谁能帮我更改此代码,以便每次按下按钮时动画都能正常播放?
我假设你的动画是非循环的,就好像它在循环一样,当它结束时它已经回放了。
我对您的代码的一个简短说明是不要在 Update 函数中使用 GetComponent,因为它非常昂贵。重置动画状态的一种简单方法是启用和禁用它,但是我假设您想要的动画比射击更多。您可能想要查看所谓的动画树或 Blend Tree 并将状态添加到您的动画中。状态示例包括空闲、行走、运行、射击、蹲伏等。我会考虑研究动画树和混合树以获得完整的动画循环。
一旦你让状态机工作,我会让输入进入空闲状态,然后设置一个转换 Bool 或直接在代码中切换动画。
// when you serialize a private field, it will appear in
// the inspector so you can drag in the reference in the editor
[SerializeField] private Animator anim = null;
private void Start()
{
anim.enabled = false;
}
private void Update
{
if(Input.GetButtonDown("Fire1")
{
Shoot();
if(!anim.enabled)
anim.enabled;
else
anim.Play("AnimationStateName", -1, 0f);
}
}
我没有测试代码,但我相信这适用于您的设置。我仍然强烈建议不要这样做并研究 Trees。实现树后,不用启用调用,只需使用 anim.Play("AnimationStateName", -1, 0f) 行,或者如果设置状态,则可以执行 anim.SetBool(isAttacking, true)从 Idle/Run/Walk/etc 过渡。当 isAttacking 布尔值设置为真时进行攻击。
我找到了 video 可能对您有所帮助。我不想 post 对动画状态和混合树的完整解释,只是为您指明正确的方向以找到更好的方法。
我是 C# 和 Unity 的新手,我想弄清楚如何在我按下某个键时为统一播放的对象制作动画,但我只能让动画播放一次,然后它是坏了,不工作。 (我正在尝试制作一款 FPS 游戏)
我现在的代码如下所示:
void Start()
{
gameObject.GetComponent<Animator>().enabled = false;
}
// Update is called once per frame
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Shoot();
gameObject.GetComponent<Animator>().enabled = true;
}
}
当我按下 运行 并左键单击时,动画会触发并按预期运行,但当我再次尝试时,动画不起作用。谁能帮我更改此代码,以便每次按下按钮时动画都能正常播放?
我假设你的动画是非循环的,就好像它在循环一样,当它结束时它已经回放了。
我对您的代码的一个简短说明是不要在 Update 函数中使用 GetComponent,因为它非常昂贵。重置动画状态的一种简单方法是启用和禁用它,但是我假设您想要的动画比射击更多。您可能想要查看所谓的动画树或 Blend Tree 并将状态添加到您的动画中。状态示例包括空闲、行走、运行、射击、蹲伏等。我会考虑研究动画树和混合树以获得完整的动画循环。
一旦你让状态机工作,我会让输入进入空闲状态,然后设置一个转换 Bool 或直接在代码中切换动画。
// when you serialize a private field, it will appear in
// the inspector so you can drag in the reference in the editor
[SerializeField] private Animator anim = null;
private void Start()
{
anim.enabled = false;
}
private void Update
{
if(Input.GetButtonDown("Fire1")
{
Shoot();
if(!anim.enabled)
anim.enabled;
else
anim.Play("AnimationStateName", -1, 0f);
}
}
我没有测试代码,但我相信这适用于您的设置。我仍然强烈建议不要这样做并研究 Trees。实现树后,不用启用调用,只需使用 anim.Play("AnimationStateName", -1, 0f) 行,或者如果设置状态,则可以执行 anim.SetBool(isAttacking, true)从 Idle/Run/Walk/etc 过渡。当 isAttacking 布尔值设置为真时进行攻击。
我找到了 video 可能对您有所帮助。我不想 post 对动画状态和混合树的完整解释,只是为您指明正确的方向以找到更好的方法。