如何在满足特定要求后播放特定动画?

问题描述 投票:0回答:1

我知道如何基本上做到这一点,但我正在制作具有多重攻击的剑。我知道如何进行过渡并进行布局,但我不确定出了什么问题。

这是代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SwAnim : MonoBehaviour
{
    bool swing;
    public Animator anim;
    bool sprint;
    bool air;

    // Start is called before the first frame update
    void Start()
    {
        swing = false;
        sprint = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButton("Fire3") && !swing)
        {
            sprint = true;
            anim.SetBool("Sprinting", true);
            anim.SetBool("Swinging", false);


        }

        if (!Input.GetButton("Fire3"))
        {
            sprint = false;
            anim.SetBool("Sprinting", false);
            //anim.SetBool("Swinging", false);

        }

        if (Input.GetButton("Fire1") && !swing && !air)
        {
            anim.SetBool("Sprinting", false);
            Swing();
        }

        if (Input.GetButton("Fire1") && air)
        {
           // anim.SetBool("Sprinting", false);
           //Swing();
        }

    }    

        void Swing()
        {
            // anim.Play();
            swing = true;
            StartCoroutine(Cool());
            StartCoroutine(CoolTwo());
            // StartCoroutine(Trail());
        }

       

        IEnumerator Cool()
        {
            anim.SetBool("Swinging", true);
            yield return new WaitForSeconds(0.2f);
            anim.SetBool("Swinging", false);
           
        }

        IEnumerator CoolTwo()
        {
            //canSwing = false;
            yield return new WaitForSeconds(0.5f);
            swing = false;

        }

        public void Grounded(bool isGr)
        {
            if (!isGr)
            {
                anim.SetBool("In Air", true);
                air = true;
                Debug.Log("jump");
            }

            if (isGr)
            {
                anim.SetBool("In Air", false);
                air = false;
                Debug.Log("nope");
            }
        }
    
}

问题是在空中按下 Fire1 时。 它不会让玩家摆动,这很好,但是一旦我输入另一个功能,它就不起作用了。

这是我试过的。

if (Input.GetButton("Fire1") && air )
        {
            anim.SetBool("Sprinting", false);
           AirSwing();

        }

    }    

        void Swing()
        {
            // anim.Play();
            swing = true;
            StartCoroutine(Cool());
            StartCoroutine(CoolTwo());
            // StartCoroutine(Trail());
        }

        void AirSwing()
        {
            StartCoroutine(CoolAir());

        }


    IEnumerator Cool()
        {
        anim.SetBool("Swinging", true);
        yield return new WaitForSeconds(0.2f);
        anim.SetBool("Swinging", false);

    } 

    IEnumerator CoolAir()
    {
        anim.SetBool("Swinging", true);
        anim.SetBool("In Air", true);

        yield return new WaitForSeconds(0.5f);
        anim.SetBool("Swinging", false);
        anim.SetBool("In Air", false);


    }

如果有人能帮忙,那就太好了! 我对 Unity 和 C# 还是有点陌生。

c# unity3d animation
1个回答
0
投票

好吧,你已经踏上了编程的光滑道路,突然将自己置于顺序条件执行陷阱中:D 没关系,兄弟,我们都经历过。所以,我会尽快解释,希望你能弄清楚剩下的部分。首先,您的

Hero
有一个状态:行走、站立、接地、飞行、摆动等。这里有两个问题:它很复杂并且在
Update()
上下文之外基本上不存在。所以首先我们介绍
state
并立即拆分它:

enum GroundState
{
    Grounded,
    JumpingUp,
    Levitating,
    FallingDown
}
enum AttackState
{
    Idle,
    Swinging,
    Blocking
}

这些状态将帮助您构建游戏逻辑,然后再控制动画。您可以构建您喜欢的任何逻辑,添加更多状态,通过进入另一个状态来阻止一个状态,只需为每个行为至少提供它自己的方法(一个类更好,但是嘿,你很快就会明白为什么),所以你会至少阅读你自己的代码感觉更好 :)

© www.soinside.com 2019 - 2024. All rights reserved.