UE4SS:虚幻引擎运行时脚本扩展与Lua模组开发实战指南
1. 项目概述为什么UE4SS是虚幻引擎开发者的“瑞士军刀”如果你是一名虚幻引擎Unreal Engine 简称UE的开发者无论是刚入门的新手还是已经摸爬滚打多年的老手可能都经历过这样的时刻想快速测试一个游戏逻辑却发现需要重新编译整个C项目一等就是几分钟甚至十几分钟想修改某个游戏运行时参数却找不到现成的控制台命令或者想为某个复杂的Actor批量添加一个行为却要写一大堆蓝图节点调试起来眼花缭乱。这些痛点正是UE4SSUnreal Engine 4 Scripting System诞生的土壤。它不是一个官方工具却凭借其强大的运行时脚本能力成为了社区中许多资深开发者和模组Mod制作者手中的秘密武器。简单来说UE4SS是一个为虚幻引擎4及部分UE5版本设计的、基于Lua脚本语言的运行时扩展与注入框架。它允许你在游戏或编辑器运行时动态地加载和执行Lua脚本从而实现对游戏对象、函数、属性的读取、修改和扩展而无需触碰原始的C源代码或进行漫长的编译。这听起来可能有些抽象你可以把它想象成给虚幻引擎这个庞大的机器装上了一套“外挂”的实时控制面板和自动化脚本系统。通过它你可以实时查看内存中的对象信息、调用引擎内部函数、创建新的游戏逻辑甚至开发出功能完整的游戏模组。那么UE4SS到底适合谁我认为主要面向三类人群一是游戏模组开发者这是UE4SS最核心的应用场景可以快速实现游戏功能修改、添加新物品或角色二是游戏测试与调试人员能够快速构建测试脚本、验证游戏机制、定位运行时问题三是希望深入学习虚幻引擎内部机制的开发者通过脚本“窥探”和调用引擎底层接口是理解UE对象系统、反射机制和内存布局的绝佳实践途径。即便你只是对游戏开发感兴趣想了解如何“撬动”一个成品游戏UE4SS也能为你打开一扇新的大门。最近社区里“虚幻引擎 打包关卡 类丢弃”这个热词很火这其实指向了UE开发中一个常见的痛点项目打包后某些仅在编辑器下有用的类或资源会被丢弃以减小体积但如果运行时需要用到这些类的信息就会报错。而UE4SS的脚本环境恰恰可以在运行时重新获取和操作这些“丢失”的类信息为解决这类问题提供了另一种思路。接下来我将带你从零开始彻底掌握这套强大工具的使用。2. UE4SS核心架构与工作原理拆解在动手安装和编写第一行脚本之前理解UE4SS是如何“嵌入”到虚幻引擎进程中并工作的至关重要。这能帮助你在后续遇到问题时有一个清晰的排查思路而不是盲目地试错。2.1 核心组件与注入机制UE4SS并非一个独立的应用程序它本质上是一个动态链接库DLL注入套件。它的工作流程可以概括为以下几个关键步骤注入Injection当你启动配置了UE4SS的游戏时一个独立的加载器通常是UE4SS_Bootstrapper.exe或通过其他注入器会将核心的UE4SS.dll文件注入到游戏进程的内存空间中。这个过程让UE4SS的代码获得了在游戏进程内执行的能力与游戏共享同一个内存地址空间。初始化与挂钩HookingDLL被加载后UE4SS会进行初始化并执行一系列“挂钩”Hooking操作。这是其核心技术之一。它主要挂钩的是虚幻引擎的对象注册表和脚本虚拟机相关的关键函数。例如它会挂钩负责加载UObject虚幻引擎中所有对象的基类和生成蓝图函数的流程。通过挂钩UE4SS能够在引擎执行特定操作如查找一个类、调用一个函数时插入自己的代码逻辑。暴露接口与创建环境初始化完成后UE4SS会利用虚幻引擎强大的反射系统扫描内存中所有的UClass类、UFunction函数、UProperty属性新版本中为FProperty等信息并将它们封装成Lua可以理解和调用的接口。同时它会创建一个Lua虚拟机环境并加载你预先准备好的主脚本文件通常是main.lua。脚本执行与交互你的Lua脚本在这个沙盒环境中开始执行。脚本可以通过UE4SS提供的API例如UE.FindClass()、UE.Objects等来查找、访问和修改游戏中的对象。当脚本调用一个引擎函数时请求会通过UE4SS的封装层利用之前挂钩的路径安全地调用到引擎的原生函数上。这种基于挂钩和反射的架构使得UE4SS具有了“动态”和“无需源码”两大优势。你不需要游戏的C代码也能操作其内部对象因为所有信息在运行时都存在于内存中并通过反射系统暴露出来。2.2 与“虚幻引擎 打包关卡 类丢弃”热点的关联这里就不得不提开头提到的热词“类丢弃”。在虚幻引擎中为了优化最终发布包的大小开发者可以在项目的DefaultEngine.ini中配置Cooker.Mods或使用nativization等功能。这会导致一些标记为Transient、Abstract或仅在编辑器下使用的类比如某些开发工具类、测试类在打包烘焙过程中被排除在最终运行时代码之外。对于游戏本体这没问题。但对于想通过外部工具包括早期一些简单的内存扫描工具来定位这些类的模组开发者来说就成了“找不到类”的噩梦。UE4SS的巧妙之处在于它不依赖于打包后静态存在的类信息。它的挂钩发生在运行时当游戏需要创建一个对象或调用一个函数时引擎自身的代码路径会被触发。UE4SS通过挂钩这些路径“看到”引擎内部正在使用的所有活跃的类、函数和对象实例无论它们是否在打包时被标记为“丢弃”。只要这个类或函数在游戏运行逻辑中被实际使用到UE4SS就能捕捉到它。这就好比虽然地图上没标出小路但只要你跟着当地人引擎执行流走依然能找到它。因此UE4SS在处理这类问题上比许多静态分析工具更具优势。3. 从零开始UE4SS环境部署与配置详解理论讲得再多不如亲手配置一遍。下面我将以最常见的场景——为某个已发布的UE4游戏制作模组——为例详细讲解UE4SS的部署过程。请注意具体文件名和路径可能因UE4SS版本和游戏而异但核心逻辑不变。3.1 工具获取与版本选择首先你需要获取UE4SS。最推荐的方式是从其官方GitHub仓库例如UE4SS-RE/RE-UE4SS的Release页面下载预编译的二进制文件。选择版本时要关注两个关键点游戏引擎版本UE4SS的不同分支支持不同版本的虚幻引擎。例如UE4SS Xinput分支通常兼容性较好。你需要根据目标游戏所使用的UE4版本如4.25, 4.27来选择对应兼容的UE4SS版本。如果不确定可以尝试下载最新稳定版或查阅社区中其他模组作者的经验。游戏是否使用反作弊这是重中之重涉及安全合规问题。如果目标游戏搭载了如EasyAntiCheatEAC、BattlEye等反作弊系统注入任何外部DLL包括UE4SS都极有可能导致游戏封禁。UE4SS的用途应严格限定在单机游戏、私有服务器或明确允许模组的游戏上以及个人的学习与研究环境。绝对不要尝试在受反作弊保护的在线多人游戏中使用这既是遵守游戏规则也是保护自己账号安全。下载后你会得到一个压缩包解压后通常包含以下核心文件和目录UE4SS/ ├── UE4SS.dll # 核心注入库 ├── UE4SS_Bootstrapper.exe # 引导注入器 ├── mods/ # 模组/脚本存放目录 │ └── YourMod/ │ └── main.lua # 你的主脚本文件 ├── config/ # 配置文件目录 │ └── config.json # 主配置文件 └── README.md3.2 部署流程与关键配置部署的核心思想是让游戏进程在启动时加载UE4SS。有两种主流方法方法一使用Bootstrapper推荐给初学者这是最简单的方法。将整个解压后的UE4SS文件夹放置到游戏的二进制文件.exe所在目录。然后不是直接运行游戏而是运行UE4SS_Bootstrapper.exe。这个引导程序会自动查找同目录下的游戏exe并启动它同时在启动过程中完成DLL注入。方法二手动修改启动参数或使用第三方注入器有些时候Bootstrapper可能不工作。你可以尝试通过游戏平台如Steam设置启动参数或者使用像Xenos这样的DLL注入器进行手动注入。但这需要更多技术知识。关键配置文件config.json解析部署后首次运行前务必检查config/目录下的config.json文件。有几个关键设置影响脚本功能{ Console: { Enabled: true, // 启用内置控制台可用于调试输出 Key: F1 // 打开控制台的快捷键 }, Dumper: { GenerateSDK: false // 是否生成SDK头文件用于高级开发 }, Scripts: { Enabled: true, // 是否启用Lua脚本功能 ScriptsDirectory: ./mods // 脚本目录路径 } }对于初学者确保Console.Enabled和Scripts.Enabled为true即可。内置控制台按F1呼出是查看脚本打印信息、排查错误不可或缺的工具。注意部署完成后第一次运行游戏可能会被杀毒软件警告因为DLL注入行为本身比较敏感。请确保你从官方渠道下载UE4SS并在安全环境下使用。如果游戏崩溃首先检查UE4SS版本与游戏引擎版本是否匹配并查看控制台有无红色错误信息。4. Lua脚本基础与UE4SS API初探UE4SS选择Lua作为脚本语言是因为Lua轻量、高效、易于嵌入C程序并且语法简单。你不需要是Lua专家也能开始但了解一些基础和对UE4SS扩展API的认识是必要的。4.1 必备的Lua语法速成一个典型的UE4SS脚本main.lua结构如下-- 这是一个Lua注释 -- 1. 定义局部变量推荐使用local作用域更清晰 local playerController nil local gameInstance nil -- 2. 定义一个函数用于查找并打印玩家信息 function FindAndPrintPlayer() -- 使用UE4SS提供的全局UE对象来查找类 local PlayerControllerClass UE.FindClass(“/Script/Engine.PlayerController”) if PlayerControllerClass then -- 使用UE4SS提供的UE.GetAllActorsOfClass函数注意API名称可能随版本变化 local allPlayers UE.GetAllActorsOfClass(PlayerControllerClass) for i, actor in ipairs(allPlayers) do -- 访问对象的属性这里假设PlayerController有PlayerName属性 local name actor:Get(“PlayerName”) -- 注意Get是UE4SS提供的访问器实际属性名需根据游戏确定 print(“[UE4SS] Found player: ” .. tostring(name)) end else print(“[UE4SS] Failed to find PlayerController class!”) end end -- 3. 注册一个回调函数在游戏“世界”加载完成后执行 RegisterHook(“OnWorldInitialized”, function() print(“[UE4SS] World is ready! Starting to find players...”) FindAndPrintPlayer() end) -- 4. 也可以注册键盘事件需在config中启用Input RegisterKeyBind(“F2”, function() print(“[UE4SS] F2 Pressed!”) -- 执行一些即时操作比如给玩家加钱 AddPlayerMoney(1000) -- 假设的自定义函数 end)关键点解析UE全局对象这是UE4SS注入后在Lua环境中创建的最重要的对象。它是对虚幻引擎运行时接口的封装。通过它你可以查找类(FindClass)、获取对象(FindObject)、遍历所有Actor(GetAllActorsOfClass)等。RegisterHook这是UE4SS的事件系统。你可以注册函数到特定的事件点如OnWorldInitialized世界初始化后OnPostBeginPlayActor开始游戏后OnPreTick/OnPostTick每帧前后。这是你脚本逻辑的主要触发方式。print输出信息到UE4SS控制台按F1打开是调试的生命线。属性访问actor:Get(“PropertyName”)和actor:Set(“PropertyName”, value)是常见的访问方式但属性名必须完全正确且区分大小写。如何知道正确的属性名这就需要用到下一个强大功能——对象转储。4.2 使用控制台与对象转储进行探索对于逆向工程或模组制作最大的挑战往往是“我不知道这个对象叫什么有什么属性”。UE4SS的内置控制台和对象转储功能是你的“雷达”和“解剖刀”。实时对象查看在游戏中你可以将鼠标悬停在一个物体上如果游戏支持然后按配置的快捷键如Insert键具体看config.json中的GuiConsole设置UE4SS控制台可能会显示当前鼠标所指对象的内部信息包括其类名、地址和部分属性。生成SDK/转储对象信息这是更系统的方法。在config.json中将Dumper.GenerateSDK设置为true然后重启游戏。UE4SS会在其目录下生成一个SDK文件夹里面包含游戏所有类、结构体、枚举的C风格头文件。虽然你是写Lua但这些头文件是绝佳的参考手册。你可以搜索你感兴趣的类名如Character、Weapon、InventoryComponent查看它包含的所有属性和函数签名。在控制台中执行命令按F1打开控制台你可以直接输入Lua代码片段并执行。例如输入print(UE.FindClass(“/Script/Engine.PlayerController”))可以立即测试能否找到这个类。这是一个快速验证想法的方式。实操心得刚开始不要急于写复杂的模组。你的第一个脚本应该是一个“侦察兵”。写一个脚本在OnWorldInitialized事件中简单地遍历所有Actor并打印出它们的类名和名字。这样你能快速了解当前游戏世界里有哪些对象它们的类名具体是什么可能不是标准的/Script/Engine.XXX而是游戏特有的/Script/GameName.XXX。5. 核心功能实战编写你的第一个功能性模组掌握了基础我们来实战一个经典需求为单机游戏添加一个“无限弹药”功能。这个例子将串联起查找对象、访问属性、修改属性、响应事件等多个核心环节。5.1 需求分析与设计思路“无限弹药”听起来简单但实现起来需要明确几点目标是谁的弹药通常是玩家角色Character或玩家控制器PlayerController持有的某个武器组件或库存组件。弹药如何表示可能是一个整数属性如CurrentAmmo也可能是一个结构体或数组。何时修改需要在每帧或每次弹药减少时将其重置。最省性能的方式是在弹药即将减少的“那一刻”将其拦截并重置。我们的设计思路是首先找到代表玩家当前武器的对象然后找到其弹药属性最后通过挂钩其“消耗弹药”的函数或每帧检查并重置的方式来实现无限。5.2 分步实现与代码解析-- 文件mods/InfiniteAmmo/main.lua local infiniteAmmoEnabled true -- 全局开关 local targetWeapon nil -- 缓存找到的武器对象 local ammoPropertyName “CurrentAmmoInClip” -- 弹药属性名这需要根据实际游戏探索确定 -- 步骤1定义一个函数来查找玩家当前的武器 function FindPlayerWeapon() -- 首先找到本地玩家控制器 local world UE.GetWorld() if not world then return end local localPlayerController world:GetFirstLocalPlayerController() if not localPlayerController then return end -- 假设武器保存在PlayerController的CurrentWeapon属性中这是一个常见但不通用的设计 -- 你需要根据SDK转储或日志打印来确认实际的属性路径 local weapon localPlayerController:Get(“CurrentWeapon”) if weapon then targetWeapon weapon print(“[InfiniteAmmo] Found weapon: ” .. tostring(weapon:GetName())) -- 打印武器所有属性帮助确认弹药属性名调试用 -- UE4SS可能提供DumpObjectProperties函数或者你需要自己遍历属性列表如果API支持 else print(“[InfiniteAmmo] Could not find current weapon.”) end end -- 步骤2定义一个函数来设置无限弹药 function SetInfiniteAmmo() if not targetWeapon or not infiniteAmmoEnabled then return end -- 方法A直接设置弹药值为一个很大的数简单粗暴 local currentAmmo targetWeapon:Get(ammoPropertyName) if type(currentAmmo) “number” and currentAmmo 999 then targetWeapon:Set(ammoPropertyName, 999) -- print(“[InfiniteAmmo] Ammo set to 999”) -- 频繁打印会影响性能调试时可打开 end -- 方法B更优雅挂钩武器开火或消耗弹药函数在消耗前阻止或补充。 -- 这需要知道具体的函数名并用到RegisterHook对特定函数进行前置或后置挂钩。 -- 例如RegisterHook(“/Script/GameName.Weapon.ServerConsumeAmmo”, function(...) return 0 end) -- 这需要更深入的游戏逆向知识。 end -- 步骤3注册事件在合适的时机执行 RegisterHook(“OnPostBeginPlay”, function() -- 游戏角色开始游戏后稍等几帧再查找武器确保武器已装备 DelayExecute(60, function() -- DelayExecute可能由UE4SS提供或自己用Tick实现简单延迟 FindPlayerWeapon() end) end) -- 步骤4每帧检查并重置弹药方法A的持续生效方式 local tickCount 0 RegisterHook(“OnPostTick”, function(deltaTime) tickCount tickCount 1 -- 每10帧执行一次避免每帧都执行消耗性能 if tickCount % 10 0 then SetInfiniteAmmo() end end) -- 步骤5添加一个热键开关功能 RegisterKeyBind(“F3”, function() infiniteAmmoEnabled not infiniteAmmoEnabled local status infiniteAmmoEnabled and “ENABLED” or “DISABLED” print(“[InfiniteAmmo] Infinite ammo ” .. status) end) print(“[InfiniteAmmo] Script loaded. Press F3 to toggle.”)5.3 调试与优化要点属性名探索代码中的“CurrentAmmoInClip”只是一个示例。真实属性名可能是“AmmoCount”、“ClipAmmo”、“CurrentAmmo”等。你需要通过之前提到的对象转储SDK生成或在控制台中打印目标武器的所有属性来确认。可以尝试写一个遍历属性的调试函数。性能考量在OnPostTick中每帧执行操作是可行的但对于简单重置属性每10帧甚至30帧tickCount % 30 0执行一次也完全足够能显著减少性能开销。错误处理脚本中缺少大量错误处理如pcall调用在实际复杂环境中一个属性访问失败可能导致整个脚本停止。生产级的模组应该用pcall包裹可能出错的调用。延迟执行DelayExecute函数可能并非UE4SS标准API你可能需要自己实现一个简单的基于Tick的计时器来延迟执行初始化代码确保游戏对象已经完全生成。6. 进阶技巧与常见问题深度排查当你完成基础功能后可能会追求更稳定、更强大的模组。以下是一些进阶技巧和踩坑记录。6.1 函数挂钩与调用原生引擎函数直接修改属性有时不够用比如你想修改伤害计算、改变游戏规则。这时就需要挂钩游戏本身的函数。-- 假设我们想修改玩家受到的伤害 -- 首先需要知道伤害计算函数的完整名称。这通常来自SDK转储或逆向分析。 -- 例如函数可能是 /Script/GameName.HealthComponent.TakeDamage local originalTakeDamage nil -- 用于保存原函数引用 RegisterHook(“/Script/GameName.HealthComponent.TakeDamage”, function(self, damageAmount, damageEvent, eventInstigator, damageCauser) -- self 是HealthComponent对象本身 -- 这个函数在游戏原本的TakeDamage函数被调用前执行 print(string.format(“[DamageMod] About to take %.2f damage”, damageAmount)) -- 示例将所有伤害减半 local modifiedDamage damageAmount * 0.5 -- 如果你想完全阻止这次伤害可以直接返回 -- return 0 -- 如果你想修改后继续传递需要调用原函数。 -- 但注意挂钩函数需要返回原函数应返回的值。这里情况复杂可能需要调用保存的原函数。 -- UE4SS的RegisterHook有时提供“前置”和“后置”挂钩具体用法需查文档。 -- 更安全的方式是使用“后置挂钩”OnPostHook来修改伤害结果或者直接修改传入的damageAmount如果参数是可修改的引用。 -- 这里演示一个概念如果我们可以修改传入的参数通常Lua做不到可以这样做 -- damageAmount modifiedDamage -- 但实际上我们需要调用原函数并传入修改后的参数这要求我们能获取原函数指针并正确调用。 -- 这属于UE4SS更高级的用法可能需要用到UE.FindFunction和UE.CallFunction。 end)重要警告函数挂钩是强大但危险的操作。错误的挂钩可能导致游戏立刻崩溃或出现不可预知的bug。务必在充分测试和理解函数签名参数类型、返回值后再进行。6.2 处理“类未找到”或“属性不存在”错误这是新手最常见的问题。控制台刷红字“Failed to find class...”或“Attempt to get non-existent property...”。排查清单确认类名路径使用UE4SS控制台的实时对象查看功能或者生成SDK后搜索。注意游戏自定义类的路径通常是/Script/YourGameName.ClassName而不是引擎标准类。检查加载时机你的FindClass调用是否执行得太早了有些游戏类是在世界加载过程中动态加载的。将查找代码放在OnWorldInitialized或OnPostBeginPlay事件之后甚至用DelayExecute延迟几秒。属性名大小写和拼写Lua是大小写敏感的。“currentammo”和“CurrentAmmo”是两个不同的属性。使用SDK头文件或对象属性转储功能来获取精确的名称。属性访问方式有些属性不是直接通过:Get访问的可能是通过Getter函数。例如player:GetPawn()而不是player:Get(“Pawn”)。查看SDK中该属性的声明如果是UFUNCTION(BlueprintGetter)则可能需要调用对应的函数。6.3 模组配置化与用户交互一个好的模组应该允许用户配置。你可以创建一个简单的配置文件如config.lua或settings.json在脚本中读取。-- settings.lua (在mods/YourMod/目录下) return { infiniteAmmo true, damageMultiplier 0.5, godMode false, hotkeyToggle “F4” } -- main.lua local settings dofile(“./mods/YourMod/settings.lua”) -- 加载配置 infiniteAmmoEnabled settings.infiniteAmmo对于更复杂的交互可以考虑利用UE4SS的ImGui集成如果版本支持来绘制一个游戏内菜单让用户可以实时调整设置。6.4 性能优化与内存安全避免高频操作不要在OnPreTick/OnPostTick中执行复杂的查找或遍历操作。如果需要务必添加帧率限制如tickCount % 30。缓存查找结果像玩家控制器、游戏世界这类几乎不变的对象找到后缓存到局部变量中避免重复查找。及时清理引用Lua有垃圾回收但如果你持有大量UE对象的引用而不释放可能会干扰引擎本身的垃圾回收。对于不再需要的对象将其设为nil。使用pcall用pcall调用所有可能失败的UE4SS API或属性访问防止单个错误导致脚本整体崩溃。7. 从脚本到模组打包、分享与社区实践当你完成了一个稳定有趣的脚本后可能会想分享给其他玩家。这时你需要考虑模组的打包和分发。整理文件结构一个典型的可分发模组目录应包含YourAwesomeMod/ ├── main.lua -- 主脚本 ├── settings.lua -- 配置文件可选 ├── README.txt -- 说明文档包括功能、快捷键、安装方法 └── dependencies/ -- 依赖的其他Lua库如果有编写清晰的文档在README中说明模组功能、兼容的游戏版本、安装方法直接复制到mods/下、使用方法快捷键以及已知问题。测试兼容性在不同游戏版本、不同关卡下测试你的模组。确保它不会导致崩溃或严重bug。发布到社区可以将其发布到像GitHub、Gitee或专门的模组网站如Nexus Mods上的相应游戏板块。遵守社区的发布规则并明确声明该模组仅用于单机或允许模组的游戏。最后的个人体会UE4SS是一把打开虚幻引擎运行时世界的万能钥匙但能力越大责任越大。它最佳的应用场景是单机游戏体验增强、学习研究和允许模组的社区服务器。在整个学习和使用过程中最宝贵的不是写出的某一段脚本代码而是你通过探索、试错、阅读SDK而积累起来的对虚幻引擎运行时对象模型、内存管理和函数调用机制的深刻理解。这种理解即使在你回归到正统的C或蓝图开发时也会让你对引擎的把握更加游刃有余。从“无限弹药”这样的小功能开始逐步挑战更复杂的逻辑修改、UI创建甚至全新游戏机制的添加你会发现你对游戏的理解和掌控达到了一个全新的维度。

