【unity游戲開發——編輯器擴展】AssetDatabase公共類在編輯器環境中管理和操作項目中的資源

注意:考慮到編輯器擴展的內容比較多,我將編輯器擴展的內容分開,并全部整合放在【unity游戲開發——編輯器擴展】專欄里,感興趣的小伙伴可以前往逐一查看學習。

文章目錄

  • 前言
  • 一、AssetDatabase常用API
    • 1、創建資源
      • 1.1 API
      • 1.2 示例
    • 2、創建文件夾
      • 2.1 API
      • 2.2 示例
    • 3、拷貝資源
      • 3.1 API
      • 3.2 示例
    • 4、移動資源
      • 4.1 API
      • 4.2 示例
    • 5、刪除資源
      • 5.1 API
      • 5.2 示例
    • 6、批量刪除資源
      • 6.1 API
      • 6.2 示例
    • 7、獲取資源路徑
      • 7.1 API
      • 7.2 示例
    • 8、根據路徑加載資源
      • 8.1 API
      • 8.2 示例
    • 9、刷新項目資源
      • 9.1 API
      • 9.2 示例
    • 10、返回資源所屬的AB包名
      • 10.1 API
      • 10.2 示例
  • 二、最終代碼
  • 專欄推薦
  • 完結

前言

AssetDatabase公共類是 Unity 引擎中的一個編輯器類,用于在編輯器環境中管理和操作項目中的資源(Assets)。它提供了一系列靜態方法,使得開發者能夠在編輯器腳本中進行資源的創建、拷貝、移動、刪除等操作。

官方文檔:AssetDatabase

一、AssetDatabase常用API

1、創建資源

1.1 API

我們可以通過代碼動態創建一些資源

AssetDatabase.CreateAsset(資源,路徑);

注意

  • 路徑從 Assets/...開始
  • 不能在StreamingAssets中創建資源,
  • 不能創建預設體
  • 只能創建資源相關,例如材質球等
  • 路徑需要寫后綴

1.2 示例

using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 創建資源按鈕if (GUILayout.Button("創建資源")){// 創建一個材質,使用URP的Lit著色器Material mat = new Material(Shader.Find("Universal Render Pipeline/Lit"));// 將材質保存為Assets/Resources/TestURPLitMaterial.matAssetDatabase.CreateAsset(mat, "Assets/Resources/TestURPLitMaterial.mat");}}
}

效果
在這里插入圖片描述

2、創建文件夾

2.1 API

AssetDatabase.CreateFolder(父文件夾路徑,新文件夾名)

注意

  • 父文件夾路徑從 Assets/...開始

2.2 示例

using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 創建文件夾按鈕if (GUILayout.Button("創建文件夾")){// 在Assets/Resources下創建一個名為MyTestFolder的文件夾AssetDatabase.CreateFolder("Assets/Resources", "MyTestFolder");}}
}

效果
在這里插入圖片描述

3、拷貝資源

3.1 API

AssetDatabase.CopyAsset(源資源路徑,目標路徑)

注意

  • 需要寫后綴名
  • 路徑從 Assets/...開始

3.2 示例

using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 拷貝資源按鈕if (GUILayout.Button("拷貝資源")){// 將Assets/Resources/TestURPLitMaterial.mat拷貝到Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.matAssetDatabase.CopyAsset("Assets/Resources/TestURPLitMaterial.mat", "Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat");}}
}

效果
在這里插入圖片描述

4、移動資源

4.1 API

AssetDatabase.MoveAsset(老路徑, 新路徑);

注意

  • 路徑從 Assets/...開始

4.2 示例

using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 移動資源按鈕if (GUILayout.Button("移動資源")){// 將Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat移動到Assets/Resources/TestURPLitMaterialCopy.matAssetDatabase.MoveAsset("Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat","Assets/Resources/TestURPLitMaterialCopy.mat");}}
}

在這里插入圖片描述

5、刪除資源

5.1 API

AssetDatabase.DeleteAsset(資源路徑)

注意

  • 路徑從 Assets/...開始

5.2 示例

using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 刪除資源按鈕if (GUILayout.Button("刪除資源")){// Assets/Resources/TestURPLitMaterialCopy.matAssetDatabase.DeleteAsset("Assets/Resources/TestURPLitMaterialCopy.mat");}}
}

