ソースコード
https://github.com/Tencent/InjectFix
面白い仕組みだと思ったので、紹介します。
使う予定がなく、試していません。詳細な使い方はマニュアルを参照してください。
InjectFixとは
Tencentのリポジトリにある。
Unityゲームについて、アプリ本体を更新せずプログラムを修正することができる。
あらかじめパッチを受け入れるための細工をする必要がある。
3行で説明
IL2CPP以前に、パッチがあるかチェックするコードをメソッドに挿入
パッチはC#ソースコードからコンパイルして作る
InjectFixは仮想マシンを実装している
流れ
C# でこのようなコードを書く。
void AddScore(int x)
{
_score += x;
}
👇 C#コンパイラでコンパイル
👇 DLL
👇 InjectFixにより、パッチチェック・実行用コードをメソッドに挿入
👇 IL2CPPしてビルド
👇 アプリの本体提出・リリース
👇 スコアが1000以上にしたらバグることがユーザーからの報告で判明 999でカンストするようにしたら直る
👇 パッチ用のコードを書く
[Patch]
void AddScore(int x)
{
_score += x;
_score = Math.Min(_score,999);
}
👇 パッチファイルに変換。アップロード。アプリはパッチファイルをDL。完了。
パッチチェック・実行用コード挿入
パッチがあるか確認して実行するコードをメソッドに挿入します。
これはランタイムで行われるのではなくて、IL2CPPするより前に行います。
void AddScore(int x)
{
// 処理を挿入(イメージ)
if(IsPatched(12345/*メソッドを識別するために割り当てたID*/)){
CallPatchedMethod(12345, x)
return;
}
//元のコード(パッチがなければ実行)
_score += x;
}
例では戻り値なしですが、戻り値ありも対応しています。
CallPatchedMethod
で何をするかというと、仮想マシンでパッチ後のコードを実行します。
InjectFixには仮想マシンが実装されています。
このような方法ではありません。Win32アプリでx86命令を直接実行させる
感想
良い C#でパッチが書ける。
良い アプリ本体を更新しない。
悪い パッチがあるかチェックするコストがかかる。
悪い パッチは仮想マシンで実行されるため、いくらかパフォーマンスが落ちる。バグがあるよりまし。