ゲームの動作に介入するアドオンの作成方法 (How to develop the add-on for modding the game)

Created at
Updated at

Twitter で投稿していましたが、ゲームの動作に介入するタイプのアドオンの作成方法について、暫定記事を起こしました。

As posted on my Twitter account, I have written a preliminary article (in Japanese language) for developing the add-on for modding the game.

[URL] https://yakuentei.jp/article/gamedev/unity_rmu_addon/ 

記事の冒頭にも書いたとおり、Twitter 上で複数名の方からご助力・情報提供もいただき、ゲームの動作を書き換えるためのアドオンの作成が現実的にできる状況になってきたと思います。

従来ツクール (JavaScript) で許されていた上書き型のオーバーライドは、本来 C# であれば言語仕様的にできないはずですが、公式の AddonInstance.ExchangeFunctionPointer() メソッドで実現できることが分かりました。

  • このテクニックは、本コミュニティ上の「Faster Project Loading」で紹介されている agoaj さんのアドオンでも使用されているので、参考になると思います。 (このアドオンが Twitter 上で紹介されていたことが大きなヒントになりました。)

記事で紹介しているように、例えば GameBattlerBase.SkillMPCost() のような static ではない public のメソッドでも、ポインターの差し替えによるオーバーライド (事実上「乗っ取り」) ができますので、従来ツクールのプラグイン作者であれば色々できる可能性を秘めていると考えています。

また、複数の Scene 間に跨いで常駐し、フレームレート (FPS) 表示を行うなどの例も一緒に記事に掲載しています。

さて、私よりも Unity や C# に詳しいゲーム開発者の方は多いと思いますし、私自身も Twitter 上で複数の方から情報をいただけたからこそ、ここまでまとめることができました。この場を借りてお礼を申し上げます。

より高度な技術を持っている方には、是非、より素晴らしい解説記事や、アドオンのサンプルなどを起こしていただけることを願っております。

Comments

Created at
Updated at

情報提供ありがとうございます!大変有用な情報のように思います。


Created at
Updated at

ありがとうございます!

本日、記事を編集して、private や protected の場合でも書き換えられる方法も追記しました。 また、メソッド以外にも、プロパティやメンバー変数にもアクセスできるようになりました。

 

ただ、本テクニック (C# の Reflection と呼ばれている機能です) を使用してアドオンを実装した場合、iOS 版など (ビルドで IL2CPP を使用する必要がある場合) でうまく動かない可能性もあるようです。

私だけだと解決できない問題も多いので、詳しい方には本コミュニティなどで積極的に情報共有していただけるとうれしいと思ってます。


Created at
Updated at

アドオンからメソッド差し替えを行う件、英語ですけれども、RPGツクール公式の Discord サーバー上で活発な議論が行われていますので、こちらにも情報展開したいと思います。

About swapping the method from add-on, there are lively discussions in English on RPG Maker official Discord server (following URL).

  • https://discord.gg/8TZDDgPked
  • 本コミュニティの「Add-on Showcase/アドオン紹介」に投稿している Agoaj さん、FFF1969 さんも参加しています。 (Agoaj and FFF1969, who contribute to "Add-on Showcase/アドオン紹介" on this community are also participating.)
  • 場所は、「GENERAL - EN」の中の「rpgmaker-unite」チャンネルです。 (The place of the channel is "GENERAL - EN" > "rpgmaker-unite")

英語に抵抗の無い方は、一度覗いてみても良いかもしれません。 (If you are not against reading/writing English, it might be good idea to check this channel.)


Created at
Updated at

こんにちは。記事を読ませていただきました。とても良くまとまっていると思います。

IL2CPPでの関数ポインタの交換は、私の方でもいろいろ調べてみたのですが、解決方法は見つかりませんでした。関数ポインタの交換の利用は、エディタの機能を書き換えるときだけに留めておいたほうが良いかもしれません。

拙作のサンプルゲームでは、代わりの方法として、メソッドのボディを文字列の置換で置き換える方法を使っています。サンプルゲーム「復讐する王子と竜が残した剣」のプロジェクトに同梱している「ReplaceCodesAddon」がそれです。参考になれば幸いです。

あとで専用のスレッドを立ててみます。


Created at
Updated at

ありがとうございます!

公式 Discord でもやりとりさせていただいたとおり、本アドオンを使用したメソッド差し替えの件も、導入手順、使用例を記事にまとめました! (元記事がだいぶ肥大化したため別記事に分割)

これで iOS 向けなど IL2CPP 必須の環境向けに Unite が盛り上がってくれると嬉しいですね。

https://yakuentei.jp/article/gamedev/unity_rmu_addon2/


Created at

ツクール初心者&アドオン初心者なのですごく助かりました。

ありがとうございます。


Created at

This is great, thanks!