僵尸攻击完善
上次只是简单实现了攻击植物,这次将会完善僵尸攻击时的植物闪烁效果以及僵尸攻击逻辑优化和完善。
闪烁效果
//被攻击时调用变色函数
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);
}