Unity基础学习(十二)Unity 物理系统之范围检测

        

目录

一、关于范围检测的主要API:

1. 盒状范围检测 Physics.OverlapBox

2. 球形范围检测 Physics.OverlapSphere

3. 胶囊范围检测 Physics.OverlapCapsule

4. 盒状检测 NonAlloc 版

5. 球形检测 NonAlloc 版

6. 胶囊检测 NonAlloc 版

二、关于API中的两个重点参数

QueryTriggerInteraction 参数详解 

1. QueryTriggerInteraction.UseGlobal

2. QueryTriggerInteraction.Collide

3. QueryTriggerInteraction.Ignore

LayerMask 在范围检测中的深度解析

1. 层级系统基础

2. LayerMask 本质

层级选择:精准定位目标层

基础选择方法

高级选择方式

 层级合并:组合检测

基本合并技巧

层级排除:精准过滤 

常见错误:

1. 层名拼写错误(静默失败)

2. 位运算优先级错误

3. 掩码值为0(不检测任何层)

4. 混淆层索引和掩码值 这个最常见

三、总结

 基本范围检测函数

高效 NonAlloc 版本

 关键参数详解表

通用参数(所有检测函数)

盒状检测特有参数

球形检测特有参数

胶囊检测特有参数

NonAlloc 版本特有参数

 LayerMask 操作指南

 高频错误及解决方案


        在前面的内容中,我们学习了关于碰撞的检测相关,今天我们来看看指定范围的检测,这个检测是什么呢?就是瞬时检测指定空间内的碰撞器对象(无实体碰撞效果),适用于技能攻击、区域触发等场景。

        那么被检测的对象需要具备些什么条件呢?被检测对象 必须挂载碰撞器(Collider)(无需 Rigidbody)。

一、关于范围检测的主要API:

1. 盒状范围检测 Physics.OverlapBox

参数相关:

Collider[] Physics.OverlapBox(Vector3 center,                 // 盒子中心点(世界坐标)Vector3 halfExtents,            // 盒子三边尺寸(半长,非全尺寸)Quaternion orientation,         // 盒子旋转角度int layerMask = AllLayers,      // 层级掩码(默认所有层)QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal
)

返回值:检测范围内的所有碰撞器组成的数组(无碰撞时返回空数组)

例如:

void CheckAttackRange()
{// 在玩家前方1米处创建2x2x2的检测盒Vector3 center = transform.position + transform.forward;Vector3 size = new Vector3(2, 2, 2);int enemyLayer = 1 << LayerMask.NameToLayer("Enemy");Collider[] hits = Physics.OverlapBox(center,size / 2,  // 注意:参数是半长尺寸transform.rotation,enemyLayer,QueryTriggerInteraction.Ignore);foreach (Collider col in hits){Enemy enemy = col.GetComponent<Enemy>();if(enemy != null) enemy.TakeDamage(10);}// 调试绘制Debug.DrawLine(transform.position, center, Color.red, 0.5f);
}

实际上你看不到他的检测范围的,你要自己想象。 

 

2. 球形范围检测 Physics.OverlapSphere

参数相关:

Collider[] Physics.OverlapSphere(Vector3 position,               // 球心位置(世界坐标)float radius,                   // 球体半径int layerMask = AllLayers,      // 层级掩码QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal
)

返回值:球体内的所有碰撞器数组 

void DetectNearbyItems()
{// 检测周围5米内的可收集物品int itemLayer = LayerMask.GetMask("Collectibles");float detectRadius = 5f;Collider[] items = Physics.OverlapSphere(transform.position,detectRadius,itemLayer);foreach (Collider item in items){item.GetComponent<Collectible>().Highlight();}// 调试绘制Gizmos.color = Color.cyan;Gizmos.DrawWireSphere(transform.position, detectRadius);
}

这个球形的和上面的一样,就只是参数不同而已,形状不同,效果都是碰撞检测,还有下面的胶囊检测也是如此。 

