添加僵尸管理器,获取僵尸
在Zombie类添加代码
void Start()
{
GetGirdByVerticalNum(0);
animator = GetComponentInChildren<Animator>();
ZombieManager.Instance.AddZombie(this);
}
ZombieManager类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ZombieManager : MonoBehaviour
{
public static ZombieManager Instance;
private List<Zombie> zombies;
private void Awake()
{
Instance = this;
}
public void AddZombie(Zombie zombie)
{
zombies.Add(zombie);
}
//获取距离最近的僵尸
public Zombie GetZombieByLineMinDistance(int lineNum,Vector3 pos)
{
Zombie zombie = null;
float dis = 10000;
for(int i = 0; i < zombies.Count; i++)
{
if(zombies[i].CurrGrid.Point.y == lineNum
&&Vector2.Distance(pos,zombies[i].transform.position)< dis)
{
dis = Vector2.Distance(pos, zombies[i].transform.position);
zombie = zombies[i];
}
}
return zombie;
}
}
控制豌豆射手射出子弹
PeaShooter类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PeaShooter : plantBase
{
public override float MaxHp
{
get
{
return 300;
}
}
private bool canAttack = true;
//攻击间隔
private float attackCD = 1.4f;
//子弹偏移
private Vector3 creatBulletOffsetPos = new Vector2(0.61f, 0.42f);
protected override void OnInitPlace()
{
InvokeRepeating("Attack", 0, 0.2f);
//攻击
}
private void Attack()
{
if (canAttack == false) return;
//获取距离最近的僵尸
Zombie zombie = ZombieManager.Instance.GetZombieByLineMinDistance((int)curgird.Point.y, transform.position);
//僵尸在草坪上或者没有 return
if (zombie == null) return;
if (zombie.CurrGrid.Point.x == 8 && Vector2.Distance(zombie.transform.position, zombie.CurrGrid.Position) > 1.5f) return;
Bullet bullet = GameObject.Instantiate<GameObject>(GameManager.Instance.GameConf.Bullet1, transform.position + creatBulletOffsetPos, Quaternion.identity, transform).GetComponent<Bullet>();
CDEnter();
canAttack = false;
}
/// 进入CD
private void CDEnter()
{
StartCoroutine(CalCD());
}
/// 计算冷却时间
IEnumerator CalCD()
{
yield return new WaitForSeconds(attackCD);
canAttack = true;
}
}