SIKI学习——坦克大战06

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值