塔防游戏防御塔自动攻击敌人unity代码
时间: 2023-09-04 15:06:58 浏览: 165
以下是一个简单的防御塔游戏的代码示例,包括防御塔自动攻击敌人的逻辑:
```csharp
public class Tower : MonoBehaviour
{
public float range = 10f; // 攻击范围
public float fireRate = 1f; // 发射速率
public GameObject bulletPrefab; // 子弹预制体
private Transform target; // 目标敌人
private float fireCountdown = 0f; // 发射倒计时
void Update()
{
if (target == null) // 如果没有目标敌人,则查找敌人
{
FindTarget();
return;
}
if (fireCountdown <= 0f) // 如果发射倒计时结束,则发射子弹
{
Shoot();
fireCountdown = 1f / fireRate;
}
fireCountdown -= Time.deltaTime; // 更新发射倒计时
}
void FindTarget()
{
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy"); // 查找所有敌人
float shortestDistance = Mathf.Infinity;
GameObject nearestEnemy = null;
foreach (GameObject enemy in enemies) // 遍历所有敌人,找到最近的敌人
{
float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position);
if (distanceToEnemy < shortestDistance && distanceToEnemy <= range)
{
shortestDistance = distanceToEnemy;
nearestEnemy = enemy;
}
}
if (nearestEnemy != null) // 如果有找到最近的敌人,则设为目标敌人
{
target = nearestEnemy.transform;
}
}
void Shoot()
{
GameObject bulletGO = Instantiate(bulletPrefab, transform.position, Quaternion.identity); // 实例化子弹
Bullet bullet = bulletGO.GetComponent<Bullet>(); // 获取子弹组件
if (bullet != null) // 如果子弹组件存在,则设置目标敌人
{
bullet.Seek(target);
}
}
void OnDrawGizmosSelected() // 在编辑器中显示攻击范围
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, range);
}
}
```
该代码包含以下要点:
1. 使用 `range` 属性定义防御塔攻击范围;
2. 使用 `fireRate` 属性定义防御塔发射速率;
3. 使用 `bulletPrefab` 属性定义子弹预制体;
4. 使用 `target` 变量存储目标敌人;
5. 在 `Update` 方法中,先查找目标敌人,如果有目标敌人则更新发射倒计时并发射子弹;
6. 在 `FindTarget` 方法中,查找所有敌人,找到最近的敌人并设为目标敌人;
7. 在 `Shoot` 方法中,实例化子弹并设置目标敌人;
8. 在 `OnDrawGizmosSelected` 方法中,在编辑器中显示攻击范围。
需要注意的是,该代码仅为示例代码,实际使用中可能需要根据具体需求进行修改和优化。
阅读全文