当前位置: 首页 > news >正文

unity 2d范围检测:怪物检测范围

需求

实现怪物有一定范围的侦测能力,当目标进入侦测范围内后,自动追踪目标[使用unity navmash实现],当子弹进入时,销毁子弹,播放怪物死亡动画以及其他事件。

实现方案

实现怪物在主角靠近一定范围内时发动攻击的功能,主要涉及到游戏AI和碰撞检测方面的知识。下面我将介绍几种成熟的方案,这些方案可以根据你的具体需求和使用的游戏开发框架进行选择和调整:

1. 碰撞检测触发(Collision Detection)

  • 基础原理:在游戏世界中为怪物设置一个不可见的碰撞体(如圆形、矩形或多边形区域),当主角的碰撞体进入这个区域时,触发攻击行为。
  • 优点:简单直观,适用于大多数2D游戏。
  • 缺点:对于复杂形状的碰撞检测可能需要更高的计算成本。

2. 距离检测(Distance Checking)

  • 基础原理:通过计算怪物和主角之间的距离,当距离小于某个设定值时,触发攻击。
  • 优点:实现简单,计算成本较低。
  • 缺点:不考虑障碍物阻挡,可能导致怪物通过墙体攻击主角。

3. 视野检测(Field of View Checking)

  • 基础原理:除了检测距离,还需要检测主角是否在怪物的视野内(例如通过射线检测或扇形区域检测)。
  • 优点:更加真实,可以模拟怪物的视线被障碍物阻挡的情况。
  • 缺点:实现复杂度和计算成本较高。

4. 导航网格和路径寻找(NavMesh and Pathfinding)

  • 基础原理:利用导航网格确定游戏中可行走的区域,并使用路径寻找算法(如A*算法)计算怪物到主角的路径。如果路径存在且长度小于某个阈值,则触发攻击。
  • 优点:可以实现复杂的追踪和规避行为,适用于需要复杂AI行为的游戏。
  • 缺点:实现难度较高,对于简单游戏可能过于复杂。

5. 状态机(State Machine)

  • 基础原理:结合上述方法,使用状态机管理怪物的行为状态(如巡逻、追踪、攻击等)。当主角满足攻击触发条件时,怪物状态转换为攻击状态。
  • 优点:提高了AI行为的可控性和复杂性。
  • 缺点:需要较为复杂的逻辑设计。

选择建议

  • 对于简单的游戏,可以考虑使用碰撞检测触发或距离检测方案。
  • 如果游戏场景中存在很多障碍物,视野检测或导航网格和路径寻找将是更好的选择。
  • 为了实现更加复杂和智能的怪物行为,建议使用状态机结合上述某种或多种检测方法。

方案1和方案3优劣对比

比较碰撞检测触发(方案1)和视野检测(方案3)的优缺点可以帮助你根据游戏的具体需求和设计目标选择更合适的怪物行为触发机制。下面是两种方法的优缺点比较:

碰撞检测触发(Collision Detection)

优点:
  • 简单易实现:基于碰撞检测的逻辑相对简单,大多数游戏引擎都提供了碰撞检测的内置支持,容易实现和集成。
  • 计算效率高:相对于复杂的算法,碰撞检测通常只需要较少的计算资源,适合快速开发和运行在性能受限的平台上。
  • 直观:对于玩家来说,这种触发机制很直观。当他们看到角色进入了怪物的"领域",自然能预期到接下来可能会发生什么。
缺点:
  • 不考虑视线:碰撞检测不考虑怪物的视野和障碍物遮挡,可能导致不够真实的情况发生,例如怪物能够通过墙壁"看到"玩家并触发攻击。
  • 形状限制:如果游戏中的角色或怪物具有复杂的形状,简单的碰撞体(如圆形或矩形)可能无法精确表示实际的物理空间,需要更复杂的碰撞体设计。

视野检测(Field of View Checking)

优点:
  • 更加真实:视野检测能够模拟怪物的视线和视野范围,包括视野被障碍物阻挡的情况,这为游戏增添了更多的真实感和策略性。
  • 灵活性:可以根据需要调整视野的角度和距离,为不同的怪物设计不同的感知能力,增加游戏的多样性和复杂性。
  • 适合复杂环境:在复杂的游戏环境中(如多障碍物、复杂地形等),视野检测可以更准确地反映怪物的行为和玩家的潜行机会。
缺点:
  • 实现复杂度高:相比于简单的碰撞检测,视野检测需要更复杂的数学计算和逻辑判断,可能涉及射线投射、扇形区域检测等技术,增加了开发的难度。
  • 计算成本高:尤其是在场景中有大量动态对象和复杂地形时,视野检测可能需要较多的计算资源,对性能有一定影响。

