(動画付き)Cities: Skylines MODプログラミングの始め方をわかりやすく解説
Cities: Skylinesはとてもよくできた都市開発シミュレーションゲームです。
特徴のひとつとして公式にゲーム側がMODに対応しているので、ゲームをより楽しく遊ぶための様々なMODがユーザによって作成されて公開されています。
ここでは機能追加や独自のシステムを追加するような、プログラミングを伴う自作MOD開発を始めるための環境構築する手順を解説していきます。
さらにサンプルとしてChirper(画面中央上部に表示されている青い鳥)に10秒おきに現在時刻をしゃべらせるMODを作ります。
更新履歴
- 2021/03/30 アイキャッチ画像の変更
参考動画
この記事と一緒に見ると実際の一連の流れがわかりやすい動画版も公開していますので参考にしてみて下さい。
環境構築
Visual Studio 2019 のセットアップ
以下のMicroSoftのサイトよりVisual Stuidoのインストーラーをダウンロードしてセットアップします。
個人利用では無料で利用できるコミュニティ版がおすすめです。
※ライセンスの利用条件は各自しっかりと確認して下さい。
ダウンロードしたインストーラーを起動するとVisual Studioのセットアップが起動します。
以下のワークロードを有効化してインストールボタンを押します。
- .NET デスクトップ開発
- Unity によるゲーム開発
インストールが開始されるので完了までしらばく待ちましょう。
.NET Framework 3.5 の有効化
Cities: SkylinesのMODプログラミングに必要な.NET Framework 3.5を有効化します。
コントロールパネルよりプログラムのアンインストールを起動します。
※コントロールパネルの呼び出し方が分からない場合は動画を参考にして下さい。
プログラムと機能が表示されますので左のメニューからWindows の機能の有効化または無効化を選択します。
Windows の機能で.NET Framework 3.5(.NET 2.0 および 3.0 を含む)をチェックしてOKボタンを押します。
Windows Update でファイルを自動ダウンロードするを選択してしばらくすると.NET Framework 3.5が有効になります。
MOD開発
クラスライブラリのプロジェクト作成
Visual Studioを起動したら新しいプロジェクトの作成でクラスライブラリ(.NET Framework)を選び、フレームワークに.NET Framework 3.5を指定します。
参照の追加
ソリューションエクスプローラーのプロジェクト配下に表示されている参照を右クリックして参照の追加を選択し、参照マネージャーを開きます。
この画面でMODの作成に必要なCities: Skylines内のDLLへの参照を追加します。
参照するDLLの場所は以下になります。
スチームゲームフォルダ\steamapps\common\Cities_Skylines\Cities_Data\Managed
今回参照に追加したDLLは以下になります。
ICities.dll
ユーザMODに必須のDLLです。必ず参照に追加する必要があります。
ColossalManaged.dll
Cities: SkylinesのUI機能に関連するDLLです。
Assembly-CSharp.dll
Cities: Skylinesのゲーム機能に関連するDLLです。
UnityEngine.dll
Cities: SkylinesはUnityで作られており、そのUnityの機能のDLLです。
ユーザMODクラスの追加
ICitiesをusingしてIUserModを継承したMOD情報設定クラスを作成します。
コードは以下のようになります。
using ICities;
namespace ClassLibrary1
{
public class Class1:IUserMod
{
public string Name
{
get { return "My Mod Name"; }
}
public string Description
{
get { return "My Mod Description"; }
}
}
}
このクラスのNameプロパティでMODの名前を、DescriptionプロパティでMODの説明分を返すようにします。
これがMODの基本コードであり、このコードをベースに機能を拡張していくことになります。
Chirper拡張クラスの追加
今回はサンプルでChirperの機能を拡張するMODを作りたいと思います。
全体のコードは以下のようになります。
using System;
using ICities;
using ColossalFramework;
namespace ClassLibrary1
{
public class Class1:IUserMod
{
public string Name
{
get { return "My Mod Name"; }
}
public string Description
{
get { return "My Mod Description"; }
}
}
public class ChirpExtension : ChirperExtensionBase
{
private DateTime dt;
private ChirpPanel cp;
private class ChirpMsg : IChirperMessage
{
public string senderName
{
get; set;
}
public string text
{
get; set;
}
public uint senderID
{
get; set;
}
}
public override void OnCreated(IChirper c)
{
dt = DateTime.Now;
cp = Singleton<ChirpPanel>.instance;
base.OnCreated(c);
}
public override void OnUpdate()
{
var now = DateTime.Now;
if(now - dt > TimeSpan.FromSeconds(10))
{
var msg = new ChirpMsg();
msg.senderID = 0;
msg.senderName = "My Mod";
msg.text = now.ToString("F");
cp.AddMessage(msg);
dt = now;
}
base.OnUpdate();
}
}
}
先ほどのベースとなるコードに、Chirperの機能を拡張するためのChirperExtensionBaseを継承したChirpExtensionクラスが新たに追加されています。
Chirperが最初に作られた時に呼ばれるOnCreatedメソッドでChirpPanelのインスタンスを保存しておき、
画面更新のタイミングで呼ばれるOnUpdateメソッドで経過時間を判定して10秒おきにChirpPanelのAddMessageメソッドで現在時刻メッセージを追加しています。
プロジェクトのビルド
コードが完成したらプロジェクトをビルドします。
Visual Studioの上部メニューよりソリューションのビルドまたはリビルドを選んでビルドを行います。
コード上で特に間違いがなければビルドが成功(0 失敗)となり、ソリューションのプロジェクトフォルダ下のbin\Debugまたはbin\DebugにDLLが出来ていると思います。
MOD動作確認
DLLのコピー
ビルドで出来たDLLを以下の所定の場所にコピーします。
C:\Users\ユーザ名\AppData\Local\Colossal Order\Cities_Skylines\Addons\Mods\任意のフォルダ名
※C:\Users\ユーザ名\AppDataは環境によって異なる場合があります。
ユーザMODの有効化
Cities: Skylinesのゲームを起動してコンテンツマネージャーのMODより作成した自作MODが表示されていることを確認して有効化します。
Chirperの確認
実際のゲーム画面でChirper(画面中央上部の青い鳥)が10秒おきに現在時刻をしゃべっていることが確認できると思います。
最後に
今回はここまで。
駆け足になりましたが簡単な自作MODを作れるところまでを解説してみました。
Cities: Skylinesの自作MODの作り方に関して、アセット系作成の日本語のページや動画はよく見かけるのですが、プログラミング系の日本語ページや動画はほどんど見かけないので作ってみました。
これで少しでもCities: Skylines自作MODプログラミングの最初のハードルを下げることができれば幸いです。
次回はもう少しレベルアップしたMODを制作する記事を書きたいと思っています。
参考情報
CITIES: SKYLINES の MOD 開発環境の整え方、デバッグ出力の出し方 – C++ ときどき ごはん、わりとてぃーぶれいく☆
Modding API – Cities: Skylines Wiki
Mod関係資料集 – Cities:Skylines攻略情報wiki
GitHub – mio991/ModChitter: A Mod for Cities Skylines that trys to send tweets as Chirper messages