相关新闻

超级完整的 Git的下载、安装、配置与使用 以及命令

超级完整的 Git的下载、安装、配置与使用 以及命令

Git的下载、安装、配置与使用 以及命令 一、Git下载安装 1、访问git官方下载网址,点击这里,然后根据自己的电脑系统,下载对应的安装包: 2、在淘宝镜像网站 下载对应的安装包: 注: 如果由于官网下载速度过于缓慢,而且我还下载报错: 无法下载,需要授权。 可在git下载的…

2026/8/2 19:12:08 阅读更多 →
NoFences开源桌面分区管理工具:终极免费替代方案告别杂乱桌面

NoFences开源桌面分区管理工具:终极免费替代方案告别杂乱桌面

NoFences开源桌面分区管理工具:终极免费替代方案告别杂乱桌面 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为混乱的Windows桌面图标而烦恼吗?每…

2026/8/2 19:12:08 阅读更多 →
【单片机课程设计/毕业设计】基于单片机 WiFi 模块的本地局域网智能配电控制系统设计 基于移动端的 STM32/51 单片机局域网 LED 指示控制系统实现(020901)

【单片机课程设计/毕业设计】基于单片机 WiFi 模块的本地局域网智能配电控制系统设计 基于移动端的 STM32/51 单片机局域网 LED 指示控制系统实现(020901)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/2 19:12:08 阅读更多 →

