Unity Harmony 注入代码排查transform位置变化

Unity x HarmonyOS:构建环境与发布应用全攻略 Unity作为一款广泛使用的游戏和应用程序开发引擎,其强大的跨平台能力使其在多个操作系统上都有出色的表现。随着HarmonyOS(鸿蒙操作系统)的快速发展,Unity开发者在HarmonyOS上构建应用的需求日益增长。本文将详细介绍如何在Unity中构建HarmonyOS环境,以及如何直接发布HarmonyOS应用。 阅读详情

工具源码:https://github.com/handzlikchris/Unity.TransformChangesDebugger.API

Harmony:https://github.com/pardeike/Harmony


介绍

  • 代码存在直接使用原始Transform.SetPosition等设置坐标,如果出现抖动或者其他位置异常,排查会比较困难,传统做法:

    • C#约定所有设置坐标接口都用自己封装的。

    • lua的话,因为是都是通过C# Wrap调用,可以在C#Wrap中加打印。

    • 极端点:改引擎源码重新编译。

  • 现在提供另一种思路,在所有C#代码改变坐标的地方,注入代码,实现监听所有改变坐标的代码调用情况。

  • 存在的问题:如果是动画或者物理控制等非自己加的代码,就无法检查到,可以提前排查。


使用

  • 对需要检查的GameObject,拖入组件TrackPositionChanges,如果有改动坐标的操作,会在控制台打印改变日志。
    在这里插入图片描述
#if UNITY_EDITOR
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using UnityEngine;
using TransformChangesDebugger.API;

public class TrackPositionChanges : TrackTransformChanges
{
    // 初次初始化要80多秒
    
    private static bool isInit = false;
    private static void InitializeTracking()
    {
        if (isInit)
            return;
        isInit = true;
        // Unity默认c#程序集 \client\Library\ScriptAssemblies\Assembly-CSharp.dll
        var userCodeAssembly = new FileInfo(Assembly.GetExecutingAssembly().Location);
        var thirdPartyToolAssembly = new FileInfo(userCodeAssembly.Directory.FullName + "/TrueSync.dll");
        
        // 哪些程序集里的SetPosition要监听
        var userChosenAssembliesToPatch = new List<FileInfo>() { userCodeAssembly, thirdPartyToolAssembly }; //you can specify which assemblies are patched (to save time)
        var allAvailableAssembliesToPatch = new List<FileInfo> { userCodeAssembly, thirdPartyToolAssembly }; //and you also specify all available assemblies, this is mainly for performance-statistics that GUI can use
        
        TransformChangesTracker.InitializeTrackingEvenWithoutAnyTrackedObjects = true;
        TransformChangesDebuggerManager.IsTrackingEnabled = true;
        TransformChangesDebuggerManager.Initialize(allAvailableAssembliesToPatch, userChosenAssembliesToPatch);
    }
    public void Start()
    {
        InitializeTracking();
        
        PositionChanged.AddListener(Dump);
    }

    public void Dump(TransformChange c)
    {
        Debug.LogError($"[{Time.frameCount}]坐标在变[{c.ModifiedObject}] 操作者:【[{c.CallingObject}][{c.CallingFromMethodName}]】 变化:【{c.ValueBeforeChange} -> {c.NewValue}】");
    }
}

#endif

原理

  1. 找到可能修改坐标的程序集,一般没有自己封装的就是Unity生成的 \client\Library\ScriptAssemblies\Assembly-CSharp.dll,有自己的插件的比如定点数插件TrueSync.dll。在初始化函数TransformChangesDebuggerManager.Initialize中传入参数。

  2. 篡改UnityEngine.Component.SendMessage方法,后面会用到,至于为啥改这个方法,猜测可能是Transform自带不需要额外依赖别的代码。
    在这里插入图片描述

  3. 对第一步的所有DLL,修改坐标的代码位置,插入第二步的SendMessage方法。

    1. 遍历所有DLL里面函数,找到设置坐标的相关代码函数,比如下面找到了TSTransform.UpdatePlaymode中有.position赋值的操作。
      在这里插入图片描述

    2. 对找到的函数进行篡改
      在这里插入图片描述

    3. 找到对应的il指令

      在这里插入图片描述

    4. 前后插入自己要的SendMessage方法

  4. 在自己实现的SendMessage方法内,回调出去自己监听即可。


缺点

  • 因为对调用设置位置方法插入了代码,在方法里面就无法debug调试,必要的话得考虑怎么生成对应PDB。

