(note: Windows 10, Visual Studio 2017, STEAM 環境向け)
① MOD 開発環境の整え方
理屈はめんどくさいので解説しないよー😃
CITIES: SKYLINESを STEAM で導入- Visual Studio Installer で
WorkloadsタブのGame development with Unityを導入 - Visual Studio で MOD 開発の Class Library プロジェクトを作る。
- Target Platform = .net Framework 3.5
- CITIES: SKYLINES アプリに同梱されている
mono.dllをデバッガブルなビルドへ置き換える- 置き換え元:
C:\Program Files (x86)\Steam\steamapps\common\Cities_Skylines\Cities_Data\Mono\mono.dll - 置き換え先(ソースからビルドして用意したい場合): https://github.com/thardie/mono/tree/unity-5.6
- (ビルド済みを調達して済ませたい場合): https://www.orcas.net/cities_skylines/mono.dll
- 置き換え元:
- Windows の環境変数へ
MONO_DEBUGGER_AGENT=transport=dt_socket,address=127.0.0.1:56000,defer=yを追加 - Visual Studio の MOD 開発プロジェクトに CITIES: SKYLINES の DLL 参照を追加
- DLLの場所:
C:\Program Files (x86)\Steam\steamapps\common\Cities_Skylines\Cities_Data\Managed - MOD に必要最小限のDLL:
ICities.dll
- DLLの場所:
- 適当なソースへ
ICitiesインターフェースを実装したクラスを定義†してビルド - ビルドした MOD の DLL を
%LOCALAPPDATA%\Colossal Order\Cities_Skylines\Addons\Mods\以下へ配置\Mods\ore_ore_mod_name\ore_ore_mod.dllのようにディレクトリーを切って放り込んでもよい
STEAMクライアントが既に動作していれば終了させておく(重要: デバッガーが挿さらない場合は忘れている可能性あり)- CITIES: SKYLINES を起動し、
Content Managerの MOD に↑で放り込んだMODが列挙される事を確認 - Visual Studio のメニューから
Debug👉Attach Unity Debugger👉Input IP👉127.0.0.1:56000でデバッガーの接続を確認 - SKYLINES WIKI - Modding API や CITIES: SKYLINES の DLL をオブジェクトブラウザーで眺めるなどしてお好みの MOD を開発する
- ビルドのポスト処理で MOD の DLL のコピーを自動化するとかは必要に応じて好きにしてください・w・
†適当なソース例↓
using ICities; namespace usagi.CitiesSkylines.Example1 { public class Example1: IUserMod { public string Name => "うさぎさんえぐざんぽー1号"; public string Description => "ヒャッハー!えぐざんぽーだぜ!!"; } }


② デバッグ出力の出し方
- 参照に追加
UnityEngine.dll,Assembly-CSharp.dll,ColossalManaged.dll
- デバッグ出力メソッドを叩く
Debug.Log( UnityEngine ) //C:\Program Files (x86)\Steam\steamapps\common\Cities_Skylines\Cities_Data\output_log.txtへ出力されるDebugOutputPanel.AddMessage( Assembly-CSharp, ColossalManaged ) // CITIES: SKYLINES ゲーム中の F7 で表示のデバッグ出力ゲーム内ウィンドウに出力される
実装例:
using ColossalFramework.Plugins; using ICities; using UnityEngine; namespace usagi.CitiesSkylines.Example2 { public class Example2: IUserMod, ILoadingExtension { public string Name => "うさぎさんえぐざんぽー2号"; public string Description => "見せてもらおうか、CITIES: SKYLINES の MOD のデバッグ出力とやらを!"; void DebugMessage( string m ) { Debug.Log( m ); DebugOutputPanel.AddMessage( PluginManager.MessageType.Message, m ); } public void OnCreated( ILoading loading ) { DebugMessage( $"UCSE2 てすてす OnCreated; loading={loading}" ); } public void OnLevelLoaded( LoadMode mode ) { DebugMessage( $"UCSE2 てすてす OnLevelLoaded; mode={mode}" ); } public void OnLevelUnloading() { DebugMessage( "UCSE2 てすてす OnLevelUnloading" ); } public void OnReleased() { DebugMessage( "UCSE2 てすてす OnReleased" ); } } }
他のログと混ざるので、ログから目grepしやすいように適当にユニークな出力文字列を入れておくとよい。
↓ゲーム中にF7(キーバインドを変更していなければ)で出るやつ