最新新闻

Open WebUI技术架构解析:构建企业级AI平台的完整指南

Open WebUI技术架构解析:构建企业级AI平台的完整指南

Open WebUI技术架构解析:构建企业级AI平台的完整指南 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui Open WebUI作为一款开源自托管AI平台&…

2026/8/2 19:54:35 阅读更多 →
Godot引擎FPS游戏开发:物理碰撞、摄像机控制与性能优化实战

Godot引擎FPS游戏开发:物理碰撞、摄像机控制与性能优化实战

1. 项目概述:当你的FPS游戏在Godot里“卡壳”了做独立游戏,尤其是第一人称射击(FPS)这种对性能和手感要求极高的类型,选Godot Engine绝对是个充满挑战又极具性价比的决定。我见过太多开发者,包括我自己&…

2026/8/2 19:54:35 阅读更多 →
从0到1掌握C++ Streams:新手必备的函数式编程库入门教程

从0到1掌握C++ Streams:新手必备的函数式编程库入门教程

从0到1掌握C Streams:新手必备的函数式编程库入门教程 【免费下载链接】Streams Lazy evaluation in C - http://jscheiny.github.io/Streams/ 项目地址: https://gitcode.com/gh_mirrors/str/Streams C Streams是一个强大的函数式编程库,它通过延…

