Unity 读Excel,读取xlsx文件解决方案
Unity读取表格数据
效果:
思路:
Unity可以解析Json,但是读取Excel需要插件的帮助,那就把这个功能分离开,读表插件就只管读表转Json,Unity就只管Json解析,中间需要一个存储空间,使用ScriptableObject数据类是个不错的选择。
缺点也很明显,我们只能在Unity编辑器模式下使用这个工具,也就是无法在打包后读取Excel,不过我们再也不用担心读表插件出问题了,因为打包后根本用不到读表插件。
实现步骤:
- 步骤一:Excel数据转换成Json数据
- 步骤二:将数据存储到ScriptableObject持久类中
- 步骤三:Unity读取ScriptableObject类
Excel数据转换成Json数据
因为只考虑在Unity编辑器模式使用,所以直接写一个编辑器窗口就行了
主要功能概述
- 用户界面(EditorWindow):提供一个界面让用户选择 Excel 文件,并进行相应的操作,如选择是否生成 C# 类文件、开始转换等。
- 文件处理:用户可以拖拽文件或文件夹到指定区域,程序会识别路径并加载 Excel 文件列表。
- 转换操作:Excel 文件被读取,转换为 JSON 数据,并保存到指定路径。
- 打开编辑窗口
[MenuItem("Tools/ExcelToJson")]
public static void ShowWindow()
{ExcelToUnityWindow window = GetWindow<ExcelToUnityWindow>("Excel 转 Json 工具");window.minSize = new Vector2(400 , 300);
}
这段代码创建了一个编辑器窗口,当用户点击 Unity 编辑器菜单中的 “Tools/ExcelToJson” 时,会弹出 ExcelToUnityWindow 窗口。
- 初始化并加载 JsonFileData
private void OnEnable()
{csOutputPath = Path.Combine(Application.dataPath , "Tool/ExcelTool/ConfigData");jsonFileCollector = Resources.Load<JsonFileData>("JsonFileCollector");if (jsonFileCollector == null)Debug.LogError("未找到 JsonFileCollector 实例,请确保已创建该资产文件!");RefreshFileList();
}
OnEnable 方法会在编辑器窗口启用时调用,它会加载 JsonFileCollector 实例,这个实例用于管理 JSON 数据。
- 文件夹路径选择与拖拽支持
private void HandleDragAndDrop(Rect dropArea)
{Event evt = Event.current;if (evt.type == EventType.DragUpdated || evt.type == EventType.DragPerform){if (dropArea.Contains(evt.mousePosition)){DragAndDrop.visualMode = DragAndDropVisualMode.Copy;if (evt.type == EventType.DragPerform){DragAndDrop.AcceptDrag();if (DragAndDrop.paths.Length > 0){string draggedPath = DragAndDrop.paths[0];if (File.Exists(draggedPath) && draggedPath.EndsWith(".xlsx")){folderPath = Path.GetDirectoryName(draggedPath);}else if (Directory.Exists(draggedPath)){folderPath = draggedPath;}RefreshFileList();}evt.Use();}}}
}
这个方法实现了拖拽功能,用户可以将文件或文件夹拖拽到指定区域,程序会检测并更新路径。
- 转换文件的核心操作
private void ConvertExcelFiles()
{foreach (string filePath in selectedExcelFiles){ParseFile(filePath , createCS , csOutputPath);}EditorUtility.DisplayDialog("完成" , "所有 Excel 文件已成功转换!" , "确定");
}
ConvertExcelFiles() 方法会遍历用户选择的 Excel 文件,并调用 ParseFile() 方法来处理每一个文件。这个方法的核心功能是将 Excel 文件转换为 JSON 格式。
- Excel 文件解析与 JSON 转换
private static string ParseFile(string path , bool createCS , string csOutputPath)
{if (!path.EndsWith("xlsx")) return null;string tableName = "";string cfgName = "";Excel excel = null;try{(Excel a, string b) temp = ExcelHelper.LoadExcel(path);excel = temp.a;cfgName = temp.b;StringBuilder sb = new StringBuilder();JsonWriter writer = new JsonWriter(sb);writer.WriteObjectStart();foreach (ExcelTable table in excel.Tables){tableName = table.TableName;if (tableName.StartsWith("#")) continue;if (createCS){try{Debug.Log($"生成 C# 类文件:{csOutputPath}");ExcelDeserializer deserializer = new ExcelDeserializer{FieldNameLine = 1,FieldTypeLine = 2,FieldValueLine = 3,IgnoreSymbol = "#",ModelPath = $"{Application.dataPath}/Tool/ExcelTool/Editor/Excel/ExcelToUnity/DataItem.txt"};deserializer.GenerateCS(table, cfgName, csOutputPath); // 生成 C# 文件}catch (System.Exception ex){Debug.LogError($"生成 C# 类文件时出错: {ex.Message}");return null;}}writer.WritePropertyName("Config");writer.WriteArrayStart();for (int i = 4; i <= table.NumberOfRows; i++){string idStr = table.GetValue(i, 1)?.ToString();if (string.IsNullOrEmpty(idStr)) break;writer.WriteObjectStart();for (int j = 1; j <= table.NumberOfColumns; j++){string propName = table.GetValue(1, j)?.ToString()?.Replace("*", "");string propType = table.GetValue(2, j)?.ToString();if (string.IsNullOrEmpty(propName) || propName.StartsWith("#")) continue;writer.WritePropertyName(propName);string value = table.GetValue(i, j)?.ToString();if (propType == "int"){writer.Write(int.TryParse(value, out int intValue) ? intValue : 0);}else if (propType == "bool"){writer.Write(value == "1" || value.ToLower() == "true");}else if (propType == "float"){writer.Write(float.TryParse(value, out float floatValue) ? floatValue : 0);}else{writer.Write(value);}}writer.WriteObjectEnd();}writer.WriteArrayEnd();}writer.WriteObjectEnd();string outputDir = Path.Combine(Application.streamingAssetsPath, "DataFiles");if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir);string outputPath = Path.Combine(outputDir, Path.GetFileNameWithoutExtension(path) + ".json");File.WriteAllText(outputPath, sb.ToString());Debug.Log("转换成功!路径:" + outputPath);return sb.ToString();}catch (System.Exception ex){Debug.LogError($"转换文件 {path} 时出错: {ex.Message}");return null;}
}
这是处理 Excel 转 JSON 的关键方法。主要流程如下:
- 加载 Excel 文件:使用 ExcelHelper.LoadExcel() 方法加载 Excel 文件。
- 遍历表格:对于每个表格,程序会遍历表格中的行和列,将数据转换成适当类型(int, bool, float, string)。
- 生成 JSON:利用 JsonWriter 将表格中的数据按格式写入 JSON 格式。
- 保存文件:生成的 JSON 数据被保存到 DataFiles 文件夹中。
将数据存储到ScriptableObject持久类中。
准备存储Json数据
[System.Serializable]public class JsonData{[HideInInspector]public string FileName;public string Parent;public string Title;public JsonData(string fileName , string parent , string title){FileName = fileName;Parent = parent;Title = title;}}[System.Serializable]public class ConfigData{public string configName;public int propertyCount;public string data;public ConfigData(string configName , int propertyCount){this.configName = configName;this.propertyCount = propertyCount;}}[Header("JSON 文件信息列表")][Tooltip("每个 JSON 文件的 Json数据")]public List<ConfigData> jsonDataList = new List<ConfigData>();[Tooltip("每个 JSON 文件的 Parent 和 Title 字段")]public List<JsonData> jsonPropertyList = new List<JsonData>();
首先遍历目标路径,查找所有 JSON 文件并解析其内容
public void RefreshJsonFileList()
{jsonDataList.Clear();jsonPropertyList.Clear(); // 清空列表if (!Directory.Exists(dataFilesPath)){Debug.LogError($"目标路径不存在: {dataFilesPath}");return;}string[] files = Directory.GetFiles(dataFilesPath, "*.json");if (files.Length == 0){Debug.LogWarning("未找到任何 JSON 文件.");}foreach (var file in files){string fileName = Path.GetFileNameWithoutExtension(file);int propertyCount = GetJsonFilePropertyCount(file);jsonDataList.Add(new ConfigData(fileName, propertyCount));ReadJsonFile(file, fileName);}Debug.Log($"找到 {jsonDataList.Count} 个 JSON 文件.");
}
- Directory.GetFiles 查找文件夹中的 .json 文件。
- GetJsonFilePropertyCount 获取每个文件中 Config 数组中第一个对象的属性数量。
- ReadJsonFile 解析 JSON 文件,提取 Parent 和 Title 信息。
读取 JSON 文件内容
public void ReadJsonFile(string file, string fileName)
{string jsonContent = File.ReadAllText(file);JObject jsonObject = null;try{jsonObject = JObject.Parse(jsonContent);}catch (System.Exception ex){Debug.LogError($"解析文件失败: {file}, 错误: {ex.Message}");return;}JArray configArray = jsonObject["Config"] as JArray;if (configArray != null){foreach (var configItem in configArray){string parent = configItem["Parent"]?.ToString();string title = configItem["Title"]?.ToString();if (!string.IsNullOrEmpty(parent) && !string.IsNullOrEmpty(title)){jsonPropertyList.Add(new JsonData(fileName, parent, title));}}}
}
- 使用 File.ReadAllText 读取文件内容。
- 通过 JObject.Parse 解析 JSON 字符串。
- 查找 Config 数组中的每个元素,提取 Parent 和 Title,并将其与文件名一起保存为 JsonData 对象。
获取 JSON 文件的属性数量,方便分类
int GetJsonFilePropertyCount(string file)
{string jsonContent = File.ReadAllText(file);JObject jsonObject = null;try{jsonObject = JObject.Parse(jsonContent);}catch (System.Exception ex){Debug.LogError($"解析文件失败: {file}, 错误: {ex.Message}");return 0;}JArray configArray = jsonObject["Config"] as JArray;if (configArray == null || configArray.Count == 0){Debug.LogWarning($"文件 {file} 中没有找到有效的 'Config' 数组。");return 0;}return configArray[0].Children<JProperty>().Count();
}
- 读取 JSON 文件并解析为 JObject。
- 获取 Config 数组的第一个元素,并统计其属性数量。
加载和保存 JSON 数据
- 加载 JSON 数据,GetJsonData() 和 LoadConfig() 方法批量加载 JSON 数据:
public void GetJsonData()
{
#if UNITY_EDITORcfgProgress = 0;string filepath = ConfigManager.GetStreamingAssetsPath();foreach (var item in jsonDataList){string configPath = $"DataFiles/{item.configName}.json";LoadConfig(item, configPath, filepath, jsonDataList.Count);}
#endif
}void LoadConfig(ConfigData configData, string configPath, string filepath, int Count, Action OnConfigLoaded = null)
{
#if UNITY_EDITORstring filePath = Path.Combine(filepath, configPath);try{if (File.Exists(filePath)){string fileContent = File.ReadAllText(filePath);configData.data = fileContent;cfgProgress++;if (cfgProgress == Count){OnConfigLoaded?.Invoke();}}else{Debug.LogError($"文件不存在: {filePath}");}}catch (Exception ex){Debug.LogError($"加载配置表时发生错误: {ex.Message}");}
#endif
}
- 保存实例
public void SaveInstance()
{
#if UNITY_EDITOREditorUtility.SetDirty(this); // 标记为已修改AssetDatabase.SaveAssets(); // 保存所有修改AssetDatabase.Refresh(); // 刷新数据库Debug.Log("JsonFileCollector 实例已保存.");
#endif
}
做一个编辑器面板用于手动读取保存数据
[CustomEditor(typeof(JsonFileData))]
public class JsonFileCollectorEditor : Editor
{public override void OnInspectorGUI(){JsonFileData collector = (JsonFileData)target;DrawDefaultInspector();if (GUILayout.Button("刷新文件列表", GUILayout.Height(30))){collector.RefreshJsonFileList();collector.GetJsonData();collector.SaveInstance();}GUILayout.Space(10);if (collector.jsonDataList.Count == 0){GUILayout.Label("未找到 JSON 文件.");}}
}
OK,大概这样子
Unity读取ScriptableObject类
解析 JSON 数据
加载完 JSON 文件后,你通常需要将字符串类型的 JSON 数据转换成实际的 C# 对象。这个过程通常依赖于第三方库(如 Newtonsoft.Json 或 LitJson)来解析。
可以通过 JsonMapper.ToObject 方法(来自 LitJson 库)将 JSON 字符串转换为指定类型的对象。
public List<T> GetConfigRoot<T>(){foreach (var item in jsonDataList){if (item.configName == typeof(T).Name){ConfigRoot<T> configRoot = JsonMapper.ToObject<ConfigRoot<T>>(item.data); // 解析 JSON 数据为对象return configRoot.Config;}}return null;}public List<T> GetConfigRoot<T>(string name){foreach (var item in jsonDataList){if (item.configName == name){ConfigRoot<T> configRoot = JsonMapper.ToObject<ConfigRoot<T>>(item.data);return configRoot.Config;}}return null;}
通过上述步骤,Unity 使用存储好的 JSON 数据的流程如下:
- 存储 JSON 数据:通过 ScriptableObject(如 JsonFileData)将 JSON 文件的数据存储在 ConfigData.data 字段中。
- 加载 JSON 数据:通过 GetJsonData() 和 LoadConfig() 方法从磁盘读取 JSON 文件内容,并存储到内存中。
- 解析 JSON 数据:使用第三方库(如 LitJson)将 JSON 字符串转换为 C# 对象,通常通过 JsonMapper.ToObject() 方法进行。
- 使用数据:将解析后的数据应用到游戏逻辑中,如配置角色、武器、敌人等游戏元素。
通过这种方式,你能够在 Unity 中灵活地管理和使用 JSON 配置数据。
如何使用
一般来说需要提供一个数据类,一个表的名称就可以拿到里面的数据
例如:
JsonFileData.GetConfigRoot<数据类>(文件名)
不过如果有多张表,相同的结构该怎么办?
我们可以使用之前存储好的表名来遍历里面的数据,使用属性数量来过滤出我们使用的数据
属性数量8:
属性数量6:
过滤出数据:
foreach (var item in JsonFileData.jsonDataList)
{if (item.propertyCount==6){foreach (var config in JsonFileData.GetConfigRoot<Config_Default>(item.configName)){Config_Default Default = config;string info = "";info += "ID:" + Default.ID;info += ",父节点:" + Default.Parent;info += ",标题:" + Default.Title;info += ",内容:" + Default.Content;info += ",图片路径:" + Default.SpritePath;info += ",视频路径:" + Default.VideoPath;Debug.Log(info);}}else{foreach (var config in ConfigHelper.GetConfigInfo<Config_Answer>(item.configName)){Config_Answer Default = config;string info = "";info += "ID:" + Default.ID;info += ",父节点:" + Default.Parent;info += ",标题:" + Default.Title;info += ",内容:" + Default.OptionA;info += "," + Default.OptionB;info += "," + Default.OptionC;info += "," + Default.OptionD;info += ",答案:" + Default.CorrectAnswer;Debug.Log(info);}}
}
使用属性数量过滤不是一个好的选择,各位可以各显神通,看看如何解决这个问题。
Demo下载链接👉 读表工具
相关文章:

Unity 读Excel,读取xlsx文件解决方案
Unity读取表格数据 效果: 思路: Unity可以解析Json,但是读取Excel需要插件的帮助,那就把这个功能分离开,读表插件就只管读表转Json,Unity就只管Json解析,中间需要一个存储空间,使用…...

R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
全文链接:https://tecdat.cn/?p38667 摘要:在母婴暴露于空气污染对儿童健康影响的研究中,常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型(DLNM)是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…...

【信息系统项目管理师】高分论文:论信息系统项目的沟通管理(信息管理服务一体化平台)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、事预则立,规划沟通管理二、提升支持,管理沟通三、观察偏差,监督沟通论文 2022年2月,我公司承建某省退役军人信息管理服务一体化平台项目,由于本人具有较丰富的项目管理经验,同时也是一名退伍军人…...

物联网工厂可视化监控平台:为智能制造打造的可视化大屏
01行业背景 随着技术的不断进步,物联网(IoT)已经成为推动数字化转型的核心力量。物联网通过连接各种设备和传感器,实现数据的实时收集、传输和分析,为各行各业带来了革命性的变化。随着5G、云计算、大数据等技术的成熟…...

3、redis的高可用
主从复制 主从复制:这是redis高可用的基础。哨兵模式和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的,主负责写入,然后把写入的数据同步到从,从节点只能读不能写。read only。 不能做高可用的切换ÿ…...

数据结构--顺序表(详解)
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、线性表二、顺序表 一、线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结…...

Day62 图论part11
Floyd 算法精讲 Floyd 算法代码很简单,但真正理解起原理 还是需要花点功夫,大家在看代码的时候,会发现 Floyd 的代码很简单,甚至看一眼就背下来了,但我为了讲清楚原理,本篇还是花了大篇幅来讲解。 代码随想…...

git clone 超时
git clone 超时 参考 https://blog.csdn.net/qq_45906972/article/details/142214187?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-142214187-blog-137158358.235v43pc_blog_bottom_relevance_base8&spm1001.2101.3001.…...

WPF编程excel表格操作
WPF编程excel表格操作 摘要NPOI安装封装代码测试代码 摘要 Excel操作几种方式 使用开源库NPOI(常用,操作丰富)使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)使用OpenXml(效率高)使用OleDb(过时) NPOI安装 封装代码 using System; using System.IO; u…...

Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项
栈和队列理论基础 抽象认识 栈是先进后出(FIFO),队列是先进先出(LIFO) 队首(先进))队尾(后进)栈顶(后进)栈底(先进) 栈(Stack) 只在一端进行进出操作(只在一端进一端出)像个篮球框,取用篮球从一端进出。 /进栈 int a[1000];//足够大的栈空间 int top-1…...

【Devops】什么是Devops?(Development+Operations)和运维的区别?
DevOps(Development Operations)是一种将开发(Development)和运维(Operations)团队结合在一起的文化和实践,目的是通过自动化、协作和持续反馈来加快软件的开发、部署和运维的周期,…...

基于NodeMCU的物联网电灯控制系统设计
最终效果 基于NodeMCU的物联网电灯控制系统设计 小程序关灯 上图展现了小程序关灯过程的数据传输过程:用户下达关灯指令→小程序下发关灯指令→MQTT服务器接收关灯指令→下位机接收与处理关灯指令。 项目介绍 该项目是“物联网实验室监测控制系统设计(…...

Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02
在嵌入式开发中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于与外设(如 EEPROM、传感器、显示屏等)进行数据交换。AT24C02 是一种常见的 I2C EEPROM 存储器,它提供 2Kbit…...

Linux应用软件编程-多任务处理(线程)
线程:轻量级的进程,线程的栈区独立(8M),与同一进程中的其他线程共用进程的堆区,数据区,文本区。 进程是操作系统资源分配的最小单位;线程是cpu任务调度的最小单位。 1. 线程的创建…...

VITUREMEIG | AR眼镜 算力增程
根据IDC发布的《2024年第三季度美国AR/VR市场报告》显示,美国市场AR/VR总出货量增长10.3%。其中,成立于2021年的VITURE增长速度令人惊艳,同比暴涨452.6%,成为历史上增长最快的AR/VR品牌。并在美国AR领域占据了超过50%的市场份额&a…...

Jenkins管理多版本python环境
场景:项目有用到python3.8和3.9,python环境直接安装在jenkins容器内。 1、进入jenkins容器 docker exec -it jenkins /bin/bash 2、安装前置编译环境 # 提前安装,以便接下来的配置操作 apt-get -y install gcc automake autoconf libtool ma…...

Flutter富文本实现学习
Flutter 代码如何实现一个带有富文本显示和交互的页面。 前置知识点学习 RealRichText RealRichText 和 ImageSpan 不是 Flutter 框架中内置的组件,而是自定义的组件或来自第三方库。这些组件的实现可以提供比标准 RichText 更丰富的功能,比如在富文本…...

如何解决 OpenAI API 连接问题:降级 urllib3 版本
如何解决 OpenAI API 连接问题:降级 urllib3 版本 在使用 OpenAI API 时,很多开发者可能会遇到连接问题,特别是在使用 Python 代码与 OpenAI 进行交互时。常见的错误包括 ProxyError、SSLError 和 MaxRetryError,它们通常表示在通…...

【C语言】库函数常见的陷阱与缺陷(三):内存分配函数[4]--free
C语言中的free函数用于释放之前通过malloc、calloc或realloc动态分配的内存。然而,在使用free函数时,开发者可能会遇到一些陷阱和缺陷。 一、功能与用法 free 函数是 C 语言中用于释放动态分配内存的关键函数。在程序使用 malloc、calloc 或 realloc 等函数在堆上分配了内存…...

论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试
大语言模型拥有的强大能力可以用来辅助多种工作,但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz,它利用模型提示生成模糊测试驱动代码,并将代码片段嵌入到LLVM框架中执行模糊测试。 论文摘要 制作高质…...

AWS K8s 部署架构
Amazon Web Services(AWS)提供了一种简化的Kubernetes(K8s)部署架构,使得在云环境中管理和扩展容器化应用变得更加容易。这个架构的核心是AWS EKS(Elastic Kubernetes Service),它是…...

JavaSE笔记(四)
Java泛型与集合类 在前面我们学习了最重要的类和对象,了解了面向对象编程的思想,注意,非常重要,面向对象是必须要深入理解和掌握的内容,不能草草结束。在本章节,我们会继续深入了解,从我们的泛型开始,再到我们的数据结构,最后再开始我们的集合类学习。 走进泛型 为…...

C语言基础——指针(5)
一. 函数指针变量 1. 函数指针变量的定义: 类比数组指针变量,数组指针变量是存放数组地址的变量,那么同理,函数指针变量就是存放函数地址的变量。 2. 创建函数指针变量: 函数是有地址的࿰…...

curl+openssl 踩坑笔记
curl编译:点击跳转 踩坑一 * SSL certificate problem: unable to get local issuer certificate * closing connection #0 curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.se/docs/sslcerts.html …...

Unity 实现Canvas显示3D物体
新建一个UI相机,选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体,并将3D物体的层级设置为UI层 适当的放缩3DObjParent,让3D物体能显示出来…...

【Docker命令】如何使用`docker exec`在容器内执行命令
大家好,今天我们来聊聊Docker容器管理中的一个非常有用的命令:docker exec。在日常工作中,我们经常需要在运行中的Docker容器内执行各种命令,docker exec正是帮助我们实现这一需求的利器。下面我将通过一个简单的例子,…...

NetSuite Formula(HTML)超链打开Transaction
当Saved Search作为Sublist应用在Form时,如果Document Number是Group过的,则会出现如下超链失效的情况。 解决办法: 可以利用Saved Search中的Formula(HTML)功能来构建超链,用于打开Transaction。 以下图…...

【React】- 跨域PDF预览、下载(改文件名)、打印
我们经常会碰到跨域来方位PDF,同时需要下载、打印的需求,通常由于浏览器的安全策略,可以预览,但是下载和打印可能会受限,这时候怎么办呢? 1.创建一个隐藏的标签 要下载 iframe 中的 PDF 文件,…...

git clone ssh 设置代理
Linux配置方法 编辑 ~/.ssh/config 文件 Host github.com Hostname github.com ProxyCommand nc -v -x 127.0.0.1:1080 %h %pwindows配置方法 编辑 C:\Users\当前用户名.ssh\config 文件 Host github.com Hostname github.com ProxyCommand connect -S 127.0.0.1:1080 %h %…...

RK3568平台(USB篇)USB网络共享
使用RK的USB网络共享,在内核里面已经有了,这不需要自己写驱动程序,只需要把内核自带的USB网络共享的驱动添加上去即可。 一.RNDIS 协议简介 RNDIS 是微软定义的一种协议,它允许通过 USB 接口实现网络连接。通过 RNDIS,USB 设备可以充当网络适配器,允许主机通过 USB 与设…...