用unity实现简单人工智能(视觉 听觉 巡逻)

在很多比较小的游戏中我们可能遇到过就是巡逻的敌人 然后它具有视觉和听觉
视觉 就是你在他的后方 他会看不到你 但是在他的视野范围内就可以看到你
听觉 在你行走和站立的时候默认没有声音 在你跑步的时候有声音 敌人会发现你
这篇博客介绍一下这几种效果的实现

在开始之前我说一下耦合度

耦合度
当我们自己做过一些小的游戏之后 我们就会发现耦合度是一个很重要的因素
我曾经也落入过耦合度很高的坑 比如在unity中把物体都设置成为public类型的 然后在unity中拖动
这样做 虽然在代码中比较方便 但是对于之后的开发会很麻烦
所以我们要尽量降低作品的耦合度

1.巡逻效果的实现

首先我们创建最基本的场景
然后我写的这个巡逻的脚本的耦合度很低 可以动态添加unity中添加的地点 很方便

 public  List<Transform> map = new List<Transform>();
 
  private int index = 1;//计数
    private Transform   PathTransform;//所有路径点的父物体
    private Transform[] childrens;//所有路径点的集合
    private void Start()
    {
        PathTransform = GameObject.Find("Path").transform ;
        childrens = PathTransform.GetComponentsInChildren<Transform>();
        foreach (var children in childrens)//遍历
        {
            if (children != PathTransform)//不要把父物体算进路径点中
            {
                map.Add(children);//添加到list中
            }
        }
    }
private  void GoOnPatrol()//巡逻
    {
        transform.LookAt(map[index]);//看向下个路径点
        transform.Translate(Time.deltaTime * 3 * Vector3.forward);//移动
        if (Vector3.Distance(transform.position, map[index].position) < 0.2f)//判断是否到达
        {
            index++;
            index %= map.Count;//取余
        }
    }

我其中的注释写的非常明确了,要是再看不懂 建议补点基础
这样写的好处在于 可以动态获取unity中创建的路径点
如果用public的话 每次更新路径点还得再unity一次一次的赋值 还容易出错
在这里插入图片描述

2.视觉系统的制作

在这里有两种不同的方法一种利用角度和距离做出一个扇形来判断是否在视野范围
在这里插入图片描述
第二种比较简单粗暴 直接碰撞体来检测

1.角度和距离

 private float ViewDistance = 50;//视野最大距离
    public float Angle;
    private float ViewAngle = 60;//视野角度
    public bool isSee = false;
    private void View()//参数控制视野
    {
        if(Vector3.Distance (transform.position ,Player .transform .position )<ViewDistance)
        {
            isSee = true;
            //能看见的状态
            Vector3 PlayerDir = Player.transform.position - transform.position;//玩家相对于自身的方向
            Angle = Vector3.Angle(transform .forward, Player.transform .position );//计算角度
            
            if (Angle < ViewAngle / 2)
            {
                isSee = true;
            }
            else
            {
                isSee = false;
            }
        }
        else
        {
            isSee = false;
        }
    }

利用碰撞体


private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "Player")
        {
            isSee = true;
        }
    }
    private void OnTriggerExit(Collider other)
    {
        if (other.tag == "Player")
        {
            isSee = false;
        }
    }

这个方法要在unity中改变标签 并且要给敌人添加一个碰撞体
在这里插入图片描述
记得勾选isTrigger 添加刚体 才能不出BUG

3.听觉系统

这个的思路是 首先处在听觉范围内其次要开始跑动才能触发听觉

	private float SoundDistance = 10;//听觉最大距离
    public bool  isSound = false;
	private void Sound()//听觉
    {
        if(Vector3.Distance(transform.position ,Player.transform .position )<SoundDistance)
        {
            //处于听觉范围内
            if(Input.GetKey (KeyCode.LeftShift)&&Input.GetKey(KeyCode.W))
            {
                //跑步产生声音
                isSound = true;
            }
            else
            {
                isSound = false;
            }
        }
    } 

感觉这个是最好理解的 只是给大家提供一个思路

这篇博客就结束了 祝工作学习顺利

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值