项目实训2022-3-13

僵尸攻击完善

上次只是简单实现了攻击植物,这次将会完善僵尸攻击时的植物闪烁效果以及僵尸攻击逻辑优化和完善。

闪烁效果


//被攻击时调用变色函数
    public void Hurt(float hurtValue)
    {
        hp -= hurtValue;
        StartCoroutine(ColorEF(0.2f,new Color(0.5f,0.5f,0.5f),0.05f,null));
        if(hp <=0)
        {
            //死亡
            Dead();
        }

    }



    //实现变色效果
    protected IEnumerator ColorEF(float wantTime, Color targetColor, float delayTime, UnityAction fun)
    {
        float currTime = 0;
        float lerp;
        while (currTime < wantTime)
        {
            yield return new WaitForSeconds(delayTime);
            lerp = currTime / wantTime;
            currTime += delayTime;
            spriteRenderer.color = Color.Lerp(Color.white, targetColor, lerp);
        }
        spriteRenderer.color = Color.white;
        if (fun != null) fun();

    }

调整代码逻辑,使得僵尸可以在各种状态快速切换

//枚举僵尸状态
public enum ZombieState
{
    Idel,
    Walk,
    Attack,
    Dead

}
    public ZombieState State
    {
        get => state;
        set
        {
            state = value;
            switch (state)
            {
                case ZombieState.Idel:
                    //播放行走动画,但是卡在第一帧
                    animator.Play(walkAnimationStr, 0, 0);
                    animator.speed = 0;
                    break;
                case ZombieState.Walk:
                    animator.Play(walkAnimationStr);
                    animator.speed = 1;
                    break;
                case ZombieState.Attack:
                    animator.Play("Zombie_Attack");
                    animator.speed = 1;
                    break;
                case ZombieState.Dead:
                    break;


            }
        }




 void Update()
    {
        FSM();
    }

    //状态检测
    private void FSM()
    {
        switch (State)
        {
            case ZombieState.Idel:
                State = ZombieState.Walk;
                break;
            case ZombieState.Walk:
                // 一直左走,并且遇到植物会攻击,攻击结束继续走
                Move();
                break;
            case ZombieState.Attack:
                if (isAttackState) break;
                Attack(currGrid.CurrPlantBase);
                break;
        }
    }



//植物死亡时,把当前植物状态设为null,防止空引用异常
    private void Dead()
    {
        curgird.CurrPlantBase = null;
        Destroy(gameObject);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值