【问题标题】:Trouble with freezing rotation on a certain animation in Unity在 Unity 中冻结某个动画的旋转问题
【发布时间】:2019-04-11 15:53:29
【问题描述】:

我一直在为 Unity 中的战斗导向游戏制作一些敌人动画,并且正在寻找一种方法来在他进入特定状态时冻结他的旋转和动作。

敌人在他的 Animator 中有一个布尔变量,称为 isAttacking。 isAttacking 由代码开启,让他挥动斧头。

问题是,如果玩家靠近,我编写的 AI(在教程的大力帮助下)会使他旋转。我不希望他在攻击动画期间旋转。

            this.transform.rotation = 
Quaternion.Slerp(this.transform.rotation,
                                      Quaternion.LookRotation(direction), 
0.1f);

这是让他旋转的一段代码。如果玩家在他的 10 个单位内,则激活此代码。

我尝试了一些像这样的大杂烩方法:

if (Anim.GetBool("isAttacking") == true) {
            this.transform.rotation = 
Quaternion.Slerp(this.transform.rotation,
                                      Quaternion.LookRotation(direction), 
0.1f);
}

我还尝试将刚体设置为暂时禁用旋转

if (Anim.GetBool("isAttacking") == true) {
Rigid.freezeRotation = true;
}
else {
Rigid.freezeRotation = false;
}

这两种方法都不适合我。

我没有要求冻结他的议案。

这是运行 AI 的代码

private void Update()
{

    if (Vector3.Distance(player.position, this.transform.position) < 10)
    {
        Vector3 direction = player.position - this.transform.position;
        direction.y = 0;

        this.transform.rotation = Quaternion.Slerp(this.transform.rotation,
                                  Quaternion.LookRotation(direction), 0.1f);

        Anim.SetBool("isIdle", false);
        if (direction.magnitude > 1)
        {
                this.transform.Translate(0, 0, 0.07f);
                Anim.SetBool("isWalking", true);
                Anim.SetBool("isAttacking", false);                
        }

        else
        {
            Anim.SetBool("isAttacking", true);
            Anim.SetBool("isWalking", false);
        }
    }

    else
    {
        Anim.SetBool("isIdle", true);
        Anim.SetBool("isWalking", false);
        Anim.SetBool("isAttacking", false);
    }

}

如何防止他在攻击状态下的旋转和移动?

【问题讨论】:

  • 为什么不制作动画来处理旋转而不是硬编码旋转?

标签: c# unity3d


【解决方案1】:

做这样的事情最简单的方法可能是使用协程:

IEnumerator StopMovement(float duration){
    this.enabled = false;
    yield return new WaitForSeconds(duration);
    this.enabled = true;
}

StopMovement 只是禁用Update void 几秒钟,然后再次启用它。每当你攻击时调用它:

StartCoroutine(StopMovement(1.5f)); //disable Update for 1.5 seconds

【讨论】:

  • 谢谢!我回家的时候试试这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 2020-08-01
  • 1970-01-01
相关资源
最近更新 更多