效果
在這里插入圖片描述

6、批量刪除資源

6.1 API

AssetDatabase.DeleteAssets(string[] 路徑們, List<string> 用于存儲刪除失敗的路徑)

注意

  • 路徑從 Assets/...開始

6.2 示例

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 批量刪除資源按鈕if (GUILayout.Button("批量刪除資源")){// 創建一個列表,用于存儲刪除失敗的資源List<string> failList = new List<string>();// 批量刪除Assets/Resources/TestURPLitMaterial.mat和Assets/Resources/TestURPLitMaterial2.matAssetDatabase.DeleteAssets(new string[] { "Assets/Resources/TestURPLitMaterial.mat", "Assets/Resources/TestURPLitMaterial2.mat" }, failList);// 遍歷刪除失敗的資源列表,并輸出到控制臺for (int i = 0; i < failList.Count; i++){Debug.Log(failList[i]);}}}
}

效果
在這里插入圖片描述

7、獲取資源路徑

7.1 API

AssetDatabase.GetAssetPath(資源)

注意

  • 可以配合Selection選中資源一起使用

7.2 示例

using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 獲取資源路徑按鈕if (GUILayout.Button("獲取資源路徑")){// 輸出當前選中的資源的路徑Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));}}
}

效果
在這里插入圖片描述

8、根據路徑加載資源

8.1 API

AssetDatabase.LoadAssetAtPath(資源路徑) 

注意

  • 路徑從Assets/...開始

8.2 示例

using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 加載資源按鈕if (GUILayout.Button("加載資源")){// 加載Assets/測試文件.txt,并輸出其名稱TextAsset txt = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/測試文件.txt");Debug.Log(txt.name);}}
}

效果
在這里插入圖片描述

9、刷新項目資源

9.1 API

AssetDatabase.Refresh()是Unity編輯器API中的一個重要方法,用于刷新項目資源數據庫。當你在Unity項目文件夾中添加、刪除或修改資源文件時,這個方法可以確保Unity編輯器能夠識別這些更改。

AssetDatabase.Refresh()

Unity通常會自動在適當時候調用刷新,但有時需要手動觸發。比如當你通過代碼創建或修改了資源文件,需要執行刷新,我們才能在Project窗口中顯示最新的內容,否則每次都需要手動調用ctrl+R刷新,這個API其實就是幫我們省略手動刷新這一步。

9.2 示例

using System.IO;
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 創建文件并刷新資源按鈕if (GUILayout.Button("創建文件并刷新資源")){// 創建文件時,如果不使用Unity相關API的話,需要調用刷新,才能在Project窗口中顯示File.WriteAllText(Application.dataPath + "/Resources/test2.txt", "內容內容內容");AssetDatabase.Refresh();}}
}

效果
在這里插入圖片描述

10、返回資源所屬的AB包名

10.1 API

string bundleName = AssetDatabase.GetImplicitAssetBundleName(資源路徑);

注意

  • 路徑從Assets/...開始
  • 返回該資源隱式關聯的AssetBundle名稱(如果有的話)
  • 如果資源沒有被分配到任何AssetBundle,返回空字符串(“”)

10.2 示例

using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 返回資源所屬的AB包名按鈕if (GUILayout.Button("返回資源所屬的AB包名")){string assetPath = "Assets/Resources/MyPrefab.prefab";string bundleName = AssetDatabase.GetImplicitAssetBundleName(assetPath);if (!string.IsNullOrEmpty(bundleName)){Debug.Log($"資源 {assetPath} 屬于AssetBundle: {bundleName}");}else{Debug.Log($"資源 {assetPath} 不屬于任何AssetBundle");}}}
}

效果
在這里插入圖片描述