其他

  • 可以用来做代码监控,函数前后加日志,计时等

  • 破解程序,绕过密码之类的

  • 做游戏Mod

Unity游戏Mod开发实战:BepInEx与Harmony核心原理与避坑指南 在游戏开发与修改领域,运行时代码注入是一项关键技术,它允许开发者在无需源代码的情况下,为已编译的程序添加或修改功能。其核心原理通常基于钩子(Hooking)机制,通过拦截和改变程序原有的执行流程来实现。这项技术的价值在于极大地扩展了软件的生命力和可定制性,尤其在游戏模组(Mod)开发中应用广泛,能够修复玩家痛点、增加新内容或创造全新玩法。一个典型的应用场景是为Unity引擎开发的PC游戏制作功能增强模组。本文聚焦于实现这一目标的流行框架组合:BepInEx与Harmony。BepInEx作为插件管理系统,负 阅读详情

相关推荐

Unity游戏模组开发入门:MelonLoader环境搭建与Harmony补丁实战

游戏模组(Mod)开发是扩展游戏功能、提升可玩性的重要技术手段,其核心原理是通过代码注入或运行时补丁技术修改游戏原有逻辑。在Unity游戏生态中,MelonLoader作为一款通用的开源模组加载器,为开发者提供了统一的运行时框架和标准化的开发接口,有效解决了不同游戏模组加载器碎片化的问题。该框架支持Mono和Il2Cpp两种脚本后端,并内置了HarmonyLib库,允许开发者通过前缀(Prefix)、后缀(Postfix)等补丁技术安全地拦截和修改游戏方法执行流程,实现诸如属性修改、功能添加等高级定制。结合

weixin_30751947的博客 341

Unity游戏模组开发实战:基于MelonLoader的代码注入与Harmony补丁技术

在游戏开发与修改领域,代码注入技术是实现功能扩展的核心原理。通过将外部代码动态加载到游戏进程中,开发者能够在不修改原始文件的情况下,为游戏添加新功能或修改现有行为,这极大地提升了模组的兼容性与安全性。其技术价值在于为游戏提供了非侵入式的插件化支持,使得模组能够独立于游戏本体进行更新和维护。在Unity游戏生态中,这一技术被广泛应用于模组开发,实现从简单的界面调整到复杂的玩法重塑。本文聚焦于MelonLoader这一专业的Unity模组加载框架,它通过集成Harmony补丁库和Mono.Cecil程序集分析工

weixin_33874713的博客 370

Unity游戏模组开发终极指南:MelonLoader从入门到实战

在游戏开发与修改领域,模组(Mod)是扩展游戏内容、提升玩家创造力的关键技术。其核心原理是通过代码注入与Hook机制,在游戏运行时动态加载自定义功能模块。这一技术为游戏带来了持久的生命力和丰富的个性化体验,广泛应用于PC平台的各类游戏中。对于基于Unity引擎的游戏,模组开发面临Mono与IL2CPP两种不同脚本后端的兼容性挑战,需要处理程序集加载、函数重定向等底层问题。MelonLoader作为一个开源的通用模组加载器,提供了完整的解决方案。它通过标准化的架构,统一了模组加载流程,内置了稳定的Hook机制

weixin_34396902的博客 443

【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD库的使用

拼UI是该策划负责还是程序负责?”一直是国内游戏行业极具争议的话题。矛盾点也很清楚:程序:拼UI繁琐,没有技术含量,应该交给策划拼,程序工作繁重应该把时间用在刀刃上。策划:程序对拼UI的层次结构、命名要求复杂,拼UI需要技术思维,应该由程序负责。总之各有道理,但是话说回来,既然UI设计师在设计UI界面时必然会拼好UI元素,各种图层、颜色、字体字号信息都有,为什么还要重复UI设计师的工作再次人工拼一次UI呢?事实上市面上早已有。

eFunTech 5563

Unity游戏Mod开发实战:从零入门MelonLoader框架

在游戏模组开发领域,Mod加载器是连接原生游戏与自定义内容的关键桥梁,其核心原理是通过运行时注入技术,在游戏进程启动早期介入,为第三方代码创建安全的执行环境。这种非侵入式的扩展方式,使得开发者能够在不修改游戏原始文件的前提下,动态加载功能模块,极大提升了模组的兼容性与安全性。从技术价值看,统一的Mod框架解决了不同游戏加载器割裂的问题,降低了开发者的适配成本,并提供了标准化的API接口与生命周期管理。在应用场景上,通用型加载器尤其适用于基于Unity引擎开发的各类游戏,无论是独立游戏还是热门作品,都能为模组

