在网上找到一些资料参考,然后写写自己的想法。
这里感谢MOMO等大神。

我们用玩家检测怪物的方法来测,这样比较试用与弱联网游戏,每次在同步玩家的时候来判断玩家与怪物的位置。
这里给出两个处理方式:
1.碰撞器R范围检测。
2.地图分块范围检测。

这两种处理方式适用于不同的游戏。
再讲解这两种方式之前,我们先了解一下一个核心问题,怪物在玩家R半径内时怎么判断怪物是否在玩家视觉范围内。
如下图

在图中,
玩家的位置与怪物的位置会成一个向量。设为V1
怪物的朝向也是一个向量。设为V2
如果怪物能看到60°的角度的话。那么Vector(V1,V2)如果小于30°则证明玩家在怪物的视觉范围内。
代码为:

    private bool Find(GameObject _Monster){Vector3 otherPos = _Monster.gameObject.transform.position;v = transform.position - otherPos;v.y = 0.5f; //处理一下y轴,因为判断建立在二维上w = _Monster.gameObject.GetComponent<FindPlayerAI>().getFace() - otherPos;w.y = 0.5f;if (Vector3.Angle(v, w) < 30){return true;}return false;}

PS:如果想在三维上进行判断的话,同理在处理一下yz轴平面就ok了。

现在我们讲解一下第一种处理方式:
这种比较简单也很无脑。给Player加一个SphereCollider就好了,而且这样也可以判断三维状态。注:如果用Terrain做地面请屏蔽。
碰撞器代码:

    void OnTriggerEnter(Collider other){if (!other.name.Equals("Terrain")){if (Find(other.gameObject)) //接上一个Find代码{Debug.Log("发现");}}}

然后就是第二种比较有想法的方式了。
将游戏地图分块。如下图

这里呢。大体思路为:
玩家在0号块,在这个状态的时候,只有a,b怪物可以与玩家进行角度判断,cdef都忽略掉。
代码如下:
Map.cs:

public class Map : MonoBehaviour{private static Map _Instance;public static Map Instance{get{if (_Instance == null){_Instance = new GameObject("_Map").AddComponent<Map>();}return _Instance;}}private int PlayerPos = -1;private GameObject[][] Monster = new GameObject[100][];private int[] MonsterNum = new int[100];//public int n = 0;void Awake(){    for (int i = 0; i < 100; i++){Monster[i] = new GameObject[10];MonsterNum[i] = 0;}}int getPos(GameObject go){float x = go.transform.position.x;float z = go.transform.position.z;x /= 20;z /= 20;int pos = (int)(Mathf.Floor(x) + Mathf.Floor(z) * 10);return pos;}public void setMonsterPos(GameObject _Monster){int pos = getPos(_Monster);Monster[pos][MonsterNum[pos]++] = _Monster;Debug.Log(pos + _Monster.name);}public int getPlayerPos(GameObject _Player){int pos = getPos(_Player);if (PlayerPos == pos){return -1;}else{PlayerPos = pos;}return pos;}public GameObject[] getMonster(int pos){return Monster[pos];}}

玩家AI.cs:

public class PlayerAI : MonoBehaviour {Vector3 v;Vector3 w;Vector3 otherPos;GameObject[] Monster = new GameObject[10];private bool Find(GameObject _Monster){otherPos = _Monster.gameObject.transform.position;v = transform.position - otherPos;v.y = 0.5f;w = _Monster.gameObject.GetComponent<MonsterAI>().getFace() - otherPos;w.y = 0.5f;if (Vector3.Angle(v, w) < 30){return true;}return false;}//void OnTriggerEnter(Collider other)//{//    if (!other.name.Equals("Terrain"))//    {//        if (Find(other.gameObject))//        {//            Debug.Log("发现");//        }//    }//}void Update(){int pos = Map.Instance.getPlayerPos(gameObject);if (pos != -1){Monster = Map.Instance.getMonster(pos);}for (int i = 0; i < Monster.Length; i++){if (Monster[i] != null){if (Find(Monster[i])){Debug.Log(i + "发现");}}}}
}

怪物AI.cs:

public class MonsterAI : MonoBehaviour {public GameObject Player;private Vector3 Face;void Start () {Face = transform.position + transform.rotation * Vector3.forward * 10;Map.Instance.setMonsterPos(gameObject);}public Vector3 getFace(){return Face;}void Update(){Face = transform.position + transform.rotation * Vector3.forward * 10;//Debug.DrawLine(transform.position, Face, Color.red);}
}

怪物AI之发现玩家(视觉范围发现系列)相关推荐

  1. C#Unity3d怪物在一定范围内巡逻发现玩家自动跟踪攻击,血量低于30%自动向后跳3米并缓慢回血的代码和使用

    代码实现: using UnityEngine;public class Monster : MonoBehaviour {public Transform player;public float p ...

  2. 隐藏画质代码_【和平精英】变成恐怖精英?玩家在墙上发现了一幅隐藏的壁画!...

    点击上方蓝色字关注我们~ 大家好,这里是小七~今天有哪些关于和平精英的精彩内容呢?咱们一起看一下. 玩家捡了一把装.45口径的ump"9" 众所周知,ump9这把枪是装9mm子弹的 ...

  3. 浅谈AI设计:理解玩家们对游戏的感知方式

    对于绝大多数的游戏来说,AI都是不可或缺的一部分,优秀的AI设计可以增加游戏深度,提高游戏的挑战性,增加游戏的幽默感,甚至可以让游戏视觉效果.动画以及更多方面更加突出.不过,游戏AI的设计并不是月困难 ...

  4. 游戏编程新手教程:怪物AI设计简述

    怪物AI应该说是这是一个程序问题,如果从策划的角度来说,作为设计者,则需要了解怪物AI整体的设计流程,这样才能提出自己的需求,从而让游戏战斗的整体体验符合设计预期,毕竟怪物AI也是属于战斗和体验的重要 ...

  5. 闫啸的发明与发现(含独立发现)20221105

    闫啸的发明与发现(含独立发现) 1101. 级联微智能及其在数据,大数据中的应用 世界文档工程,对所有的工作建立内容索引化的文档或多媒体文档,文档模板,归集存量的全部文档,文档模板--知识基础设施. ...

  6. [Unity3D]Unity3D游戏开发之怪物AI

    大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei. 在上一篇文章中,我们基本上实现了一个小地图的功能, ...

  7. [2021.10.28]<呆头熊的开发日记>怪物AI(4)

    举盾牌小怪:(标签为Shield,而非Enemy) 1.固定区域巡逻: 2.前后无法攻击.受伤: 3.发现玩家主动攻击: 4.玩家仅能下落攻击对其造成伤害. using System.Collecti ...

  8. [2021.10.22]<呆头熊的开发日记>怪物AI(3)

    这次的敌人在之前最简单的蝙蝠精的基础上加上了远程攻击行行为. 主要行为逻辑: 1.在两点间飞行:2.发现玩家后对玩家进行远程攻击 using System.Collections; using Sys ...

  9. Unity2D敌人/怪物AI控制 第一期

    AI:原地巡逻自动攻击型 AI会在横版地图上向左向右移动,移动一段距离后会原地停止移动,等待一段时间后,会随机向左或向右移动,以此循环,其中AI移动速度,移动时间.停留时间均可以自行调控,当人物进入怪 ...

最新文章

  1. 网络验证常见的攻击方式与防御手段
  2. 创建calico网络报错client response is invalid json
  3. 使用VMware VSphere WebService SDK进行开发 (二)——获取虚拟机cpu的使用情况
  4. 一个程序员的创业失败教训
  5. flume avro java 发送数据_flume将数据发送到kafka、hdfs、hive、http、netcat等模式的使用总结...
  6. Power Shell08当你远程运行powershell指令(不需要管理员权限)
  7. windows无法安装软件
  8. Python画正态曲线、太极图案
  9. 超声波测距模块工作原理
  10. matlab利用dft分析模拟信号频谱,利用DFT分析模拟信号频谱
  11. c语言文件操作之图片+文件“合成器”(详解+源码+视频讲解)
  12. 基于 Creator 3.0 的 3D 换装
  13. 招商加盟竞价推广,怎么做才会有效果?
  14. single-shot detection(SSD)目标检测算法详解——(一看就懂系列!!!)
  15. 操作系统LAB1实验报告
  16. Scene Management --- Culling
  17. windows系统使用Tera Term连接虚拟机(VMware Workstation) 中的Linux(CentOS)
  18. 计算机操作系统——什么是最早截止时间优先调度算法?什么是最低松弛度有限调度算法?举例说明之~
  19. Android学习——碎片(fragment)
  20. 让人哀惋叹息的荷兰人

热门文章

  1. Mask R-CNN 原理解析
  2. 一个农民工自学java找到工作的励志故事
  3. scala集合层次图
  4. matlab多径信道模型,多径时变信道模型的仿真与性能分析课程设计(样例3)
  5. 形式语言:含偶数个零和奇数个一的正则表达式
  6. 老男孩python博客汇总
  7. VTK:数据动画用法实战
  8. 汽车牌照自动识别系统
  9. [转贴]迅雷十年反思
  10. 全球及中国邮件营销服务行业发展趋势及投资策略分析报告2022-2028年