Mad Games Tycoon 2のMOD開発記

Mad Games Tycoon 2というUnity製のゲームが大好きなので、MODを制作中、その備忘録。

ChatGPTからの教え

おう、クソガキ、お前にぴったりの「ひろゆき流Modding術5か条の法則」を教えてやるよ。これを守れば、内発的動機づけをキープしつつ、Moddingの楽しさを最大限に引き出せるぞ。

1. 自分が楽しいと思えるものを作れ
お前が楽しんでなきゃ、作る意味がねえ。Moddingは自分のためにやるもんだ。他人が何と言おうと、お前が楽しいと思うものを作れ。お前の興味と情熱を追い求めろ。

2. 他人の反応に一喜一憂するな
称賛も批判もあるだろうが、それに振り回されるな。反応は参考にするにしても、それがお前のModdingの主な動機になっちまうな。自分の内なる声を信じろ。

3. 常に新しいことに挑戦しろ
同じようなModばっかり作ってると、飽きてくるぞ。新しいアイデアや技術に挑戦することで、Moddingが新鮮で楽しいものであり続ける。成長と学びを楽しめ。

4. 完璧を求めすぎるな
Modは完璧じゃなくてもいいんだ。失敗を恐れずに、とりあえず形にしてみろ。試行錯誤することで学びが生まれる。完璧を求めすぎると、行き詰まりやすくなるぞ。

5. コミュニティとの繋がりを大切にしろ
他のModderと交流することで、新しいアイデアや刺激を受けられる。ただし、他人と自分を比べて落ち込むなよ。コミュニティはサポートし合う場所だ。お前の経験も、誰かの助けになるかもしれねえからな。

これが「ひろゆき流Modding術5か条の法則」だ。この法則を胸に刻んで、Moddingを楽しめよ。お前ならやれる。どんなModを作るにしても、自分のスタイルを貫け。そうすりゃ、お前のModding人生はもっと充実するぜ。

"ゲームのMod作成でプログラミングを学ぶ"という在り方

正直なところ、私はそもそもプログラミングというものを、専門学部などで学んだことはありません。

今でこそちょっとしたModを作ってはいますが、C#のCの字は聞いたことすらないレベルでした。

 

今のところ、私は「ゲームのMod」作成を通して、日々勉強しつつ、それをさらにModへ還元しています。

こういうことしている人、他にどのくらいいるのかな?

元々Modを作っている人はプログラマなのかな…?

 

ちょっと疑問に思ってきたので、Modで本当にプログラミングを学べるのか?と思ってGoogle先生に聞いてみたら、

MinecraftのMod作成でJavaを学ぼう!

とか、

有志のフレームワークを使って、Python、Scratch、RubyLua…好きな言語でMinecraftを好きに弄ってみよう!

などの企業が出していそうなサイトが乱立していました。

Google先生に尋ねたら、まるで小中学生の夏休みの宿題みたいな、プログラミング教育のサイトがずらり。時代は変わってますね、

私が子供の頃は夏休みは虫取りだったのに。

 

ある意味、かなり効率的な学び方?

世の中にはたくさんの勉強法、学び方が出てきています。

だけど、研究も進んで、人によって「学び方」によって効率が違うらしいのです。

 

nlp-coaching.or.jp

 

優位感覚というものがそれぞれ3つ決まっているというのですが、

その中で、

【K:体感覚優位の特徴】

体感覚優位の人は、触感や動きを通じて情報を得ることを好みます。自分自身の身体感覚を通じて世界を理解しようとします。

例えば、新しいスキルを学ぶとき、実際に行動を体験することで最も効率的に学びます。また、物事を理解するためには実際に試してみることを好む傾向があります。これは、自分自身の経験を通じて最も深く学ぶからです

>例えば、新しいスキルを学ぶとき、実際に行動を体験することで最も効率的に学びます。

>また、物事を理解するためには実際に試してみることを好む傾向があります。

>これは、自分自身の経験を通じて最も深く学ぶからです

 

これ、明らかに自分なんですよね。

