CITIES: SKYLINES の MOD 開発環境の整え方、デバッグ出力の出し方
(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(キーバインドを変更していなければ)で出るやつ