342

智驾系统分层架构:从传感器到执行器的全链路解析

本文深入解析了智能驾驶系统的分层架构,从传感器数据采集融合、应用层决策到车辆管理层执行,完整呈现了从感知到控制的全链路工作流程。文章重点阐述了架构设计的核心优势在于接口标准化与模块解耦,以ACC和LKA协同场景为例,说明了各层级如何通过清晰分工与高效协作,实现复杂系统的可靠、灵活与易于升级。

weixin_29219189的博客 399

【Harmony OS】应用开发学习笔记3

1.看实战教程 https://www.bilibili.com/video/BV1x64y1b7hF?p=5&spm_id_from=pageDriver&vd_source=a427d868d5505c0c2790b7f0f14043cf P5(0:0-40:30) 2.复现第一个页面并截图(两张) 3.优快云笔记1.看实战教程 https://www.bilibili.com/video/BV1x64y1b7hF?p=5&spm_id_from=pageDriver&vd_source=a427d8

Mo_none的博客 489

ollama服务暴露公网?三步搞定Nginx反向代理配置(避坑指南)

本文详细介绍了如何通过Nginx反向代理安全地将Ollama服务暴露到公网,避免直接修改OLLAMA_HOST带来的安全隐患。文章提供了从SSL证书部署到高级安全加固的全流程实战指南,包括IP白名单、基础认证、速率限制等企业级安全措施,帮助用户实现安全可靠的外部访问。

wood5的博客 177

Unity游戏Mod/插件制作教程06 - Harmony补丁基础

前言 通过之前的教程,我们已经知道如何编写基本的插件,如果你有C#和Unity的基础,这个时候已经可以做出一些功能了,比如通过按键修改游戏数据之类的。但是,这有很大的局限性,因为通常情况下,我们并不想通过按键来调用我们的功能,我们想让大多数的功能都是加载之后就不需要管了,或者想做一些普通情况下比较难以操作的事情。这个时候,通过Harmony进行补丁可以解决我们绝大多数的需求。Harmony的github链接 https://github.com/pardeike/Harmony 详细信息可以在github查

爱编程的鱼的博客 3430

MATLAB配置MinGW编译器的完整指南

本文提供了在Windows系统上为MATLAB配置MinGW编译器的完整指南。详细介绍了通过MATLAB附加功能管理器在线安装和手动离线安装两种核心方法,并重点说明了如何解决常见的“未找到支持的编译器”等错误。指南包含从版本检查、环境变量配置到最终使用mex命令验证的每一步,帮助用户顺利完成MATLAB与MinGW的集成,以支持C/C++代码编译。

weixin_29031057的博客 264

用STM32定时器PWM高级功能驱动步进电机:F103C8T6+TB6600实战教程

本文详细介绍了如何利用STM32F103C8T6微控制器的定时器PWM高级功能驱动TB6600步进电机驱动器,实现高效、灵活的运动控制方案。通过硬件配置、PWM参数计算、运动控制算法及TB6600高级功能应用的全面解析,为工业自动化和精密控制领域提供了实用的技术参考。

game4的博客 186

Unity构建鸿蒙环境和直接发布鸿蒙应用

一定要下载最新版本的OpenHarmony SDK。最方便的就是下载最新版本的DevEco Studio 文档中心。但是官网最新的都是3.1.1,最高api是9,搭配团结1.0.3发布就会报错,后边会说具体报错的内容。后来从华为开发者联盟才找到4.0 release版本。下边是地址,也可以百度试试

qq_41162935的博客 1万+

华为OD面试八股真题 - 操作系统 - 1

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 1639

Unity游戏模组开发实战:基于MelonLoader的框架原理与Harmony注入技术

在Unity游戏开发与扩展领域,模组(Mod)开发是增强游戏可玩性和社区生态的重要技术方向。其核心原理在于通过代码注入和运行时扩展,在不修改游戏原始代码的前提下实现功能定制。这一过程涉及程序集加载、生命周期管理和运行时钩子等关键技术,能够显著提升开发效率并解决版本兼容性问题。从技术价值看,规范的模组框架让开发者能专注于业务逻辑,而非底层适配,促进了游戏功能的快速迭代和社区创作。在应用场景上,无论是为《英灵神殿》等热门游戏添加新内容,还是开发调试工具和性能监控面板,都离不开稳定高效的模组加载机制。本文以Mel

