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范围检测:怪物检测范围
需求 实现怪物有一定范围的侦测能力,当目标进入侦测范围内后,自动追踪目标[使用unity navmash实现],当子弹进入时,销毁子弹,播放怪物死亡动画以及其他事件。 实现方案 实现怪物在主角靠近一定范围内时发动攻击的功能…...
外包干了10天,技术倒退明显
先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...
后端常问面经之Java基础
基本数据类型 Java中有8种基本数据类型: 6种数字类型: 4种整数型:byte、short、int、long 2种浮点型:float、double 1种字符类型:char 1种布尔类型:boolean 数据类型的默认值以及所占空间如下&#x…...
I.MX6ULL_Linux_驱动篇(58)linux IIO驱动
工业场合里面也有大量的模拟量和数字量之间的转换,也就是我们常说的 ADC 和 DAC。而且随着手机、物联网、工业物联网和可穿戴设备的爆发,传感器的需求只持续增强。比如手机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等,这些传…...
两个包装类型变量的比较问题
问题: 由于受包装类的自动装箱和拆箱的影响,一直以为直接用直接比较两个包装类的大小是否相等就可以,惭愧。比如: Integer a11; Integer b11; System.out.println(ab); 运行结果是 true,似乎没啥问题,但…...
Qt/C++通用跨平台Onvif工具/支持海康大华宇视华为天地伟业等/云台控制/预置位管理/工程调试利器
一、前言 在安防视频监控行业,Onvif作为国际标准,几乎主要的厂商都支持,不仅包含了国内的厂商,也包括主要的国际厂商,由于有了这个标准的存在,使得不同设备不同安防平台之间,能够接入各个厂家的…...
js 在for循环中有setTimeout 时,不执行等待,解决方法
原因:由于setTimeout是异步的,for循环是同步的,所以你的循环会立即继续到下一个迭代,而不会等待setTimeout完成。这意味着所有setTimeout调用几乎会同时开始等待2秒,而不是一个接一个地等待,因此程序出错。…...
机械硬盘与固态硬盘的区别
硬盘中包含机械硬盘、固态硬盘和混合硬盘,那机械硬盘与固态硬盘之间有什么区别呢? 机械硬盘就是传统的普通硬盘,主要采取的存储方式是机械式存储,通过磁头在盘片上进行读写数据;固态硬盘采取的方式则是电子存储&#x…...
Springboot总结
新建项目后,我们一般都需要配置编码,这点非常重要,很多初学者都会忘记这一步,所以要养成良好的习惯。 IDEA 中,仍然是打开File->settings,搜索 encoding,配置一下本地的编码信息。如下&…...
P8623 [蓝桥杯 2015 省 B] 移动距离 Python
[蓝桥杯 2015 省 B] 移动距离 题目描述 X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。 当排满一行时,从下一行相邻的楼往反方向排号。 比如:当小区排号宽度为 6 6 6 时,开始情形如…...
【Python】学习率调整策略详解和示例
学习率调整得当将有助于算法快速收敛和获取全局最优,以获得更好的性能。本文对学习率调度器进行示例介绍。 学习率调整的意义基础示例无学习率调整方法学习率调整方法一多因子调度器余弦调度器 结论 学习率调整的意义 首先,学习率的大小很重要。如果它…...
【Linux实践室】Linux用户管理实战指南:用户密码管理操作详解
🌈个人主页:聆风吟_ 🔥系列专栏:Linux实践室、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 🔔用户密码存放地及方式2.2 🔔使用…...
UE5学习日记——蓝图节点前缀关键字整理
一、起因 节点如海,中英文翻译的时候还是有差别的,比如: 同一个中文,可能在英文里完全不同,连出现位置可能都不一样 附加 Attach Actor To Component(将Actor附加到组件)Append Array…...
浅析机器学习的常用方法
引言: 机器学习(Machine Learning,ML)是一种以计算机程序为基础,在不需要明确编程的情况下,对数据进行分析和处理的人工智能技术。与传统的计算机编程相比,机器学习的区别在于它通过数据建立模…...
大数据开发(日志离线分析项目)
大数据开发(日志离线分析项目) 一、项目需求1、使用jqueryecharts的方式调用程序后台提供的rest api接口,获取json数据,然后通过jquerycss的方式进行数据展示。工作流程如下:2、七大角度1、用户基本信息分析模块2、浏览…...
PostgreSQL技术大讲堂 - 第48讲:PG高可用实现keepalived
PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第48讲&#…...
【若依 SpringBoot 前后端分离版】修改加密传输后密码错误的解决方法(附排错过程)
目录 排错过程 报错信息 SysLoginController SysLoginService(问题核心) 太长不看版:解决方法 文章传送门:若依(RuoYi)SpringBoot框架密码加密传输(前后分离板)_若依密码加密方式-CSDN博客文章浏览阅读1.5w次,点赞…...
发送请求- header配置
请求头里是客户端的要求,把你的诉求告诉服务端,服务端按照你的要求返回数据 , 请求header需要严格全配置,把请求header全部传入,不能频繁访问,让后端知道它是正常请求 一般只配置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? Apache JMeter™ 应用程序是开源软件,一个 100% 纯 Java 应用程序,旨在加载测试功能行为和测量性能 。它最初是为测试 Web 应用程序而设计的,但后来扩展到其他测试功能。 2. JMeter能做啥&#x…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
