简单AI

来源:互联网 发布:硬盘损坏数据恢复软件 编辑:程序博客网 时间:2024/04/30 05:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 敌人AI类
/// </summary>
public class enemyAI : MonoBehaviour {
    float accumulateTime = 0;//累积时间
    bool _isMove;//字段
    public bool IsMove//属性
    {
        get
        {
            checkNextState(5,2);//调用检测下一个状态函数
            return _isMove;
        }
        set
        {
            _isMove = value;
        }
    }
    /// <summary>
    /// 检测下一个状态函数
    /// </summary>
    void checkNextState(float freezeTimeTrue, float freezeTimeFalse)
    {  
        accumulateTime += Time.deltaTime;
        if (_isMove == true)
        {
            if (accumulateTime >= freezeTimeTrue)
            {
                _isMove = false;
                accumulateTime = 0;
            }
        }
        else
        {
            if (accumulateTime >= freezeTimeFalse)
            {
                _isMove = true;
                accumulateTime = 0;
            }
        }
    }
    float moveSpeed = 5;//移动速度
    float rotateSpeed = 500;//旋转速度
    public GameObject player;//玩家
    float distance;//玩家和敌人之间的距离
    float directionAngle= 0;//随机到的方向角度值 
    // Use this for initialization
    void Start() {
       // moveState.IsMove = true;
    }


    // Update is called once per frame
    void Update() {
        CheckIsMove();
    }
    /// <summary>
    /// 检测IsMove函数
    /// </summary>
    void CheckIsMove()
    {
        distance = Vector3.Distance(transform.position, player.transform.position);//玩家和敌人之间距离
        if (distance > 25)//玩家和敌人之间距离大于25
        {
            if (IsMove == true)//如果可以移动
            {
                Rotate(directionAngle);//调用旋转函数  
            }
            if (IsMove == false)//如果不能移动
            {
                directionAngle = Random.Range(0, 360);//随机一个方向  
            }
        }
        if (distance <= 25)//玩家和敌人之间小于25
        {
            transform.LookAt(player.transform);//朝向玩家
            //transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);//追击玩家
        }
    }
    /// <summary>
    /// 旋转函数
    /// </summary>
    void Rotate(float angle)
    {
        if (angle >= 0 && angle <= 180)//判断想要转到的方向,如果angle在0到180度之间
        {
            if (transform.transform.eulerAngles.y > angle && transform.eulerAngles.y < angle + 180)//如果坦克自身欧拉角在angle和angle+180度之间(在angle右侧)
            {
                transform.Rotate(0, -Time.deltaTime * rotateSpeed, 0);//绕着自身z轴沿逆时针方向以rotateSpeed的速度旋转
            }
            if (transform.transform.eulerAngles.y < angle || transform.eulerAngles.y > angle + 180)//如果坦克自身欧拉角在0到angle或angle+180到360(0)度之间(在angle左侧)
            {
                transform.Rotate(0, Time.deltaTime * rotateSpeed, 0);//绕着自身z轴沿顺时针方向以rotateSpeed的速度旋转
            }
        }
        if (angle > 180 && angle < 360)//如果angle在180到360(0)度之间
        {
            if ((transform.eulerAngles.y > angle || transform.eulerAngles.y < angle - 180))//如果坦克自身欧拉角在angle到360(0)度或0到angle-180度之间(在angle右侧)
            {
                transform.Rotate(0, -Time.deltaTime * rotateSpeed, 0);//绕着自身z轴沿逆时针方向以rotateSpeed的速度旋转
            }
            if (transform.eulerAngles.y < angle && transform.eulerAngles.y > angle - 180)//如果坦克自身欧拉角在angle-180度到angle之间(在angle左侧)
            {
                transform.Rotate(0, Time.deltaTime * rotateSpeed, 0);//绕着自身z轴沿顺时针方向以rotateSpeed的速度旋转
            }
        }
        transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);//移动
    }
}