结论

  • 如果你的游戏需要简单、直观的敌人行为触发,并且对计算资源有限制,碰撞检测触发是一个好的选择。
  • 如果游戏设计强调真实感、策略性和环境交互,尤其是在复杂的游戏环境中,视野检测提供了更多的灵活性和真实性,但需要权衡实现的复杂度和性能影响。

选择方案1实现

这里我们实现怪物检测范围为圆形,给怪物prefab挂载Circle Collider 2D,当目标进入或者在触发器内部时追逐目标,(注意把触发器 istrigger 勾选上)
给怪物同时挂上box collider 2D,当子弹和怪物主体发生碰撞时,使用回调OnCollisionEnter2D,实现子弹击中逻辑(注意不要勾选istrigger)

// 假设这是你的怪物脚本
public class Monster : MonoBehaviour
{private CircleCollider2D detectCollider;void Start(){// 初始化圆形碰撞器,并设置初试半径detectCollider = gameObject.AddComponent<CircleCollider2D>();detectCollider.radius = 1.0f; // 初始半径,可根据需求调整detectCollider.isTrigger = true; // 设置为触发器,用于检测进入碰撞区域的对象而不是进行物理碰撞}// 动态调整检测范围半径的方法public void SetDetectionRadius(float radius){if(detectCollider != null){detectCollider.radius = radius;}}
}

设置进入/待在/离开怪物的回调函数

using UnityEngine;public class Monster : MonoBehaviour
{// 当玩家角色进入触发器范围时调用void OnTriggerEnter2D(Collider2D other){if (other.CompareTag("Player")){Debug.Log("玩家进入怪物的检测范围");// 在这里添加怪物开始攻击玩家的代码}}// 当玩家角色在触发器范围内时调用void OnTriggerStay2D(Collider2D other){if (other.CompareTag("Player")){Debug.Log("玩家仍在怪物的检测范围内");// 可以添加例如持续伤害等效果的代码}}// 当玩家角色离开触发器范围时调用void OnTriggerExit2D(Collider2D other){if (other.CompareTag("Player")){Debug.Log("玩家离开怪物的检测范围");// 在这里添加怪物停止攻击的代码}}
}

相关文章:

unity 2d范围检测:怪物检测范围

需求 实现怪物有一定范围的侦测能力&#xff0c;当目标进入侦测范围内后&#xff0c;自动追踪目标[使用unity navmash实现]&#xff0c;当子弹进入时&#xff0c;销毁子弹&#xff0c;播放怪物死亡动画以及其他事件。 实现方案 实现怪物在主角靠近一定范围内时发动攻击的功能…...

外包干了10天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…...

后端常问面经之Java基础

基本数据类型 Java中有8种基本数据类型&#xff1a; 6种数字类型&#xff1a; 4种整数型&#xff1a;byte、short、int、long 2种浮点型&#xff1a;float、double 1种字符类型&#xff1a;char 1种布尔类型&#xff1a;boolean 数据类型的默认值以及所占空间如下&#x…...

I.MX6ULL_Linux_驱动篇(58)linux IIO驱动

工业场合里面也有大量的模拟量和数字量之间的转换&#xff0c;也就是我们常说的 ADC 和 DAC。而且随着手机、物联网、工业物联网和可穿戴设备的爆发&#xff0c;传感器的需求只持续增强。比如手机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等&#xff0c;这些传…...

两个包装类型变量的比较问题

问题&#xff1a; 由于受包装类的自动装箱和拆箱的影响&#xff0c;一直以为直接用直接比较两个包装类的大小是否相等就可以&#xff0c;惭愧。比如&#xff1a; Integer a11; Integer b11; System.out.println(ab); 运行结果是 true&#xff0c;似乎没啥问题&#xff0c;但…...

Qt/C++通用跨平台Onvif工具/支持海康大华宇视华为天地伟业等/云台控制/预置位管理/工程调试利器

一、前言 在安防视频监控行业&#xff0c;Onvif作为国际标准&#xff0c;几乎主要的厂商都支持&#xff0c;不仅包含了国内的厂商&#xff0c;也包括主要的国际厂商&#xff0c;由于有了这个标准的存在&#xff0c;使得不同设备不同安防平台之间&#xff0c;能够接入各个厂家的…...

js 在for循环中有setTimeout 时,不执行等待,解决方法

原因&#xff1a;由于setTimeout是异步的&#xff0c;for循环是同步的&#xff0c;所以你的循环会立即继续到下一个迭代&#xff0c;而不会等待setTimeout完成。这意味着所有setTimeout调用几乎会同时开始等待2秒&#xff0c;而不是一个接一个地等待&#xff0c;因此程序出错。…...

机械硬盘与固态硬盘的区别

硬盘中包含机械硬盘、固态硬盘和混合硬盘&#xff0c;那机械硬盘与固态硬盘之间有什么区别呢&#xff1f; 机械硬盘就是传统的普通硬盘&#xff0c;主要采取的存储方式是机械式存储&#xff0c;通过磁头在盘片上进行读写数据&#xff1b;固态硬盘采取的方式则是电子存储&#x…...

Springboot总结

新建项目后&#xff0c;我们一般都需要配置编码&#xff0c;这点非常重要&#xff0c;很多初学者都会忘记这一步&#xff0c;所以要养成良好的习惯。 IDEA 中&#xff0c;仍然是打开File->settings&#xff0c;搜索 encoding&#xff0c;配置一下本地的编码信息。如下&…...

P8623 [蓝桥杯 2015 省 B] 移动距离 Python

[蓝桥杯 2015 省 B] 移动距离 题目描述 X 星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。 当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。 比如&#xff1a;当小区排号宽度为 6 6 6 时&#xff0c;开始情形如…...

【Python】学习率调整策略详解和示例

学习率调整得当将有助于算法快速收敛和获取全局最优&#xff0c;以获得更好的性能。本文对学习率调度器进行示例介绍。 学习率调整的意义基础示例无学习率调整方法学习率调整方法一多因子调度器余弦调度器 结论 学习率调整的意义 首先&#xff0c;学习率的大小很重要。如果它…...

【Linux实践室】Linux用户管理实战指南:用户密码管理操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;用户密码存放地及方式2.2 &#x1f514;使用…...

UE5学习日记——蓝图节点前缀关键字整理

一、起因 节点如海&#xff0c;中英文翻译的时候还是有差别的&#xff0c;比如&#xff1a; 同一个中文&#xff0c;可能在英文里完全不同&#xff0c;连出现位置可能都不一样 附加 Attach Actor To Component&#xff08;将Actor附加到组件&#xff09;Append Array&#xf…...

浅析机器学习的常用方法

引言&#xff1a; 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是一种以计算机程序为基础&#xff0c;在不需要明确编程的情况下&#xff0c;对数据进行分析和处理的人工智能技术。与传统的计算机编程相比&#xff0c;机器学习的区别在于它通过数据建立模…...

大数据开发(日志离线分析项目)

大数据开发&#xff08;日志离线分析项目&#xff09; 一、项目需求1、使用jqueryecharts的方式调用程序后台提供的rest api接口&#xff0c;获取json数据&#xff0c;然后通过jquerycss的方式进行数据展示。工作流程如下&#xff1a;2、七大角度1、用户基本信息分析模块2、浏览…...

PostgreSQL技术大讲堂 - 第48讲:PG高可用实现keepalived

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第48讲&#…...

【若依 SpringBoot 前后端分离版】修改加密传输后密码错误的解决方法(附排错过程)

目录 排错过程 报错信息 SysLoginController SysLoginService&#xff08;问题核心&#xff09; 太长不看版&#xff1a;解决方法 文章传送门&#xff1a;若依(RuoYi)SpringBoot框架密码加密传输(前后分离板)_若依密码加密方式-CSDN博客文章浏览阅读1.5w次&#xff0c;点赞…...

发送请求- header配置

请求头里是客户端的要求&#xff0c;把你的诉求告诉服务端&#xff0c;服务端按照你的要求返回数据 &#xff0c; 请求header需要严格全配置&#xff0c;把请求header全部传入&#xff0c;不能频繁访问&#xff0c;让后端知道它是正常请求 一般只配置User-Agent和Content Typ…...

C语言重难知识点

C语言重难知识点 if(a=1) 为真函数指针的调用(int)2.9 = 2逗号运算符,最右边表达式值作为整个逗号表达式的值。文件操作if(a=1) 为真 int a=0,b=0,c=0; if(a...

jMeter学习

一. JMeter介绍 1. 什么是JMeter&#xff1f; Apache JMeter™ 应用程序是开源软件&#xff0c;一个 100% 纯 Java 应用程序&#xff0c;旨在加载测试功能行为和测量性能 。它最初是为测试 Web 应用程序而设计的&#xff0c;但后来扩展到其他测试功能。 2. JMeter能做啥&#x…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...