1. 敌人AI
改变敌人的移动和生成子弹的时间间隔。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
//属性值
public float moveSpeed = 3;//移动速度
private Vector3 bulletEulerAnles;//定义子弹的需要旋转的欧拉角
private float v;
private float h;
//引用
private SpriteRenderer sr;//通过切换图片改变转向
public Sprite[] tankSprite;//切换用到的图片第一张0上第二张8右第三张16下第四张24左
public GameObject bulletPrefab;//子弹的预制物
public GameObject explosionPrefab;//特效预制体
//计时器
private float timeVal;//设置子弹发射的CD值
private float timeValChangeDirection=4;//用来改变方向
void Start()
{
sr = GetComponent<SpriteRenderer>();
}
void Update()
{
//攻击的时间间隔
if (timeVal >= 3f)
{
Attack();
}
else
{
timeVal += Time.deltaTime;
}
}
private void FixedUpdate()//固定物理帧
{
Move();
}
/// <summary>
/// 坦克的攻击方法
/// </summary>
private void Attack()
{
//子弹产生的角度:当前坦克的角度加上子弹应该旋转的角度
Instantiate(bulletPrefab, transform.position, Quaternion.Euler(transform.eulerAngles + bulletEulerAnles));//实例化子弹
timeVal = 0;
}
/// <summary>
/// 坦克的移动方法
/// </summary>
private void Move()
{
if (timeValChangeDirection >= 4)
{
int num = Random.Range(0, 8);
if (num > 5)
{
v = -1;//敌人向下运动
h = 0;
}
else if (num == 0)
{
v = 1;//敌人向上移动
h = 0;
}
else if (num > 0 && num <= 2)
{
h = -1;//敌人向左移动
v = 0;
}
else if (num > 2 && num <= 4)
{
h = 1;//敌人向右移动
v = 0;
}
timeValChangeDirection = 0;//到达之后就归零
}
else
{
timeValChangeDirection += Time.fixedDeltaTime;
}
transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);//fixedDeltaTime每一帧都是固定的秒数
if (v < 0)
{
sr.sprite = tankSprite[2];
bulletEulerAnles = new Vector3(0, 0, -180);//子弹向下
}
else if (v > 0)
{
sr.sprite = tankSprite[0];
bulletEulerAnles = new Vector3(0, 0, 0);//子弹向上
}
//设置移动的优先级
if (v != 0)
{
return;//同时按下两个方向键,只能在垂直方向上移动
}
transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);//点击往右移动返回1点击往左移动返回-1 Space.World以世界坐标轴来移动
if (h < 0)
{
sr.sprite = tankSprite[3]