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…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