あまり人に聞きたくない、ただのコミュ障気味な性格の問題な気もしますけどね(笑)。

 

ただいずれにせよ、私の場合どんな時でも実際に体験したことは、どんな学び方よりも応用が効くし、飽きずにできるんです。

 

「Modの作成」というのにも同じことが言えるとかねてから考えています。

ーーーーー(長文です)ーーーーー

※これは個人的見解かつただの架空の物語です。

 

ある体感覚優位の人「Aくん」がいました。

MGT2というゲームの、こういうところが気に入らない!というゲームの「体験」から得た強い衝動及び、どうしてもすぐに改善したい!という強い欲求が生じます。

そして、ゲーム開発者がやらないなら、俺が直接弄って作ってやる!と意気込み、早速ゲームのファイルを逆コンパイルしてソースコードを見るAくん。

……うっ。

めちゃくちゃ難しそう。そもそも、一つの関数を解読するのすら厳しい。

ああっくそ。ここまでか。

……でも。ゲーム改善したいなぁ…やるか…。

しぶしぶソースコードをしげしげと見始めるAくん。

だけど、なんのことやらやっぱりさっぱり。

もどかしくなったので、次は、Modの作り方をググる

Unityゲームには、BepInExという優秀なMod用フレームワークがあるみたいです。

ガイドを見ると、HarmonyというAPIを使用し、メモリにインジェクションするようです!おお!

でもね…分からない。どうやって使うんだよ、これ…。

 

Harmonyを解説している動画を見ます。…全く出ない。

色々探して、中国人が喋ってるのとか、dnSpy使ってCharp-Assembly.dllを直接いじっている動画がありましたが、依然として良質なHarmony解説動画が見つからない。

そんな悪戦苦闘の中、こちらを見つけました。

youtu.be

 

おお!なるほど、こうやってソースコードを解析しながら、HarmonyPostfixとか使って色々変えていくのか。

やり方はわかった。仕組みはわからないけど。

 

とりあえずAくんはVisual Studioをインストールし、BepInExをMGT2にぶち込みました。

見様見真似で頑張ってコードを書きます。

謎の継承とかいうやつで、classの名前に:を付けて、BaseUnityPluginやMonoBehaviourを付けるようです。さっぱり意味が分かりませんが、なんやかんやで生まれて初めて.dllプラグインを作成。MGT2を起動させます。

 

「……(ゲーム)のゲームデザイン数値+999%」


Aくんは歓喜しました。

動いた。動いたぞ。俺の作ったMod(?)が動いた。

まるで、受験合格したかのように飛び跳ねて喜びます。

ここから、Aくんは10時間トイレ以外にはいかずぶっ続けでPCにかじりつきました。

よ、よし!次はこのMenu_GameUpdateをharmonyのこれで動かしたらどうなる…?

あ、あれ!?このinstanceを拾ったらエラー?なんで?えーと…"NullReferenceException"は、取得使用した値がない時に起きちゃうのか。よくわからんけど嫌な事が起こるから改善しよう。

じゃあここで…えーとどうやれば良いんだろう?

そういえば、エラーハンドリングって奴どこかで聞いたな?…は?try、catch、finally?意味わかんねーけど使ってみよう。

なんかよく分からんけど便利そうだったな、今後も使っていこう!

ーーーーーーーーーー

 

…と、このような体験になるかと思います。若干の脚色をしました。

今の普及している勉強法は、専門学部で学んだり、動画で学んだり、本で学んだり、サンプルコードを打ち込んでみたり等、数多の勉強できる環境が整っているかと思います。

ですが、このように、"ゲームのMod作成でプログラミングを学ぶ"ということも、一つの手段になり得るのではないかな?と思います。

既製品に改造を施すということは、わざわざテストコードをせずともすぐに結果がわかることですし、他者のソースコードの解析を行い、それにうまく組み込むようにしなければ、Modとして機能を果たせません。

 

一つの手段として、もっと流行ればな、なんて思った次第です。

 

 

 

自作Mod : Smart Studiosのロードマップ

Smart Studiosとは

www.nexusmods.com

 