3. 胶囊范围检测 Physics.OverlapCapsule

参数相关:

Collider[] Physics.OverlapCapsule(Vector3 point0,                 // 胶囊体底部球心Vector3 point1,                 // 胶囊体顶部球心float radius,                   // 胶囊半径int layerMask = AllLayers,      // 层级掩码QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal
)

例如:

void CheckCharacterHit()
{// 检测玩家角色碰撞(高度2米,半径0.5米)Vector3 feetPos = transform.position;Vector3 headPos = feetPos + Vector3.up * 2;float charRadius = 0.5f;int playerLayer = LayerMask.GetMask("Player");Collider[] hits = Physics.OverlapCapsule(feetPos,headPos,charRadius,playerLayer);if (hits.Length > 0){Debug.Log("Player character hit detected!");}
}

         上面的三个API只是最基本的范围检测,他们还有好兄弟。你不需要将返回值碰撞器数组存下来,可以直接在外部创建一个数组,然后装入这个数组中即可:

4. 盒状检测 NonAlloc 版

int Physics.OverlapBoxNonAlloc(Vector3 center,                 // 盒子中心点Vector3 halfExtents,            // 盒子半尺寸(长/宽/高各一半)Collider[] results,             // 结果存储数组(预分配)Quaternion orientation = Quaternion.identity, // 旋转角度int layerMask = AllLayers,      // 层级掩码QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal
)

返回值:实际检测到的碰撞器数量(非数组长度) 

5. 球形检测 NonAlloc 版

int Physics.OverlapSphereNonAlloc(Vector3 position,               // 球心位置float radius,                   // 球体半径Collider[] results,             // 结果存储数组int layerMask = AllLayers,      // 层级掩码QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal
)

返回值:实际检测到的碰撞器数量 

6. 胶囊检测 NonAlloc 版

int Physics.OverlapCapsuleNonAlloc(Vector3 point0,                 // 胶囊底部球心Vector3 point1,                 // 胶囊顶部球心float radius,                   // 胶囊半径Collider[] results,             // 结果存储数组int layerMask = AllLayers,      // 层级掩码QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal
)

返回值:实际检测到的碰撞器数量

使用手段都是和前三个差不多的

NonAlloc 方法核心优势

特性基础方法 (OverlapX)NonAlloc 方法 (OverlapXNonAlloc)
内存分配每次调用创建新数组使用预分配数组,无GC开销
性能影响高频调用导致GC压力零内存分配,性能稳定
使用场景低频/单次检测高频检测(如Update中)
返回值Collider[] 数组int (实际检测数量)

二、关于API中的两个重点参数

QueryTriggerInteraction 参数详解 

QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal 是 Unity 物理检测 API 中的一个重要参数,用于控制物理检测如何处理触发器(Trigger)。实际上一般默认的就OK

这个参数决定了在物理检测(如范围检测、射线检测等)中是否应该包括触发器碰撞器:

  1. 控制检测行为:指定是否将触发器视为有效的碰撞对象

  2. 避免意外结果:防止触发器干扰正常的物理检测逻辑

  3. 灵活配置:可以覆盖项目的全局设置

1. QueryTriggerInteraction.UseGlobal

行为:使用项目的全局物理设置
说明:检测行为取决于 "Edit > Project Settings > Physics" 中的 "Queries Hit Triggers" 设置

推荐场景:
希望检测行为与项目全局设置保持一致时
不特别关注触发器处理方式时

2. QueryTriggerInteraction.Collide

行为:包含触发器在检测结果中
说明:无论项目全局设置如何,本次检测都会将触发器视为有效碰撞体

推荐场景:
需要检测区域触发器时(如进入安全区、收集区域)
需要响应触发器事件时

3. QueryTriggerInteraction.Ignore

行为:忽略所有触发器
说明:无论项目全局设置如何,本次检测都会跳过所有触发器

