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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83212.shtml
英文地址,請注明出處:http://en.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中的標準卷積層換成深度可分離卷積 可分離卷積主要有…