weixin_33739523的博客 331

当SLAM遇上FPGA:打造一个会“硬件加速”的激光雷达SLAM系统

点云数据的运动畸变校正特征点提取与匹配、以及ICP迭代最近点配准。在传统方案中,我们通常用ARM核完成所有计算。但点云配准中的最近邻搜索(KD-Tree)需要大量分支判断,CPU处理起来效率很低;而ICP中的矩阵分解(SVD)虽然计算量大,但非常适合并行化。ZYNQ的特殊之处在于它把ARM(PS端)和FPGA(PL端)集成在同一颗芯片上。ARM擅长跑操作系统、处理复杂逻辑和调度,FPGA擅长做高吞吐量的并行计算。两者之间通过AXI总线高速互联,数据交换延迟只有几十个时钟周期。

QQ_778132974的博客 375

ESP32-S3模组上跑通esp32-camera(32)

ESP32-S3模组上跑通esp32-camera(32)

phmatthaus的专栏 771

Unity游戏实时翻译:注入式文本拦截与叠加层渲染技术详解

游戏本地化是提升用户体验的关键环节,传统流程周期长、成本高。实时翻译技术通过运行时文本处理,能即时突破语言障碍。其核心原理在于对游戏渲染流程的介入,通常采用注入式方案直接访问游戏内部UI组件,精准获取文本信息。这项技术的工程价值在于实现了非侵入式的文本替换,无需修改游戏原始数据,合法合规。在应用场景上,特别适用于独立游戏、海外作品体验以及快速原型开发。本文聚焦Unity引擎,深入探讨了通过DLL注入、Harmony函数钩子拦截UnityEngine.UI.Text组件,并创建独立Canvas叠加层渲染翻译文

leonard61306500的专栏 300

【项目实战】自动化测试软件VectorCAST介绍

VectorCAST是一款先进的自动化测试软件。VectorCAST是一款功能强大、易于使用的自动化测试软件。VectorCAST适用于各种嵌入式系统的测试。VectorCAST为嵌入式系统的测试提供了一种高效、可靠的解决方案。VectorCAST提供了一整套完整的测试工具,包括测试管理、代码覆盖、缺陷定位、报告生成等,以帮助开发人员提高测试效率,确保软件质量。VectorCAST支持。

奶爸的编程之路,也就一周冷个三天 2009

Unity游戏Mod开发入门:BepInEx插件框架实战指南

在游戏开发与修改领域,代码注入是一种常见的技术手段,它允许开发者在运行时动态修改或扩展现有程序的功能。其核心原理是通过拦截目标方法的执行流程,插入自定义逻辑,从而实现功能增强或行为改变。这项技术的价值在于能够在不修改原始程序文件的前提下,安全、灵活地实现功能定制,极大地提升了软件的可扩展性和维护性。在Unity游戏生态中,这一技术被广泛应用于Mod(模组)开发,为玩家社区创造了丰富的游戏扩展内容。BepInEx作为一款成熟的Unity游戏插件框架,通过内置Harmony库提供了标准化的代码注入解决方案,有效

axfcjwkbi259888707的博客 654

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Unity游戏Mod开发入门:基于BepInEx的HelloWorld实践

游戏模组(Mod)开发是扩展游戏功能的核心技术,通过动态代码注入实现不修改原游戏文件的功能扩展。BepInEx作为Unity Mod开发的主流框架,采用Harmony库实现运行时方法补丁,支持插件热加载和配置管理。这种技术方案相比传统DLL注入更安全稳定,被《星露谷物语》等热门游戏广泛采用。从环境搭建到第一个HelloWorld Mod开发,需要掌握.NET类库构建、Unity引擎基础API调用和BepInEx插件生命周期管理。典型应用场景包括游戏玩法修改、UI定制和资源加载,是游戏二次开发社区的核心技术栈

weixin_34128839的博客 356

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Unity游戏模组开发指南:BepInEx插件框架从入门到精通