推荐场景:
只关心实体碰撞时(如攻击检测、物理碰撞)
避免触发器干扰检测结果时

示例:不同参数的效果

注: :这种写法叫做可选参数。

// 检测所有碰撞体(包括普通碰撞器和触发器)
Collider[] allHits = Physics.OverlapSphere(position: transform.position,radius: 5f,layerMask: LayerMask.GetMask("Enemy", "Trap", "SafeZone"),queryTriggerInteraction: QueryTriggerInteraction.Collide
);
// 结果:包含敌人、陷阱区域、安全区// 只检测实体碰撞体(忽略所有触发器)
Collider[] physicalHits = Physics.OverlapSphere(position: transform.position,radius: 5f,layerMask: LayerMask.GetMask("Enemy", "Trap", "SafeZone"),queryTriggerInteraction: QueryTriggerInteraction.Ignore
);
// 结果:只包含敌人(陷阱区域和安全区是触发器,被忽略)// 使用全局设置检测
Collider[] globalSettingHits = Physics.OverlapSphere(position: transform.position,radius: 5f,layerMask: LayerMask.GetMask("Enemy", "Trap", "SafeZone"),queryTriggerInteraction: QueryTriggerInteraction.UseGlobal
);
// 结果:取决于项目设置中的"Queries Hit Triggers"选项

LayerMask 在范围检测中的深度解析

LayerMask 核心概念

1. 层级系统基础

Unity 提供 32 个层级(0-31)
每个游戏对象分配到一个层级
层级用于逻辑分组(如:玩家、敌人、环境、UI等)

2. LayerMask 本质

32 位位掩码(bitmask)
每个位对应一个层级(1=包含,0=排除)
示例:00000000 00000000 00000000 00000101 表示包含第0层和第2层

可以在这里进行创建层级

通过代码来获取层级:

// 单层级
int enemyLayer = LayerMask.NameToLayer("Enemy");
LayerMask enemyMask = 1 << enemyLayer;// 多层级组合
LayerMask enemyAndObstacleMask = (1 << LayerMask.NameToLayer("Enemy")) | (1 << LayerMask.NameToLayer("Obstacle"));// 排除特定层
LayerMask allExceptUI = ~(1 << LayerMask.NameToLayer("UI"));//或者
// 包含多个层级
LayerMask mask = LayerMask.GetMask("Enemy", "Projectile", "Destructible");// 等效于:
// (1 << LayerMask.NameToLayer("Enemy")) |
// (1 << LayerMask.NameToLayer("Projectile")) |
// (1 << LayerMask.NameToLayer("Destructible"))

接下来咱们讲讲为什么它会这么进行设计,和如何进行层级的选择,合并,排除。

        因为位运算很快,而且非常的适合做状态合并与排除。你只需要将对应位置的数置0即排除,置1就合并了。利用,位与,位或进行操作。 

层级选择:精准定位目标层

基础选择方法

// 选择单个层级
LayerMask enemyMask = 1 << LayerMask.NameToLayer("Enemy");// 选择多个层级
LayerMask combatMask = (1 << LayerMask.NameToLayer("Enemy")) | (1 << LayerMask.NameToLayer("Boss"));

高级选择方式

// 使用 GetMask 更简洁
LayerMask environmentMask = LayerMask.GetMask("Ground", "Water", "Wall");

 层级合并:组合检测

基本合并技巧

