本次介绍豌豆射手功能的实现,由于后续会需要很多的植物,所以将植物基本的方法定义到植物基类中进行实现。豌豆射手的脚本中只编写他独特的功能代码。豌豆射手功能为射出子弹对僵尸造成攻击。
豌豆射手与向日葵相同的初始化功能都在基类中实现不进行过多介绍,主要是初始化分为两种,一种为鼠标点击的初始化,一种为种植后的初始化,另外还有植物初始生命、所需阳光等基本属性的设置。
他所独特的功能为攻击僵尸,同时也涉及到对子弹的管理,首先主要介绍攻击方法的实现,豌豆射手只能攻击距离其最近的第一个僵尸,并且当且仅当僵尸位于植物右方并且在草坪上时。代码实现如下。
private void Attack()
{
if (canAttack == false) return;
// 从僵尸管理器 获取一个离我最近的僵尸
ZombieBase zombie = ZombieManager.Instance.GetZombieByLineMinDistance((int)currGrid.Point.y, transform.position);
// 没有僵尸 跳出
if (zombie == null) return;
// 僵尸必须在草坪上 否则跳出
if (zombie.CurrGrid.Point.x == 8 && Vector2.Distance(zombie.transform.position, zombie.CurrGrid.Position) > 1.5f) return;
// 如果僵尸不左边跳出
if (zombie.transform.position.x < transform.position.x) return;
// 在枪口实例化一个子弹
Bullet bullet = PoolManager.Instance.GetObj(GameManager.Instance.GameConf.Bullet1).GetComponent<Bullet>();
//bullet.transform.SetParent(transform);
bullet.Init(attackValue, transform.position + creatBulletOffsetPos);
CDEnter();
canAttack = false;
}
当满足攻击条件时可以进行实例化子弹,并且每次攻击之间需要设定冷却时间。首先子弹发射后应该在空中以一定速度旋转前进,当与僵尸发生碰撞后进行图片的转换并进行图片销毁,并且僵尸生命值发生变化。
public void Init(int attackValue,Vector2 pos)
{
transform.position = pos;
rigidbody = GetComponent<Rigidbody2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
rigidbody.AddForce(Vector2.right*300);
this.attackValue = attackValue;
rigidbody.gravityScale = 0;
isHit = false;
// 修改成正常状态的图片
spriteRenderer.sprite = GameManager.Instance.GameConf.Bullet1Nor;
}
private void OnTriggerEnter2D(Collider2D coll)
{
if (coll.GetComponentInParent<ZombieBase>() == null) return;
if (isHit) return;
if (coll.tag == "Zombie")
{
isHit = true;
// 让僵尸受伤
coll.GetComponentInParent<ZombieBase>().Hurt(attackValue);
// 修改成击中图片
spriteRenderer.sprite = GameManager.Instance.GameConf.Bullet1Hit;
// 暂停自身的运动
rigidbody.velocity = Vector2.zero;
// 下落
rigidbody.gravityScale = 1;
// 销毁自身
Invoke("Destroy", 0.5f);
}
}
其中僵尸被攻击时如果没有死亡生命值下降并且展现出变色效果表示受到攻击。
public void Hurt(int attackValue)
{
hurtNum += 1;
Hp -= attackValue;
if (State!=ZombieState.Dead)
{
if(spriteRenderer.color != new Color(0.16f, 0.17f, 0.74f)) //如果没有减速 则变色
StartCoroutine(ColorEF(0.2f, new Color(0.4f, 0.4f, 0.4f), 0.05f, null));
//StartCoroutine(SlowColor( new Color(0.4f, 0.4f, 0.4f), 2f, null));
}
}