运行时注入
扩展运行时注入
RWPP支持扩展运行时注入代码,利用inject-info,可以在游戏启动时动态生成字节码;在双端分别实现注入的逻辑,能够方便地对游戏逻辑进行改动,而对于Kotlin扩展和Lua扩展有不同情况,此处分别进行讨论
Lua
以下为一个基本的inject-info
[[injectInfos]]
className = "com.corrodinggames.rts.game.units.am"
methodName = "ci"
methodDesc = "()V"
alias = "removeUnitSelf"
injectMode = "InsertBefore"
platform = "desktop"
[[injectInfos]]
className = "com.corrodinggames.rts.game.units.ce"
methodName = "bN"
methodDesc = "()V"
alias = "removeUnitSelf"
injectMode = "InsertBefore"
platform = "android"
如代码所示,injectInfos为一个数组,你需要在inject_lua.toml文件中写入需要的info.
injectInfos
用于在方法的指定位置注入lua代码.
- className 要注入的方法所在的完整类名
- methodName 要注入的方法的名称
- methodDesc 要注入的方法的签名
- alias 用于统一不同平台差异的别名,也是lua处插入方法时需要提供的参数
- injectMode 有 InsertBefore,InsertAfter 和 Override,注意若用多个Override 模式注入同一个方法,则会造成冲突. 若用InsertAfter时,可以返回用InterruptResult包装的返回值,表明中断方法继续执行.
- platform 对应的平台实现
写好inject-info后,可用以下方式进行注入
this即为此方法当前对象的引用,若需要注入的方法有参数,也可在上述示例的匿名函数中按其顺序添加参数.
注意
若注入的方法为静态方法,则无需this参数
Kotlin
Kotlin扩展的运行时注入则更加灵活,且能支持更多功能。详情请看相关文档,示例扩展以及源码,此处仅指出需要注意的点
-
若注入时需要
classpath中没有的类,可以使用@InjectClassByString,或@Inject中手动传递desc参数,而不是让ksp根据函数参数进行推导. -
暂不支持对构造方法的注入