怪物AI之发现玩家(视觉范围发现系列)
在网上找到一些资料参考,然后写写自己的想法。
这里感谢MOMO等大神。
我们用玩家检测怪物的方法来测,这样比较试用与弱联网游戏,每次在同步玩家的时候来判断玩家与怪物的位置。
这里给出两个处理方式:
1.碰撞器R范围检测。
2.地图分块范围检测。
这两种处理方式适用于不同的游戏。
再讲解这两种方式之前,我们先了解一下一个核心问题,怪物在玩家R半径内时怎么判断怪物是否在玩家视觉范围内。
如下图
在图中,
玩家的位置与怪物的位置会成一个向量。设为V1
怪物的朝向也是一个向量。设为V2
如果怪物能看到60°的角度的话。那么Vector(V1,V2)如果小于30°则证明玩家在怪物的视觉范围内。
代码为:
private bool Find(GameObject _Monster)
{
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) < )
{
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 = -; private GameObject[][] Monster = new GameObject[][];
private int[] MonsterNum = new int[]; //public int n = 0; void Awake()
{
for (int i = ; i < ; i++)
{
Monster[i] = new GameObject[];
MonsterNum[i] = ;
}
} int getPos(GameObject go)
{
float x = go.transform.position.x;
float z = go.transform.position.z;
x /= ;
z /= ;
int pos = (int)(Mathf.Floor(x) + Mathf.Floor(z) * );
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 -;
}
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[]; 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) < )
{
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 != -)
{
Monster = Map.Instance.getMonster(pos);
}
for (int i = ; 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 * ;
Map.Instance.setMonsterPos(gameObject);
} public Vector3 getFace()
{
return Face;
} void Update()
{
Face = transform.position + transform.rotation * Vector3.forward * ;
//Debug.DrawLine(transform.position, Face, Color.red);
}
}
怪物AI之发现玩家(视觉范围发现系列)的更多相关文章
- 怪物AI(复习)
怪物AI执行 //-----------------------------------------------主动攻击---------------------------------------- ...
- [Unity3D]Unity3D游戏开发之怪物AI
大家好.欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei. 在上一篇文章中,我们基本上实现了一个 ...
- 简单3d RPG游戏 之 003 怪物AI
游戏中,怪物会自动的往玩家所在地点走去,那需要创建一个C#脚本EnemyAI,包含两个功能: 1. 怪物旋转自己对准玩家 2. 怪物向前移动,追逐玩家 public class EnemyAI : M ...
- 四层发现-TCP和UDP发现简介
虽然这里使用到了端口发现,但是四层发现阶段并不对端口进行解析,而是通过端口进行对ip是否存活的判断. 这里是对主机的发现,而不是对端口的识别. 四层发现的结果比三层发现的结果更加精确,基本不会被防火墙 ...
- 科学家用AI看月球后,却发现了这些东西
人工智能(AI)几乎已经无所不在,我们生活的大多数方面都已经被它们渗透,随着AI在过去几年取得的令人震惊的进步,它在许多方面都可能帮助我们的生活变得更美好.近日,AI在月球上发现了近7000个未被 ...
- AI比医生更好地发现皮肤癌,未来计算机技术可渗透医院
未来机器人将取代医生?这可能是事实.为什么这么多年轻人选择计算机行业,因为这是一个趋势.据法新社报道,研究人员周二称,一项计算机技术比人类皮肤科医生在检测皮肤癌方面的表现要好得多,因为这项研究是为了寻 ...
- 服务发现:Zookeeper vs etcd vs Consul
[编者的话]本文对比了Zookeeper.etcd和Consul三种服务发现工具,探讨了最佳的服务发现解决方案,仅供参考. 如果使用预定义的端口,服务越多,发生冲突的可能性越大,毕竟,不可能有两个服务 ...
- 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...
- cocos2dx - 生成怪物及AI
接上一节内容:cocos2dx - tmx地图分层移动处理 本节怪物及简单AI实现 一.怪物 同cocos2dx - v2.3.3编辑器骨骼动画 里创建的CPlalyer一样,新建一个CMonster ...
随机推荐
- Linux挂载卸载光盘&实践
在Linux下有时候需要挂载光盘,拷贝文件或安装系统,例如拷贝Redhat操作系统镜像文件等.下面介绍一下在Linux系统下挂载.卸载光盘的方法. 在Linux系统中,每一个物理设备都可以看做是一个文 ...
- SQL Server 中WITH (NOLOCK)浅析
概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如 ...
- Unable to open the physical file xxxx. Operating system error 2
在新UAT服务器上,需要将tempdb放置在SSD(固态硬盘)上.由于SSD(固态硬盘)特性,所以tempdb的文件只能放置在D盘下面,而不能是D盘下的某一个目录下面. ALTER DATABASE ...
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理5
我们先直接拷贝下blank.html这个页面的代码,顺带先建立一个Home控制器,并添加Index视图.将代码拷贝进去. <!DOCTYPE html> <html lang=&qu ...
- 解决虚拟机VMware安装CentOS7.0识别不到网卡
由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装,默认的网卡类型不兼容. 解决方法 找到我们的Vmware虚拟机文件夹,将VMware 虚拟机配置 (.vmx),追加一条设置我们网卡类 ...
- 洛谷P1341 无序字母对[无向图欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...
- Python函数作用域的查找顺序
函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...
- PhpStorm XDebug 远程调试
现在我们自己公司的各种开发和测试服务器,都是使用阿里云的服务器.一些PHP的项目,无法在本地搭建完整的环境,在外网服务器上调试更方便定位问题.发现网上没有完整的关于如何配置PHPStorm和XDebu ...
- VirtualBox装ghost XP
在win7 professional 64上安装了virtualBox4.3.14 r95030 版本,之所以要安装这个vb,是因为刚升级的vm 打开之后很占用cpu, 网上又说vb不是很占用cpu而 ...
- 对.net技术组件的分析和选择
.net很庞杂,学习最忌讳什么?为了学而学,而不是为了用而学.我们不是为了成为教师,所以不要成为书呆子,不要成为"博士",要从庞杂的技术群中选择自己需要的内容进行学习. 如果不加选 ...