(動画付き)Cities: Skylines MODプログラミングの始め方をわかりやすく解説

2021年2月23日

Cities: Skylinesはとてもよくできた都市開発シミュレーションゲームです。

特徴のひとつとして公式にゲーム側がMODに対応しているので、ゲームをより楽しく遊ぶための様々なMODがユーザによって作成されて公開されています。

ここでは機能追加や独自のシステムを追加するような、プログラミングを伴う自作MOD開発を始めるための環境構築する手順を解説していきます。

さらにサンプルとしてChirper(画面中央上部に表示されている青い鳥)に10秒おきに現在時刻をしゃべらせるMODを作ります。

更新履歴

  • 2021/03/30 アイキャッチ画像の変更

参考動画

この記事と一緒に見ると実際の一連の流れがわかりやすい動画版も公開していますので参考にしてみて下さい。

Cities: Skylines わかりやすいMODプログラミング環境構築

環境構築

Visual Studio 2019 のセットアップ

以下のMicroSoftのサイトよりVisual Stuidoのインストーラーをダウンロードしてセットアップします。

個人利用では無料で利用できるコミュニティ版がおすすめです。

※ライセンスの利用条件は各自しっかりと確認して下さい。

Visual Studio インストーラー ダウンロード

ダウンロードしたインストーラーを起動するとVisual Studioのセットアップが起動します。

以下のワークロードを有効化してインストールボタンを押します。

  • .NET デスクトップ開発
  • Unity によるゲーム開発
Visual Studio インストール セットアップ

インストールが開始されるので完了までしらばく待ちましょう。

.NET Framework 3.5 の有効化

Cities: SkylinesのMODプログラミングに必要な.NET Framework 3.5を有効化します。

コントロールパネルよりプログラムのアンインストールを起動します。

コントロールパネル

※コントロールパネルの呼び出し方が分からない場合は動画を参考にして下さい。

プログラムと機能が表示されますので左のメニューからWindows の機能の有効化または無効化を選択します。

コントロールパネル プログラムのアンインストール

Windows の機能で.NET Framework 3.5(.NET 2.0 および 3.0 を含む)をチェックしてOKボタンを押します。

Windowsの機能の有効化

Windows Update でファイルを自動ダウンロードするを選択してしばらくすると.NET Framework 3.5が有効になります。

MOD開発

クラスライブラリのプロジェクト作成

Visual Studioを起動したら新しいプロジェクトの作成でクラスライブラリ(.NET Framework)を選び、フレームワークに.NET Framework 3.5を指定します。

Visual Studio ランチャーメニュー
Visual Studio プロジェクトテンプレート選択
Visual Studio プロジェクト設定

参照の追加

ソリューションエクスプローラーのプロジェクト配下に表示されている参照を右クリックして参照の追加を選択し、参照マネージャーを開きます。

Visual Studio メイン画面
Visual Studio 参照の追加

この画面でMODの作成に必要なCities: Skylines内のDLLへの参照を追加します。

Visual Studio 参照マネージャー

参照する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は環境によって異なる場合があります。

DLL Cities: Skylines Modsフォルダ コピー

ユーザMODの有効化

Cities: Skylinesのゲームを起動してコンテンツマネージャーのMODより作成した自作MODが表示されていることを確認して有効化します。

Cities: Skylines コンテンツマネージャー

Chirperの確認

実際のゲーム画面でChirper(画面中央上部の青い鳥)が10秒おきに現在時刻をしゃべっていることが確認できると思います。

Cities: Skylines Chirper

最後に

今回はここまで。

駆け足になりましたが簡単な自作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