利用Animation改变动画状态效果

一般情况我们都用的是动画状态机(Animator)来实现动画相互转化的效果
比较少用Animation 现在这篇博客将介绍一下这种方法

这篇博客的和之前第一人称控制器的那篇博客的项目是同一个 可以参照前边
之前那篇是控制行走 旋转 发射 检测击中等 这篇将加上动画 更加完整一点

1.准备工作

首先我们整一个枚举,为了更改的时候方便

public enum GunState
{
    Idle,//站立状态
    Shoot,//射击状态
    Bolt//装弹状态
}
public GunState state = GunState.Idle;//默认赋值为站立状态

然后我介绍一下Animation.CrossFade(“动画名称”);
这个方法是播放动画的语句 很好理解
我们专门写一个方法

private void PlayAnim(string name)//播放动画
    {
        anim.CrossFade(name);
    }
``
这样给它传参数即可 比较方便
然后我们再整一个更新状态的方法

```csharp
private void UpdateGunState()
    {
        //更新枪的状态
        switch (state)
        {
            case GunState.Idle:
                PlayAnim("Idle");
                break;
            case GunState.Shoot:
                PlayAnim("Shoot");
                break;
            case GunState.Bolt:
                PlayAnim("Bolt");
                break;
        }
    }

一个简单的switch语句里边更新状态

2.处理装弹和射击动画的逻辑

由于开枪的逻辑是开始是站立状态 然后鼠标左键按下 播放射击动画 然后播放装弹动画
于是我们用协程来实现

private IEnumerator ShootReturnIdle()//射击转装弹转站立
    {
        yield return new WaitForSeconds(0.7f);
        AuidoManager.Instance.PlaySound("装弹");
        state = GunState.Bolt;
        yield return new WaitForSeconds(0.9f);
        state = GunState.Idle;
    }//射击之后动画变化(步枪)

然后按R键是装弹效果

 private IEnumerator IdleReturnBole()//站立转装弹转站立
    {
        state = GunState.Bolt;
        yield return new WaitForSeconds(0.4f);
        state = GunState.Idle;
    }

yield return new WaitForSeconds(时间间隔); 表示延迟调用之后的语句 延迟时间为中间的时间间隔
其中的 AuidoManager.Instance.PlaySound(“装弹”);是用之前博客的一种播放音效的方法 如果有兴趣可以去查看

3.完整代码

public enum GunState
{
    Idle,
    Shoot,
    Bolt
}

public class GunStart : MonoBehaviour {

    #region
    private Animation anim;
    private float AttackTimer = 2;

    public GunState state = GunState.Idle;
    #endregion
    private void Start()
    {
        anim = GetComponent<Animation>();
    }
    private void Update()
    {
        UpdateGunState();
    
        if (AttackTimer >= 2)
        {
            ShootS();
        }
        else
        {
            AttackTimer += Time.deltaTime;
        }
    }
    private void ShootS()
    {
        if(Input.GetMouseButtonDown(0))
        {
            AttackTimer =0;
            state = GunState.Shoot;
            StartCoroutine(ShootReturnIdle());
        }
        if(Input.GetKeyDown (KeyCode .R))
        {
            AttackTimer = 0;
            StartCoroutine(IdleReturnBole());
            AuidoManager.Instance.PlaySound("装弹");
        }
    }

    private void UpdateGunState()
    {
        //更新枪的状态
        switch (state)
        {
            case GunState.Idle:
                PlayAnim("Idle");
                break;
            case GunState.Shoot:
                PlayAnim("Shoot");
                break;
            case GunState.Bolt:
                PlayAnim("Bolt");
                break;
        }

    }
    private void PlayAnim(string name)//播放动画
    {
        anim.CrossFade(name);
    }
    private IEnumerator ShootReturnIdle()
    {
        yield return new WaitForSeconds(0.7f);
        AuidoManager.Instance.PlaySound("装弹");
        state = GunState.Bolt;
        yield return new WaitForSeconds(0.9f);
        state = GunState.Idle;
    }//射击之后动画变化(步枪)
    private IEnumerator IdleReturnBole()
    {
        state = GunState.Bolt;
        yield return new WaitForSeconds(0.4f);
        state = GunState.Idle;
    }

}

这个脚本挂在带有动画的枪上边 然后配合之前的第一人称脚本会有不错的效果

然后 本人qq 1149293885 特别喜欢交朋友

发布了52 篇原创文章 · 获赞 47 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/103436041