怪物的AI

判断玩家的位置

using UnityEngine;

public class EnemyMove : MonoBehaviour {

    //玩家的动画
    public Animator _anim;
    //判断看见玩家
    public bool MoveEnemy = false;
    //寻路组件
    private UnityEngine.AI.NavMeshAgent Navenemy;
    //敌人的视野范围
    public float shiftspeed = 120;
    //看到玩家的位置;储存视觉和听觉的
    public Vector3 vectplayer = Vector3.zero;
    //听觉视觉范围
    private SphereCollider SphereEnemy;
    //触发警报看到玩家的位置,储存摄像头和红外线的
    public Vector3 alarmplayer;
    //初始化
    private void Awake()
    {
        //获取玩家身上的动画
        _anim = GameObject.FindGameObjectWithTag(Tags.Playtags).GetComponent<Animator>();
        //获取寻路组件
        Navenemy = this.GetComponent<UnityEngine.AI.NavMeshAgent>();
        //获取圆的碰撞体,也就是听觉和视觉的范围
        SphereEnemy = this.GetComponent<SphereCollider>();
    }
    private void Start()
    {
        //获取玩家的位置
        alarmplayer = GameManger._instance.locationplay;
    }
    private void Update()
    {
        //判断有没有获取玩家的位置
        if (alarmplayer != GameManger._instance.locationplay)
        {
            //储存视觉、听觉和储存摄像头、红外线获取玩家的位置
            vectplayer = GameManger._instance.locationplay;
            alarmplayer = GameManger._instance.locationplay;
        }
    }
    private void OnTriggerStay(Collider other)//触发停留函数
    {
        //判断是不是玩家
        if (other.tag == Tags.Playtags)
        {
            //到玩家的距离
            Vector3 seat = other.transform.position - transform.position;
            //获取夹角
            float angle = Vector3.Angle(transform.forward, seat);
            RaycastHit hit;//储存碰撞信息
            Physics.Raycast(transform.position + Vector3.up, seat, out hit);
            //是判断玩家是否在敌人射线范围之内
            if (angle < shiftspeed * 0.5f && hit.collider.tag == Tags.Playtags)
            {
                //看到玩家
                MoveEnemy = true;
                //警报响起
                GameManger._instance.open = true;
                //得到玩家位置
                vectplayer = other.transform.position;
            }
            else
            {
                //没有看到玩家
                MoveEnemy = false;
            }
            //判断动画是否播放
            if (_anim.GetCurrentAnimatorStateInfo(0).IsName("Tree"))
            {
                //储存巡逻拐角
                UnityEngine.AI.NavMeshPath path = new UnityEngine.AI.NavMeshPath();
                //判断所有的拐点是否获取完毕
                if (Navenemy.CalculatePath(other.transform.position, path))
                {
                    //数组  用来保存玩家和敌人的距离
                    Vector3[] SiteArray = new Vector3[path.corners.Length + 2];
                    //敌人的位置
                    SiteArray[0] = transform.position;
                    //玩家的位置
                    SiteArray[SiteArray.Length - 1] = other.transform.position;
                    //存储起点到终点拐点的位置
                    for (int i = 0; i < path.corners.Length; i++)
                    {
                        SiteArray[i + 1] = path.corners[i];
                    }
                    float length = 0;
                    //用来保存玩家到敌人的距离
                    for (int i = 0; i < SiteArray.Length - 1; i++)
                    {
                        //向量距离的相加   因为距离是Vectorc类型的所以,magnitude是转float
                        length += (SiteArray[i + 1] - SiteArray[i]).magnitude;
                    }
                    //判断是否进入听力范围内
                    if (length <= SphereEnemy.radius)
                    {
                        //如果是就把玩家的位置传给敌人
                        vectplayer = other.transform.position;
                    }
                }
            }
        }
    }
    //退出函数
    private void OnTriggerExit(Collider other)
    {
        //判断是不是玩家
        if (other.tag == Tags.Playtags)
        {
            //没有看到玩家
            MoveEnemy = false;
        }
    }



}

攻击:

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

public class RobotAI : MonoBehaviour {

    //储存巡逻点的数组
    public Transform[] piece;
    //巡逻次数
    public int number = 0;
    //计时器
    public float trimer;
    //巡逻组件
    public UnityEngine.AI.NavMeshAgent navpatrol;
    //到达巡逻点停留的时间
    public float pattroltrime = 2f;
    //EnemyMove定义的字段好调用里面的东西
    public EnemyMove Robot;
    //Playcase定义的字段好调用里面的东西
    public Playcase player;

    void Awake()
    {
        //初始化添加组件
        navpatrol = this.GetComponent<UnityEngine.AI.NavMeshAgent>();
        //储存第一个巡逻的位置
        navpatrol.destination = piece[number].position;
        //调用类
        player = GameObject.FindGameObjectWithTag(Tags.Playtags).GetComponent<Playcase>();
        Robot = this.GetComponent<EnemyMove>();

    }
    void Update()
    {
        //判断是否看到敌人和玩家血量
        if (Robot.MoveEnemy && player.HP > 0)
        {
            //射击的方法
            shooting();
        }
        //判断看到玩家的位置不等于零和玩家血量
        else if (Robot.vectplayer != Vector3.zero && player.HP > 0)
        {
            //追击的方法
            Arrest();
        }
        else
        {
            //巡逻的方法
            Patrol();
        }
    }
  
    //巡逻的方法
    void Patrol()
    {
        //恢复行动
        navpatrol.Resume();
        //巡逻速度
        navpatrol.speed = 2f;
        //判断当看到玩家时敌人和玩家的距离是小于0.3
        if (navpatrol.remainingDistance < 0.3f)
        {
            //计时器
            trimer += Time.deltaTime;
            //判断到达巡逻点停留的时间是否小于计时器
            if (pattroltrime < trimer)
            {
                //巡逻点++
                number++;
                //让它再从新开始
                number %= 4;
                navpatrol.destination = piece[number].position;
                //计时器清零
                trimer = 0;
            }
        }
    }
    //追捕的方法
    void Arrest()
    {
        //开始
        navpatrol.Resume();
        //追击速度
        navpatrol.speed = 4f;
        //追捕玩家
        navpatrol.destination = Robot.vectplayer;
        //判断当看到玩家时敌人和玩家的距离是小于2
        if (navpatrol.remainingDistance < 2)
        {
            //计时器
            trimer += Time.deltaTime;
            //判断到达巡逻点停留的时间是否小于计时器
            if (pattroltrime < trimer)
            {
                //计时器归零
                trimer = 0;
                //玩家的位置归零
                GameManger._instance.locationplay = Vector3.zero;
                //警报关闭
                GameManger._instance.open = false;
                //储存视觉和听觉的位置归零
                Robot.vectplayer = Vector3.zero;
            }
        }
    }

    //射击的方法
    public void shooting()
    {
        //暂停
        navpatrol.Stop();
        //看向玩家的位置
        this.transform.LookAt(player.transform.position);
    }
}

大致差不多了,如果没实现,请自行补充,我就这么个思路,能看懂的很简单的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值