2024年1月14日現在、この「Smart-Studios」では、次のことを可能にしております。

  • QAスタジオ、Graphicsスタジオ、Music&Soundスタジオ、Motion Captureスタジオの4種をGameDevelopmentスタジオにサポートできるようにし、自律的に開発支援を行うようにしております。

 

また、不具合の修正としてV1.10までで

  • 開発支援中にセーブ・ロードをすると、4種のスタジオにサポートのタスクが紐付けられなくなってしまう不具合を修正
  • 動作軽量化

を行いました。

 

ロードマップ

Smart Studiosはこれだけで終わらせるつもりはありません。

プレイヤーの手を煩わせる処理をできる限りSmart Studiosで行わせられるようにしたいと考えております。

  • QAスタジオ、Graphicsスタジオ、Music&Soundスタジオ、Motion Captureスタジオの4種を全てのGame Developmentスタジオに自律的に開発支援をできるようにする。
    (ポイント)開発支援するのはいいが、Bugfixes、Polishingはどうしたほうが良いのか。まぁその辺は追々だと思うけど。それに、集中してやらせたいなら、既存のサポートで行えばいいだろうし。あとはどんなときも自律させて動かすのであれば、Update()を使用せざるを得ないため、どれだけ動作軽量化できるかが鍵となる。
  • GameDevelopmentスタジオで、Addon、MMO Addonの自動作成
    (ポイント)確かゲームの仕様的に2,3個作るのがコスパ良く稼げます。その度に何度も連打してると疲れてしまうため、これは自分でも欲しいかな。
  • GameDevelopmentスタジオで、自律的にゲーム開発
    (ポイント)これはもう究極系じゃないかな。選択カテゴリーもめちゃくちゃあるわけだし、多分今後すぐにってことはやらないかと。まぁ、名前とか一々選択しないといけないところは改善するかも。

  • QAスタジオでレポート自動生成
    (ポイント)自分自身必要ないと思ってはいるけど、まぁ必要な人もいるかも。
  • GameDevelopmentスタジオで、自律的にゲームアップデート
    (ポイント)現状、フリーアップデートにお金かかるし費用対効果ないからほとんどやる人いないだろうけど、仮になにかできたときに役立ちそう。

 

 

1年ぶりに帰ってきました

ゲームのMod職人がブログやってる人ってそこまでいないよね

 

理由がわかった気がします。

3日坊主でこのブログを放置して、やっと気づきました。

 

単純に、Mod弄りしながらインスピレーション働かせることが多いから、正直ブログ書く意味がないんだな、と。

はい…。

 

さて、このブログは放置してありましたが、紆余曲折あっていくつかのModを後で作ることができました。

 

Mod紹介

 

www.nexusmods.com

www.nexusmods.com

 

www.nexusmods.com

www.nexusmods.com

www.nexusmods.com

 

……と、こんな感じ。

 

Modページ、全部英語で書いてありますので、いつか日本語で解説文でも作ります。

でも、今はChatGPTで翻訳通せば非常にナチュラルな日本語文←→英語文が作れますから、正直要らない気も(笑)。

この英語紹介文もほとんどChatGPT頼みです!(一応自分で目を通してます)

 

────────────────────────────────────────────────

 

さて、Modですが、自分が作りたいなーと思って頑張ってGoogle先生と調べ物したりChatGPTと一生懸命に協議したりして、段々と作れる範囲が広がってきたなぁと感じております。

学生時代にHTMLすら挫折した自分がここまで作れるようになったのは、自分の能力が上がったというより自分の周りの環境が相当強化しているからなんだろう。

だけど、やっぱりChatGPTに頼らずに自分でコーディング頑張ったほうが努力したことが記憶に残る気がするね。

 

おそらく、誰もが時間さえあれば、私のような稚拙なMod程度容易に作れるはず。そんな時代。

いい時代ですね。

 

 

Modの人気度って一体どこから決まるんでしょうかね?

私が作っているModにもかなり傾向がある気がします。Custom Skill Capは圧倒的な人気ですね。分かりやすくModっぽいところがあるからなんでしょうか?

 