二、最終代碼

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;public class TestAssetDatabaseEditorWindow : EditorWindow
{[MenuItem("編輯器拓展/自定義窗口拓展/AssetDatabase窗口拓展")]private static void OpenWindow(){TestAssetDatabaseEditorWindow win = EditorWindow.GetWindow<TestAssetDatabaseEditorWindow>();win.Show();}private void OnGUI(){// 創建資源按鈕if (GUILayout.Button("創建資源")){// 創建一個材質,使用URP的Lit著色器Material mat = new Material(Shader.Find("Universal Render Pipeline/Lit"));// 將材質保存為Assets/Resources/TestURPLitMaterial.matAssetDatabase.CreateAsset(mat, "Assets/Resources/TestURPLitMaterial.mat");}// 創建文件夾按鈕if (GUILayout.Button("創建文件夾")){// 在Assets/Resources下創建一個名為MyTestFolder的文件夾AssetDatabase.CreateFolder("Assets/Resources", "MyTestFolder");}// 拷貝資源按鈕if (GUILayout.Button("拷貝資源")){// 將Assets/Resources/TestURPLitMaterial.mat拷貝到Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.matAssetDatabase.CopyAsset("Assets/Resources/TestURPLitMaterial.mat", "Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat");}// 移動資源按鈕if (GUILayout.Button("移動資源")){// 將Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat移動到Assets/Resources/TestURPLitMaterialCopy.matAssetDatabase.MoveAsset("Assets/Resources/MyTestFolder/TestURPLitMaterialCopy.mat","Assets/Resources/TestURPLitMaterialCopy.mat");}// 刪除資源按鈕if (GUILayout.Button("刪除資源")){// Assets/Resources/TestURPLitMaterialCopy.matAssetDatabase.DeleteAsset("Assets/Resources/TestURPLitMaterialCopy.mat");}// 批量刪除資源按鈕if (GUILayout.Button("批量刪除資源")){// 創建一個列表,用于存儲刪除失敗的資源List<string> failList = new List<string>();// 批量刪除Assets/Resources/TestURPLitMaterial.mat和Assets/Resources/TestURPLitMaterial2.matAssetDatabase.DeleteAssets(new string[] { "Assets/Resources/TestURPLitMaterial.mat", "Assets/Resources/TestURPLitMaterial2.mat" }, failList);// 遍歷刪除失敗的資源列表,并輸出到控制臺for (int i = 0; i < failList.Count; i++){Debug.Log(failList[i]);} }// 獲取資源路徑按鈕if (GUILayout.Button("獲取資源路徑")){// 輸出當前選中的資源的路徑Debug.Log(AssetDatabase.GetAssetPath(Selection.activeObject));}// 加載資源按鈕if (GUILayout.Button("加載資源")){// 加載Assets/測試文件.txt,并輸出其名稱TextAsset txt = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/測試文件.txt");Debug.Log(txt.name);}// 創建文件并刷新資源按鈕if (GUILayout.Button("創建文件并刷新資源")){// 創建文件時,如果不使用Unity相關API的話,需要調用刷新,才能在Project窗口中顯示File.WriteAllText(Application.dataPath + "/Resources/test2.txt", "內容內容內容");AssetDatabase.Refresh();}// 返回資源所屬的AB包名按鈕if (GUILayout.Button("返回資源所屬的AB包名")){string assetPath = "Assets/Resources/MyPrefab.prefab";string bundleName = AssetDatabase.GetImplicitAssetBundleName(assetPath);if (!string.IsNullOrEmpty(bundleName)){Debug.Log($"資源 {assetPath} 屬于AssetBundle: {bundleName}");}else{Debug.Log($"資源 {assetPath} 不屬于任何AssetBundle");}}}
}

專欄推薦

地址
【unity游戲開發入門到精通——C#篇】
【unity游戲開發入門到精通——unity通用篇】
【unity游戲開發入門到精通——unity3D篇】
【unity游戲開發入門到精通——unity2D篇】
【unity實戰】
【制作100個Unity游戲】
【推薦100個unity插件】
【實現100個unity特效】
【unity框架/工具集開發】
【unity游戲開發——模型篇】
【unity游戲開發——InputSystem】
【unity游戲開發——Animator動畫】
【unity游戲開發——UGUI】
【unity游戲開發——聯網篇】
【unity游戲開發——優化篇】
【unity游戲開發——shader篇】
【unity游戲開發——編輯器擴展】

完結

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果學習過程中遇到任何問題,也歡迎你評論私信找我。

贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注,你的每一次支持都是我不斷創作的最大動力。當然如果你發現了文章中存在錯誤或者有更好的解決方法,也歡迎評論私信告訴我哦!
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907837.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907837.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907837.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

css實現文字漸變

在前端開發中&#xff0c;給文字設置漸變色是完全可以實現的&#xff0c;常用的方式是結合 CSS 的 background、-webkit-background-clip 和 -webkit-text-fill-color 屬性。下面是一個常見的實現方法&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> …

WSL 開發環境搭建指南:Java 11 + 中間件全家桶安裝實戰

在WSL&#xff08;Windows Subsystem for Linux&#xff09;環境下一站式安裝開發常用工具&#xff0c;能極大提升工作效率。接下來我將分步為你介紹如何在WSL中安裝Java 11、Maven、Redis、MySQL、Nacos、RabbitMQ、RocketMQ、Elasticsearch&#xff08;ES&#xff09;和Node.…

vue3: baidusubway using typescript

項目結構&#xff1a; <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地圖容器 --><div id"subway-container…

【iptables防火墻】-- URL過濾 (Hexstring、IP、DoT和DoH)

在路由器中使用iptables工具對URL地址進行過濾涉及到如下幾個方面&#xff0c;hexstring、ip、DoT和DoH。 以過濾www.baidu.com為例 1、DNS阻斷 m string --hex-string是iptables中一個以?十六進制格式?定義要匹配的二進制特征并且支持混合明文和二進制數據的模塊。由于DN…

mysql-本地編譯 MySQL 源碼

完全理解你的感受&#xff01;MySQL 源碼本地調試確實是一個“坑多”的過程&#xff0c;尤其是當你第一次嘗試從源碼構建和調試 MySQL 時。但別擔心&#xff0c;我來一步步幫你梳理整個流程&#xff0c;并提供一個詳細、可操作的指南&#xff0c;讓你可以順利跑起來 MySQL 源碼…

深入理解 shared_ptr 與 enable_shared_from_this

在 C++ 的智能指針體系中,std::shared_ptr 是一個非常重要的工具,它通過引用計數機制幫助我們管理動態分配的對象生命周期,避免內存泄漏。然而,在某些情況下,我們可能需要從一個對象內部獲取指向自身的 shared_ptr,這時候就需要使用 std::enable_shared_from_this 這個輔…

通義開源視覺感知多模態 RAG 推理框架 VRAG-RL:開啟多模態推理新時代

通義實驗室的自然語言智能團隊&#xff0c;憑借深厚的技術積累與創新精神&#xff0c;成功研發并開源了視覺感知多模態 RAG 推理框架 VRAG-RL&#xff0c;為 AI 在復雜視覺信息處理領域帶來了重大突破。 傳統 RAG 方法的局限 傳統的檢索增強型生成&#xff08;RAG&#xff0…

【iOS】方法交換

方法交換 method-swizzling是什么相關API方法交換的風險method-swizzling使用過程中的一次性問題在當前類中進行方法交換類方法的方法交換 方法交換的應用 method-swizzling是什么 method-swizzling的含義是方法交換&#xff0c;他的主要作用是在運行的時候將一個方法的實現替…

Python - 爬蟲;Scrapy框架之插件Extensions(四)

閱讀本文前先參考 https://blog.csdn.net/MinggeQingchun/article/details/145904572 在 Scrapy 中&#xff0c;擴展&#xff08;Extensions&#xff09;是一種插件&#xff0c;允許你添加額外的功能到你的爬蟲項目中。這些擴展可以在項目的不同階段執行&#xff0c;比如啟動…

95套HTML高端大數據可視化大屏源碼分享

概述?? 在大數據時代&#xff0c;數據可視化已成為各行各業的重要需求。這里精心整理了95套高端HTML大數據可視化大屏源碼&#xff0c;這些資源采用現代化設計風格&#xff0c;可幫助開發者快速構建專業的數據展示界面。 ??主要內容?? ??1. 設計風格與特點?? 采用…

redis未授權(CVE-2022-0543)

概述 Redis 默認綁定在 0.0.0.0:6379&#xff0c;在未配置防火墻或訪問控制的情況下會將服務暴露在公網上。若未設置訪問密碼&#xff08;默認通常為空&#xff09;&#xff0c;攻擊者可直接未授權訪問 Redis。利用 Redis 提供的 CONFIG 命令&#xff0c;攻擊者可修改配置并將…

(面試)OkHttp實現原理

OkHttp 是一個高效的 HTTP 客戶端&#xff0c;被廣泛應用于 Android 和 Java 應用中。它提供了許多強大的特性&#xff0c;例如連接池、透明的 GZIP 壓縮、HTTP/2 支持等。理解 OkHttp 的實現原理有助于更好地使用和調試它。 以下是 OkHttp 的一些核心實現原理&#xff1a; 1…

Netty 實戰篇:構建簡易注冊中心,實現服務發現與調用路由

本文將為前面構建的輕量級 RPC 框架添加“服務注冊與發現”功能&#xff0c;支持多服務節點動態上線、自動感知與調用路由&#xff0c;為構建真正可擴展的分布式系統打好基礎。 一、背景&#xff1a;為什么需要注冊中心&#xff1f; 如果每個客戶端都硬編碼連接某個 IP/端口的…

c++之分支

深入理解 C 分支結構&#xff1a;從基礎到實戰 在 C 編程的世界里&#xff0c;分支結構是控制程序流程的重要手段&#xff0c;它賦予程序 “思考” 和 “選擇” 的能力&#xff0c;讓程序能夠根據不同的條件執行不同的代碼塊。本文將帶大家深入探索 C 分支結構&#xff0c;結合…

LLMs之MCP:如何使用 Gradio 構建 MCP 服務器

LLMs之MCP&#xff1a;如何使用 Gradio 構建 MCP 服務器 導讀&#xff1a;本文詳細介紹了如何使用Gradio構建MCP服務器&#xff0c;包括前提條件、構建方法、關鍵特性和相關資源。通過一個簡單的字母計數示例&#xff0c;演示了如何將Gradio應用轉換為LLM可以使用的工具。Gradi…

ubuntu20.04.5-arm64版安裝robotjs

ubuntu20.04.5arm上使用robotjs #ssh&#xff0c;可選 sudo apt update sudo apt install openssh-server sudo systemctl status ssh sudo systemctl enable ssh sudo systemctl enable --now ssh #防火墻相關&#xff0c;可選 sudo ufw allow ssh sudo ufw allow 2222/tc…

craw4ai 抓取實時信息,與 mt4外行行情結合實時交易,基本面來覺得趨勢方向,搞一個外匯交易策略

結合實時信息抓取、MT4行情數據、基本面分析的外匯交易策略框架&#xff0c;旨在通過多維度數據融合提升交易決策質量&#xff1a;行不行不知道先試試&#xff0c;理論是對的&#xff0c;只要基本面方向沒錯 策略名稱&#xff1a;Tri-Sync 外匯交易系統 核心理念 「基本面定方…

Python中scapy庫詳細使用(強大的交互式數據包操作程序和庫)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、scapy概述1.1 scapy介紹1.2 安裝1.3 交互模式1.4 安全注意事項二、基本使用2.1 數據包構造基礎2.2 數據包發送2.3 數據包嗅探2.4 數據包分析與操作2.5 網絡掃描技術2.6 協議實現示例三、高級功能3.1 數據包重放3.2 …

基于Web的瀕危野生動物保護信息管理系統設計(源碼+定制+開發)瀕危野生動物監測與保護平臺開發 面向公眾參與的野生動物保護與預警信息系統

博主介紹&#xff1a; ?我是阿龍&#xff0c;一名專注于Java技術領域的程序員&#xff0c;全網擁有10W粉絲。作為CSDN特邀作者、博客專家、新星計劃導師&#xff0c;我在計算機畢業設計開發方面積累了豐富的經驗。同時&#xff0c;我也是掘金、華為云、阿里云、InfoQ等平臺…

[SAP] 矩陣復制(Matrix Copy)

SAP中的復制粘貼功能被稱為矩陣復制&#xff0c;通過點擊對話框或屏幕&#xff0c;并執行下述命令&#xff0c;使用矩陣復制就可以復制多行文本 ① 按下Ctrl-Y&#xff0c;從左上到右下拖拉鼠標來選擇文本 ② 文本高亮顯示后&#xff0c;按下Ctrl-C ③ 移到新的位置插入文本…