UnityInjection:Unity运行时注入的强大工具
项目地址:https://gitcode.com/gh_mirrors/un/UnityInjection
项目介绍
UnityInjection 是一个专为Unity开发者设计的运行时注入模块,能够在运行时动态改变被注入函数的实现。无论是修改Unity引擎的源码,还是实现用户自定义的装饰器和AOP(面向切面编程),UnityInjection都能轻松应对。该项目支持Mono和IL2CPP两种后端,并且完全在UnityEditor下进行注入,无需依赖外部工具。
项目技术分析
UnityInjection的核心技术在于其能够在编译时织入代码,确保运行时的兼容性。具体来说,它在打包的Link阶段修改DLL,使得注入的代码在Runtime生效;在编辑器模式下,则通过Domain Reload实现注入。这种设计不仅保证了注入的灵活性,还避免了运行时的性能损耗。
此外,UnityInjection还支持修改引擎源码,这在其他注入模块中是难以实现的。通过自定义类继承IInjection
接口,并实现ProvideInjections
方法,开发者可以轻松定义需要注入的代码逻辑。
项目及技术应用场景
UnityInjection的应用场景非常广泛,尤其适合以下几种情况:
- 修改Unity引擎源码:如果你需要对Unity引擎的某些行为进行定制化修改,UnityInjection提供了一种安全且可控的方式。
- 实现AOP编程:通过注入代码,你可以在不修改原有代码的情况下,实现日志记录、性能监控等功能。
- 装饰器模式:UnityInjection支持用户自定义的装饰器,可以在运行时动态添加或修改功能。
- 数据代理:通过注入,你可以实现数据的动态代理,方便进行数据验证、缓存等操作。
项目特点
- 完全基于UnityEditor:无需依赖外部工具,所有注入操作都在UnityEditor下完成。
- 支持IL2CPP和Mono:无论是Mono还是IL2CPP后端,UnityInjection都能完美支持。
- 修改引擎源码:不仅可以修改用户代码,还能注入Unity引擎的源码,功能强大。
- 灵活的注入方式:通过自定义类继承
IInjection
接口,开发者可以灵活定义注入逻辑。 - 编译时织入:在编译时进行代码织入,确保运行时的兼容性和性能。
快速开始
安装
你可以通过以下两种方式安装UnityInjection:
-
通过git url安装:
- 安装依赖库:DirectRetrieveAttribute
- 通过git url安装UnityInjection。
-
通过openupm安装(推荐):
- 执行命令行:
openupm add com.bbbirder.injection
- 执行命令行:
基本用法
以下是一个修改Debug.Log
的简单示例:
using com.bbbirder.injection;
using UnityEngine;
public class FirstPatch
{
static Action<object> RawLog;
static void Log(object msg){
return RawLog.Invoke("[msg] "+msg);
}
internal class MethodReplacer : IInjection
{
public IEnumerable<InjectionInfo> ProvideInjections()
{
yield return InjectionInfo.Create<Action<object>>(
Debug.Log, // 替换 Debug.Log
FirstPatch.Log, // 使用 FirstPatch.Log
f => FirstPatch.RawLog = f // 保存原始方法到 FirstPatch.RawLog
);
}
}
}
在初始化时调用:
FixHelper.InstallAll(); // 查找所有注入标记,并使其生效
测试成果:
Debug.Log("hello"); // 输出: [msg] hello
更多用法
UnityInjection还支持更多高级用法,如装饰器、数据代理和依赖注入。详细的使用方法可以参考附带的Sample工程和文档。
可能的问题
在使用过程中,你可能会遇到一些问题,如异步方法无法打印完整、注入时未搜索到标记的方法等。这些问题大多可以通过调整Unity的设置或修改代码逻辑来解决。
未来计划
UnityInjection的开发团队正在积极完善项目,未来的计划包括:
- 更多Unity版本的测试和支持。
- 优化Editor下的注入速度,减少Domain Reload的时间。
- 支持泛型方法的注入。
如果你在使用过程中遇到任何问题,欢迎提交ISSUE或PR,帮助我们改进这个强大的工具。
通过以上介绍,相信你已经对UnityInjection有了初步的了解。无论你是Unity引擎的深度用户,还是希望在项目中实现更多灵活功能的开发者,UnityInjection都将成为你不可或缺的得力助手。赶快尝试一下吧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考