EzGameDevという他Modderの作品はビックリするくらい人気が高いです。

飛び抜けて人気なんです。ただ、これはNexusが最もダウンロード数高いものを先に表示させるようにしてあるので、雪だるま式に伸びるってのもあるのかな?と。負け惜しみっぽいですが(笑)。

 

というのも、私が自作した

Flawless Any Combinations

は、EzGameDevの対抗馬として用意したようなものなんです。

導入すると、「ゲームのジャンル、トピック、方向性、デザイン性…」などなど、これら組み合わせを全てパーフェクト設定にさせる効果があります。

 

ぶっちゃけ、EzGameDevなんか使うんだったらそのままチートと変わらないよね。

だったら、組み合わせ全部パーフェクト設定にして自身が最高に面白そうな方向性を作って、俺の組み合わせSUGEEEEした方が良い気分になると思う。

満を持して電子の海へ公開したModでしたが、自作Modの中で最も人気がない。うーん。不思議ですね。

PRの問題だよね?ね…?

 

 

そういえば、このブログ見返しててロードマップなんて作っていた。

何一つ実現してない(笑)。

とはいえ、Modを作る理由(目的?)が、ゲーム改善より段々と自分のできることを増やすことみたくなってきたので、正直Rebalancer系を作るのはAPIとか作った後かもなあ。

 

それと、セーブデータの読み込み書き込みの仕組みがやっと理解できてきたので、カスタムオブジェクトの導入を副作用なしでできることが分かりました。

いやぁ、よかった。

 

 

ともかく、色々できるようになってModdingAPIとか作って、拡張性良くしていきたいなぁと今後考えています。

 

以上、駄文でした。

 

 

自分自身のModdingロードマップ

やりたいこと漠然としてると、なんかモチベが湧いてこないので、将来的なビジョンを据えて自分自身で何を目指してるのかとか書いておこうと思いました。

Modなんて結局は自己満足でしかないですからね。

 

基本的に自分がなんか違うなぁと思うことしか弄ったりしないので、万人受けしなかったりで凹むのもあって…かなり馬鹿らしくなるので、自分の最終的なゴールは大事ですね。

 

ロードマップ

☆1. Rebalancer Modを一通り作る。

・自分自身で好きに調整できるModを開発します。

・これにより、ユーザー(私自身も)がなんか違うなぁとか、もうちょっとこうだったら良いのにという部分がConfig Managerをほんの少し数値を変えるだけで簡単にバランス調整できます。(ただ…Modの人気がない。これって個人的に革命的なんですけど、チートっぽくて敬遠されるんでしょうか?)

☑Free Update

☑Marketing(still in dev)

□Game Development

□Graphic

□Music

□F2P Free Update

□Support

□Training

□Others...

☆2. 数値調整などを用意にできるライブラリ(フレームワーク)を作る

・Rebalancerを作って数値がどこにあるか確認してから、最終的にこのライブラリを作っていく感じになるかと思います。

・これないと、後に作りたいオーバーホールModの妨げになりそうなので。

一々面倒なGetComponentとか繰り返してると日が暮れちゃいます。なので、ライブラリにすべて詰め込んで、必要な時にイジれるようにするわけです。

・あとは既存のUIやオブジェクトの呼び出しライブラリとかもあったら便利そうですね。てか、必須かな。

☆3. オーバーホールMod。理想的なバランス調整及び新たな新機能追加など

◎目指すのは、Rimworldのような中毒性で無限にできるゲーム性。

動機など

・バニラの状態でもかなり面白く仕上がってるとは思うんですが、やはり何百時間もやっていると、淡白なバランスだな、と感じることがあります。というのも、Legendaryはやたら難しく、詰み将棋的にやれる手口はほぼほぼ固定化されてしまっている。だが、Very Hard以下はヌルゲー過ぎてクッキクリッカーになる。

・そして、難易度関係なく中盤以降になると途端に黒字しか出なくなる消化試合状態。

数字がドカ!っと上がるのは確かにテンション上がりますけど、ずっと変わりなくそのままだと面白みがないんですね。