// 创建基础掩码
LayerMask baseMask = LayerMask.GetMask("Player", "Enemy");// 动态添加层级
void AddLayerToMask(ref LayerMask mask, string layerName)
{int layer = LayerMask.NameToLayer(layerName);if (layer != -1) {mask |= (1 << layer);  // 按位或操作}
}// 使用
AddLayerToMask(ref baseMask, "Projectile");

多掩码组合

// 定义不同类别的掩码
LayerMask characterMask = LayerMask.GetMask("Player", "NPC", "Enemy");
LayerMask environmentMask = LayerMask.GetMask("Ground", "Wall", "Water");
LayerMask interactableMask = LayerMask.GetMask("Chest", "Door", "Lever");// 组合掩码
LayerMask fullDetectionMask = characterMask | environmentMask | interactableMask;

层级排除:精准过滤 

// 所有层
LayerMask allLayers = ~0; // 或 Physics.AllLayers// 排除 UI 层
int uiLayer = LayerMask.NameToLayer("UI");
LayerMask noUIMask = allLayers & ~(1 << uiLayer);// 排除多个层
int ignoreLayer1 = LayerMask.NameToLayer("IgnoreRaycast");
int ignoreLayer2 = LayerMask.NameToLayer("Water");
LayerMask filteredMask = allLayers & ~((1 << ignoreLayer1) | (1 << ignoreLayer2));

假设你要排除的层级:00000000 00000000 00000000 00001001

取反后                         11111111   11111111   11111111   11110110

全层级                         11111111   11111111   11111111   11111111

相与后,便排除了指定层级

常见错误:

1. 层名拼写错误(静默失败)

// 错误:层名拼错无提示
LayerMask mask = 1 << LayerMask.NameToLayer("Enemi"); // 返回 -1// 解决方案:验证层名
int GetLayerSafe(string layerName)
{int layer = LayerMask.NameToLayer(layerName);if (layer == -1){Debug.LogError($"Layer '{layerName}' does not exist!");return 0; // 默认层}return layer;
}

2. 位运算优先级错误

// 错误:运算优先级问题
LayerMask wrongMask = 1 << 8 | 1 << 9; // 实际是 (1 << 8) | (9)!// 正确:使用括号明确优先级
LayerMask correctMask = (1 << 8) | (1 << 9);

3. 掩码值为0(不检测任何层)

// 常见于动态构建掩码失败
LayerMask emptyMask = 0; // 不检测任何层// 防护:添加默认层
if (mask == 0)
{mask = 1 << 0; // 至少包含默认层Debug.LogWarning("Empty layer mask, using default layer");
}

4. 混淆层索引和掩码值 这个最常见

// 错误:传入层索引而非掩码
int enemyLayer = LayerMask.NameToLayer("Enemy");
Physics.Raycast(..., enemyLayer); // 应该传入 1 << enemyLayer// 正确:始终使用位掩码
Physics.Raycast(..., 1 << enemyLayer);

三、总结

 基本范围检测函数
函数名返回值核心功能
Physics.OverlapBoxCollider[]检测盒状区域内的碰撞器
Physics.OverlapSphereCollider[]检测球形区域内的碰撞器
Physics.OverlapCapsuleCollider[]检测胶囊区域内的碰撞器
高效 NonAlloc 版本
函数名返回值核心优势
Physics.OverlapBoxNonAllocint零GC分配,适合高频调用
Physics.OverlapSphereNonAllocint预分配数组,性能稳定
Physics.OverlapCapsuleNonAllocint返回实际碰撞数量而非数组

 关键参数详解表

通用参数(所有检测函数)
参数名类型说明
layerMaskint层级掩码(位运算值),决定检测哪些层
queryTriggerInteractionenum触发器处理方式:
UseGlobal-用项目设置
Collide-包含触发器
Ignore-忽略触发器
盒状检测特有参数
参数名类型说明注意事项
centerVector3盒子中心点(世界坐标)
halfExtentsVector3三边尺寸的一半​(非全尺寸)例:2x2x2盒子需传入(1,1,1)
orientationQuaternion盒子的旋转角度默认Quaternion.identity
球形检测特有参数
参数名类型说明
positionVector3球心位置(世界坐标)
radiusfloat球体半径
胶囊检测特有参数
参数名类型说明
point0Vector3胶囊底部球心(世界坐标)
point1Vector3胶囊顶部球心(世界坐标)
radiusfloat胶囊半径
NonAlloc 版本特有参数
参数名类型说明
resultsCollider[]预分配的碰撞器数组(避免GC分配)

 LayerMask 操作指南

操作类型代码示例说明
单层选择1 << LayerMask.NameToLayer("Enemy")位左移构建掩码
多层合并LayerMask.GetMask("Enemy", "Boss")官方推荐的多层获取方式
动态添加层`mask= (1 << LayerMask.NameToLayer("Projectile"))`
排除特定层LayerMask filteredMask = ~0 & ~(1 << LayerMask.NameToLayer("UI"))取反+位与实现层排除
所有层Physics.AllLayers 或 ~032位全1掩码

 高频错误及解决方案

错误类型错误示例正确写法解决方案
层名拼写错误NameToLayer("Enemi")验证层名是否存在添加层名检查逻辑
位运算优先级错误`1 << 81 << 9``(1 << 8)
空掩码LayerMask mask = 0添加默认层兜底mask = mask==0 ? 1<<0 : mask
混淆层索引与掩码Physics.Raycast(..., enemyLayer)Physics.Raycast(..., 1<<enemyLayer)始终使用位掩码格式
盒状尺寸参数错误OverlapBox(center, fullSize, ...)OverlapBox(center, fullSize/2, ...)牢记用半长尺寸

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建安全高效的邮件网关ngx_mail_ssl_module

一、快速上手&#xff1a;最小配置示例 worker_processes auto;mail {server {# 监听 IMAP over TLSlisten 993 ssl;protocol imap;# TLS 协议与密码套件ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;# 证书与私钥ssl_…

打卡day41

知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 → Batch归一化层…

MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】

本文将深入探讨 MySQL 高级查询技巧&#xff0c;重点讲解 GROUP BY、HAVING、各种聚合函数、子查询以及分页查询&#xff08;LIMIT 语法&#xff09;的使用。文章内容涵盖实际应用中最常见的报表需求和分页实现技巧&#xff0c;适合有一定 SQL 基础的开发者进一步提升技能。 一…

现代 CSS 高阶技巧:实现平滑内凹圆角的工程化实践

通过 数学计算 CSS mask 复合遮罩 实现的真正几何内凹效果&#xff1a; 背景是一张图片&#xff0c;用来证明中间的凹陷是透明的。 完整代码&#xff1a; app.js import FormPage from "./pages/formPage"; import "./App.css"; const App () > {re…

Qt不同布局添加不同控件

对于这种 不同布局添加不同控件 的情况,可以采用以下几种简化方法: 方法 1:使用 std::pair 或 std::tuple 配对(C++17 推荐) for (auto [layout, widget] : {std::pair{m_layoutMistakeCalibrate,

MySQL 事务解析

1. 事务简介 事务&#xff08;Transaction&#xff09; 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 经典案例&#xff1…

PyTorch中 torch.utils.data.DataLoader 的详细解析和读取点云数据示例

一、DataLoader 是什么&#xff1f; torch.utils.data.DataLoader 是 PyTorch 中用于加载数据的核心接口&#xff0c;它支持&#xff1a; 批量读取&#xff08;batch&#xff09;数据打乱&#xff08;shuffle&#xff09;多线程并行加载&#xff08;num_workers&#xff09;自…

在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.4,运行demo,显示label

在MDK中自动部署LVGL&#xff0c;在stm32f407ZGT6移植LVGL-8.4 一、硬件平台二、实现功能三、移植步骤1、下载LVGL-8.42、MDK中安装LVGL-8.43、配置RTE4、配置头文件 lv_conf_cmsis.h5、配置lv_port_disp_template 四、添加心跳相关文件1、在STM32CubeMX中配置TIM7的参数2、使能…

德思特新闻 | 德思特与es:saar正式建立合作伙伴关系

德思特新闻 2025年5月9日&#xff0c;德思特科技有限公司&#xff08;以下简称“德思特”&#xff09;与德国嵌入式系统专家es:saar GmbH正式达成合作伙伴关系。此次合作旨在将 es:saar 的先进嵌入式开发与测试工具引入中国及亚太市场&#xff0c;助力本地客户提升产品开发效率…

fork函数小解

学了好久终于搞懂fork函数的一些作用 1. fork函数作用&#xff1a;用于创建新的子进程 这是fork最根本的功能&#xff0c;在父进程里创建新的子进程、 但是创建新的子进程之后呢&#xff1f; 子进程和父进程的关系是什么样的&#xff1f; 为什么fork得到的子进程返回值为0&am…

opencv(C++) 变换图像与形态学操作

文章目录 使用腐蚀和膨胀图像形态滤波器实现案例使用形态学滤波器对图像进行开运算和闭运算实现案例在灰度图像上应用形态学操作算子形态学梯度(Morphological Gradient)黑帽变换(Black-hat Transform)使用分水岭算法进行图像分割使用 MSER 提取显著区域MSER 检测与可视化使…

测试工程师学LangChain之promptTemplate 实战笔记

一、引言:大模型时代的测试自动化革命 2025 年,随着大模型(如 DeepSeek)在自动化测试领域的广泛应用,Prompt 编写已成为测试工程师的核心技能之一。 为什么? 大模型输出的质量 90% 取决于输入的 PromptLangChain 的 PromptTemplate 提供了参数化 Prompt 的标准化方案Ope…

CP2K 软件介绍与使用指南

CP2K 软件介绍与使用指南 一、CP2K简介 CP2K是一款开源的量子化学和固态物理模拟软件包&#xff0c;主要用于原子尺度模拟&#xff0c;特别擅长以下领域&#xff1a; 第一性原理计算&#xff1a;基于密度泛函理论(DFT)的电子结构计算分子动力学(MD)&#xff1a;包括从头算分…

npm、pnpm、yarn使用以及区别

npm 使用 安装包&#xff1a;在项目目录下&#xff0c;npm install <包名> 用于本地安装包到 node_modules 目录&#xff0c;并添加到 package.json 的 dependencies 中&#xff1b;npm install -g <包名> 用于全局安装&#xff0c;适用于命令行工具等。初始化项目…

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析 一、流量分析 题目没有任何提示,附件gzl.pcap 解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1 测试链接…

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【六】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

React 项目中封装 Excel 导入导出组件:技术分享与实践

文章目录 前言一、为什么需要封装 Excel 组件&#xff1f;二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 &#xff08;UploadExcel&#xff09; 总结 前言 在 React 项目中&#xff0c;处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…

RustDesk 搭建自建服务器并设置服务自启动

目录 0. 介绍 1. 事前准备 1.1 有公网 ip 的云服务器一台 1.2 服务端部署包 1.3 客户端安装包 2. 部署 2.1 服务器环境准备 2.2 上传服务端部署包 2.3 运行 pm2 3. 客户端使用 3.1 安装 3.2 配置 3.2.1 解锁网络设置 3.2.2 ID / 中级服务器 3.3 启动效果 > …

基于Qt封装数据库基本增删改查操作,支持多线程,并实现SQLite数据库单例访问

抽出来的&#xff0c;直接用就行 头文件CPP文件使用示例 头文件 #ifndef DATABASECOMMON_H #define DATABASECOMMON_H/** 单例封装SQLite通用操作&#xff0c;支持多线程调用&#xff1b;可扩展兼容其他数据库&#xff0c;照着SysRunDatabase写&#xff0c;并且重载openDataba…

AI笔记 - 网络模型 - mobileNet

网络模型 mobileNet mobileNet V1网络结构深度可分离卷积空间可分![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/aff06377feac40b787cfc882be7c6e5d.png) 参考 mobileNet V1 网络结构 MobileNetV1可以理解为VGG中的标准卷积层换成深度可分离卷积 可分离卷积主要有…