Unity3d 2017.3 AI(1) 简单的小兵

      PS:如果你觉得这篇文章帮到了你,请顶我一下。 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyAI : MonoBehaviour
{
    //定义敌人的类别
    public enum EnemyType
    {
        Drill,//钻头机器人
        Flame,//喷火机器人
        Chainsaw,//电锯机器人
    }
    //定义敌人的模式
    public enum EnemyPattern
    {
        AT,//自动
        MT,//手动
    }

    public GameObject Enemy;//绑定Enemy单位
    public GameObject Player;//绑定玩家单位
    public EnemyType ChooseEnemyType;//选择敌人的种类
    public EnemyPattern ChooseEnemyPattern;//选择敌人的行动模式
    public Transform PatrolA;//Enemy单位巡逻点A
    public Transform PatrolB;//Enemy单位巡逻点B
    public GameObject LaserTX;//绑定Enemy发射的激光特效
    public float EnemyAttackRange = 5;//Enemy的攻击范围
    public float EnemyMoveSpeed = 1;//暂定移动速度
    public float EnemyRotateSpeed = 10;//暂定旋转速度
    public int ATInterval = 500;//每500帧行动一次

    private Vector3 InitialPosition;//Enemy初始位置
    private float Dis;//Enemy与玩家单位的距离
    private Vector3 target;//Enemy初始目标
    private bool ATswitch = true;//AT模式的行动开关 用于切换旋转和移动的状态
    private float EnemyRotateY = 0.1f;//AT状态下的旋转角度
    private int My_Time = 0;//旋转开关计时器

    // Use this for initialization
    void Start()
    {
        //游戏开始时 记录Enemy所在位置
        InitialPosition = Enemy.transform.position;
        //游戏开始时 为初始目标赋值
        target = PatrolA.position;
        transform.LookAt(target);
    }

    // Update is called once per frame
    void Update()
    {
        //实时记录Enemy与玩家单位之间的距离
        Dis = Vector3.Distance(Enemy.transform.position, Player.transform.position);

        if (ChooseEnemyPattern == EnemyPattern.MT)//手动攻击模式
        {
            //检测玩家是否进入Enemy的攻击范围
            if (EnemyAttackRange > Dis)
            {
                EnemyAttack();//进入攻击范围 进攻姿态
            }
            else
            {
                MTEnemyPatrol();//没有进入攻击范围 巡逻姿态
            }
        }
        else if (ChooseEnemyPattern == EnemyPattern.AT)//自动攻击模式
        {
            if (EnemyAttackRange > Dis)//进入攻击范围 打开攻击
            {
                EnemyAttack();
            }
            else//未进入攻击范围
            {
                ATEnemyMove();//没有进入攻击范围 自由移动
            }
        }
    }

    //Enemy的攻击方法 
    void EnemyAttack()
    {
        //Enemy会注视进入范围的玩家单位
        Enemy.transform.LookAt(Player.transform);
        //发射激光
        LaserTX.SetActive(true);
    }
    //Enemy的巡逻姿态 MT
    void MTEnemyPatrol()
    {
        //进入巡逻状态时 关闭激光
        LaserTX.SetActive(false);
        //Enemy看向目标地点
        Enemy.transform.LookAt(target);
        //判断Enemy与目的地的距离是否小于0.2
        if (Vector3.Distance(Enemy.transform.position, target) <= 0.2f)
        {
            if (target == PatrolA.position)//根据Enemy所处位置 为target赋值
            {
                target = PatrolB.position;
            }
            else
            {
                target = PatrolA.position;
            }
            //Enemy看向目标地点
            Enemy.transform.LookAt(target);
        }
        //Enemy以speed速度向正前方移动
        transform.Translate(Vector3.forward * Time.deltaTime * EnemyMoveSpeed);
    }
    //Enemy的自由姿态
    void ATEnemyMove()
    {
        My_Time++;//计时器
        //关闭激光
        LaserTX.SetActive(false);
        if (My_Time > ATInterval)//每隔固定时间改变开关的值
        {
            if (ATswitch)
            {
                ATswitch = false;
                My_Time = 0;
            }
            else
            {
                ATswitch = true;
                My_Time = 0;
                EnemyRotateY = Random.Range(-0.1f, 0.1f);//此时改变旋转角度 随机数
            }
        }

        if (ATswitch)
        {
            //原地旋转
            transform.Rotate(0, EnemyRotateY, 0);
        }
        else
        {
            //向正前方位移
            transform.Translate(Vector3.forward * Time.deltaTime * EnemyMoveSpeed);
        }
        
    }
}

这是一个简单的小兵的AI,具备两种模式,一种是手动模式,可以指定两点让小兵巡逻,也可以采用自动模式,小兵会自己移动,有攻击和移动两种状态,没有使用状态机或者行为树,因为太简单不需要那么复杂的逻辑。


你可能感兴趣的:(客户端)