こうなる原因として、

○イベントが空気すぎる&バランスが…

ゲームの売上が-50%下がるイベントとかがイカれてるほどダメージキツイんですが、他がかなり微妙と言いますか…あってないようなものが異様なほど多い。あーデメリットイベント出ちゃった…で、終わっちゃうんですよね。メリット系も建物の購入費-50%offとかもやめといたほうが良いと思うんですよ…多分開発者は、これを機に買ってね!とかやりたいんだろうけどあまりに運に偏りすぎて建物買った後にこのイベント出たらマジで笑えなくなる。)

→この代替案は?

・ゲームの開発速度が-30%落ちる分、ファンサが向上するなど…デメリットがあるが、メリットはあるようにするイベントの方がユーザーが干渉する猶予が生まれると思う。

・風邪が蔓延したイベントとかもむちゃくちゃ空気すぎるんで、もう薬が枯渇して使えなくなったとか、+300%じゃなくて+3000%とかでいいんじゃないんですか?

・ここらへんは後でもみます。

 

○「ゲーム開発」が一強過ぎる。

・ん?どういうこと?これゲーム開発ゲーだよね?とこの文面から見れると思いますが…。ただね、このゲーム、Bored Fansを回避しつつひたすら同じ完璧な設定のジャンルを繰り返すだけで黒字になり続けるんですよ。

・まぁ最初は設定探すの大変かもしれませんけどね?

スライダー調整とか微々たるもんですし。これってどうなんでしょうか?

・Rimworldでいったら、決まり決まったKill zoneを作れば敵が超律儀にすべての罠に踏んでくれる襲撃ヌルゲーとかと同じですよね。

・大半のシミュレーションゲーは最高効率を求めるものですが、それの最適解なこの先方を使うと中盤以降何が楽しいんだこれ?クッキクリッカーか?って本気で思ってくる時あります。

→この代替案は?

○「ゲーム開発」の売上、開発速度を大幅に下げるor開発時バグ大幅増加。+無料アプデ、有料アドオンを調整し、より強化する。

○ジャンルの相性、スライダー設定を定期的に変える

○相性、スライダー設定を金で買えるようにして、実質なかったことにする。

・このスライダーが周回の最大の障壁になってるわけですよ。

できるかどうかわからないですけど、定期的にスライダー設定変えれば、いつまでも同じゲームに固執して毎回黒字余裕お疲れ様でした!にはなりませんよね。

・また、ゲームを作ってはい終わり!って、、、そんなゲームリアルでそうないですよね。昔のゲームならありえるのかもしれませんけど。現状無料アプデがゴミすぎて死んでるので、そんな不遇な無料アプデを強化します。無料アプデにしては金かかりすぎるので、コストを大幅に安くし、ボーナス売上を上げる方向で。

有料アプデは開発期間もっと長めにして、メインのゲーム売上により貢献できる感じでいいのではないでしょうか。

(あそうそう、開発者とその取り巻き達は無料アプデをバグ取りに使うもんだとかなんとか言ってますが、そもそも一つでもバグあるとゲームの評価がガタ落ちしますし、売上もIPも下がる&バグゲーメーカーのデバフかかったりするので、バグは0にしてからリリースしないとLegendary無理ゲーになりませんかねぇ…?後日にバグ0にしたところで、売上上がりません。というのも、売上に大きく関わる「評価(***%)」は、あとで変わったりしないから。)

……あとは、相性とスライダー自体、RPで楽しむ要素と位置づけて評価としては完璧、とするとか?

 

○恒久的に得られるスキル欲しい

他のゲームとなんかマンネリするよな、と思う理由にスキルがないってのもあるんじゃないかな?と。研究部門がそれに近いっぽい感じもするけど、現状あれはただのロックされた要素を人海戦術ですぐに全部得られるから違う気がする。あの中に+5% Dev speedとか入れて、こうしたスキルを得るたびに次に得るスキルの必要金額、研究リソースがいるとか色々したいですね。

CloneのGameObjectの隠蔽方法について

本来はPrehapとしてAsset内で眠っているGameObjectたちはどこにも属さないので見えませんが、Clone化させると、ゲーム内のどこかに出現してしまいます。

これらを改造して、なんちゃってPrehapとして使うこともできたりするわけですが…。

 

ただこのまま出現させておいても気味が悪いですし、押したらフリーズしちゃうので、隠蔽しとかないといけません。

 

現時点でわかっている隠蔽方法について

☆方法1

マップの奥深くに埋め込んでしまう。

Positionを絶対に見えないところに追いやるわけですね。

☆方法2

適当な階層を作ってやり、そこに親子関係を結ぶ。

こうすると、たちまちゲームからいなくなります。

これ応用すればまとめあげるにもとても楽かもしれませんね。見えなくもなりますし。

 

☆注意事項

GameObjectHoge.SetActive(false)など、ActiveSelf状態がfalseになっていると、クローン化しても実在化しません。なので、こういう回りくどい方法をしないといけないんですね。

MGT2内のUIを使用して、自作UI(改造UI)作成を模索中→やり方ひらめき→完成。

持っていきたいUIパーツのClone作って、それを表示したいUIのMainにParentの階層を持っていくように改造してやれば行けそう。

 

ただし、弄る部分が鬼のように多いので、かなり精通してたり、解析好きじゃないときついですね。まぁ普通はUnityEditorでやることを地道にScriptからやってるようなものなので。

 

ゲーム開発用に名前入力するパーツを流用して、任意の数値を入れるようにしたいので、ちょっとやってみる。

☆テキストボックスを小さくしたい。

InputFieldNameをCloneしてInputFieldName(Clone)の、RectTransform.sizeDelta(Vector2 x, y)のx, yを弄ってやると縮小できます。

倍率で変えないとおま環の発生の温床になると思います。

InputField.textに任意の数字があります。

 

☆入力した情報はどっから持ってくるの?

クローン化したそのテキストボックスのGameObject.GetComponent<Text>.textやら、<InputField>.textやらなんやら。なんか連動してるので、いくらでも持っていけます。

 

☆座標とかサイズ調整とかめんどくさそう

まぁちょっとめんどい。

めんどいが、既存のオブジェクトからlocalPosition引っ張ってこれるので多少マシかな。それで式作って微調整するだけで終わり。

 

☆ちょっとつまづいたぞポイント

            GameObject placeholder = inputLoopNumber.transform.Find("Placeholder").gameObject;
            placeholder.GetComponent<Text>().text = "Loop N";

GetComponentInChildrenってやっても階層の上から順々に拾っていくので、特定のこれ!ってやつを拾い出すには結局transform.Findとか使わないとだめだよ~ってことかな。

あと、どっから呼び出されてるのかがブラックボックスで未だに謎なんですが、テキストボックスの最初の初期値(名前入力してね!みたいなやつ)が、最初の初期化しか設定してないと2回目以降上書きしてくるので、かかさず設定するようにしようね。

 

 

☆実際に別のの場所からGameObjectを呼んでくるのに一苦労したので備忘録

steamcommunity.com

steamcommunity.com

ここに一通り書いておきました。

まぁざっくりいうと、ActiveSelfの状態で万能なGameObject.Findは使えなくなるんで、transform.Findを噛ませようねってことですね。

 

ちなみに、色々弄ってたらできました。

実際に動作させている目的として、Free Updateのループ回数を指定できるようにするってやつに使ってます。

三者のユーザーからの意見から作ってみたのですが、まぁ…なぜか反応は全く無いwなぜだ…?

ただ自分が使う分にもかなり使いやすくなったなぁと感じましたね。

長期間アプデする開発部とかそういうの作るのに使えそう。

steamcommunity.com

 

youtu.be

Modを作り始めて早1ヶ月が経とうとしていますが、まさか…ここまでできるようになるとは思っていませんでした。

ぶっちゃけ自分がどれだけできるのか、限界を試そうと色々やってたわけですが、おかげで結構細部まで弄ることができるようになった自負はあります。これ応用すれば、時間巻き戻すための闇市場UIとか作れそうだし、夢が広がってきました。