在Unity游戏开发与模组制作领域,插件框架是扩展游戏功能的核心技术。其原理是通过非侵入式的运行时补丁机制,动态修改游戏行为,无需直接修改原始程序集。这一技术价值在于为模组开发者提供了稳定、安全的运行环境,极大降低了游戏更新导致的兼容性问题。在应用场景上,它广泛应用于《雨中冒险2》《英灵神殿》等热门游戏的模组生态中。本文聚焦于BepInEx这一主流框架,详细解析其**Harmony补丁**机制与**插件加载**流程,指导开发者从环境搭建到高级调试,实现游戏功能的深度定制与性能优化。

weixin_33912246的博客 329

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

UnityExplorer运行时调试工具:动态注入与实时修改Unity游戏的核心指南

在Unity游戏开发与调试过程中,运行时动态调试与热修改是提升开发效率、定位复杂问题的关键技术。其核心原理是通过进程注入技术,将调试工具动态加载到运行中的游戏进程内,实现对游戏对象、组件、内存状态的实时访问与操控。这项技术的价值在于,它允许开发者在无需停止游戏、重新编译或拥有源代码的情况下,进行深度的运行时分析、性能调优和逻辑验证,极大缩短了调试与迭代周期。在应用场景上,它广泛适用于游戏开发调试、性能分析、Mod制作、逆向工程学习以及快速原型验证等领域。本文聚焦的UnityExplorer,正是集成了对象浏

weixin_34151004的博客 394

Unity游戏Mod开发入门:基于BepInEx框架的完整实践指南

游戏模组(Mod)开发是游戏社区生态的重要组成部分,它允许玩家和开发者对游戏进行功能扩展与个性化定制。其核心原理是通过代码注入或资源替换,在运行时修改游戏的行为逻辑或内容呈现。在技术层面,这通常涉及对游戏程序集的反编译分析、运行时补丁(Runtime Patching)以及资源加载等关键技术。对于使用Unity引擎开发的游戏,BepInEx已成为社区标准的通用型Mod框架,其技术价值在于提供了一套稳定、非侵入式的插件加载与代码补丁方案,极大降低了专业级Mod开发的门槛。通过集成Harmony库,开发者可以在

cong84596496的博客 380

UnityExplorer安装配置与实战调试指南:从原理到问题排查

在Unity开发与游戏Mod制作中,运行时调试与动态分析是提升效率的关键技术。其核心原理基于托管代码注入,通过加载外部程序集到游戏进程,实现对运行时内存的访问与控制。这项技术的价值在于能够实时探查游戏对象层级、组件属性与私有字段,无需重启即可修改状态或执行代码片段,极大加速了复杂逻辑调试、第三方资源分析与系统学习的过程。在实际应用场景中,开发者常借助MelonLoader或BepInEx等模组加载器框架,将调试工具作为插件注入到Mono或IL2CPP后端构建的游戏中。本文聚焦于UnityExplorer这一

weixin_34204722的博客 423

Unity游戏模组开发入门:基于MelonLoader的通用加载器实战指南

在游戏开发与修改领域,模组(Mod)开发是扩展游戏功能、实现个性化体验的重要技术手段。其核心原理在于通过外部代码注入或资源替换,在运行时改变或增强原有游戏逻辑。对于基于Unity引擎的游戏,由于存在Mono和Il2Cpp两种不同的脚本后端,传统模组开发面临兼容性差、技术门槛高的挑战。MelonLoader作为一款通用的模组加载器,其技术价值在于提供了统一的C#开发接口,屏蔽了底层差异,将复杂的运行时注入、内存管理等过程标准化。这使得开发者无需深入钻研晦涩的逆向工程,即可利用熟悉的C#和Unity API进行

weixin_33898233的博客 421

Unity游戏模组开发革命:MelonLoader核心架构与实战指南

在游戏模组开发领域,模组加载器是连接原生游戏与自定义内容的关键桥梁,其核心原理在于通过运行时注入技术,在游戏进程内创建安全的执行环境。这项技术的核心价值在于极大降低了模组开发与使用的门槛,使玩家和开发者能够在不修改游戏原始代码的前提下,扩展游戏功能与内容。其典型应用场景包括为《英灵神殿》、《赛博朋克2077》等热门Unity游戏添加新玩法、修复漏洞或增强体验。本文聚焦的MelonLoader,正是这一领域的革命性解决方案,它通过精心设计的引导程序、核心加载器和模组管理器三层架构,特别是对IL2CPP后端的原

weixin_34290631的博客 347
上一篇: Unity 编辑器热更C# FastScriptReload
下一篇: Unity 代码编译名词解释
ChiLi_Lin
博客等级 码龄12年 760粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值