2026/8/2 19:54:35 阅读更多 →
hexo-theme-inside开发者指南:插件开发与贡献代码的快速入门

hexo-theme-inside开发者指南:插件开发与贡献代码的快速入门

hexo-theme-inside开发者指南:插件开发与贡献代码的快速入门 【免费下载链接】hexo-theme-inside 🌈 SPA, Flat and clean theme for Hexo https://blog.oniuo.com/theme-inside 项目地址: https://gitcode.com/gh_mirrors/hex/hexo-theme-inside …

2026/8/2 19:54:35 阅读更多 →
ChatGPT+Notion+飞书≠高效协作!真正起效的AI协作引擎,藏在这4个隐性协议里

ChatGPT+Notion+飞书≠高效协作!真正起效的AI协作引擎,藏在这4个隐性协议里

更多请点击: https://kaifayun.com 第一章:ChatGPTNotion飞书≠高效协作!真正起效的AI协作引擎,藏在这4个隐性协议里 工具堆叠不等于能力升级。当团队把ChatGPT嵌入Notion、再同步到飞书多维表格时,常陷入“数据在流转…

2026/8/2 19:54:35 阅读更多 →
CoffeeCatch完全指南:如何优雅捕获Android JNI中的致命信号

CoffeeCatch完全指南:如何优雅捕获Android JNI中的致命信号

CoffeeCatch完全指南:如何优雅捕获Android JNI中的致命信号 【免费下载链接】coffeecatch CoffeeCatch, a tiny native POSIX signal catcher (especially useful for JNI code on Android/Dalvik) 项目地址: https://gitcode.com/gh_mirrors/co/coffeecatch …

2026/8/2 19:53:34 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →