同人ゲーム unityエディター拡張紹介

現在、浮気がバレたら死というゲームを作ってます。

今作でゲーム8作目、unityだと4作目になります。結構増えてきましたね。

ここでは、ゲーム内容ではなく、作成したエディター拡張を紹介します。

  • unityのバージョン:2021.3.21
  • 使用アセット:会話などのイベントはFungus、キャラクターエディターはCharacter Editor 4Dを使ってます。
タイルマップまとめ塗り

タイルマップはレイヤー3つ(Background、Middle、Front)に分かれてます。青丸がMiddleレイヤー、赤丸がFrontに貼り付けるセルになります。

例えば青い丸のセルを選択すると、ActiveTilemapがmiddleになり、そのまま塗れるようにしてます。これをしないと、いちいちActiveTilemapを切り替えなくてはいけませんので、自動化してます。

ここまでは前作でも出来ていたことですが、レイヤーが違う場合、範囲指定してのまとめ塗りができなかったので不便でした。

それを改善し、まとめ塗りをできるようにしました。これで、大きな木でもペタッと一回で貼り付けれます。

Fungus変数を一意にする

Fungusの拡張はやったところが多すぎて覚えてないのですが、その中でこれは使えると思ったのは変数に一意のキーに割り当てて、それを利用することでした。

標準のまま使っていると問題がありました。

この変数はツクールのようにイベント発生条件で設定したりして使うのですが、変数リスト(上図)から変数名を変更すると、設定していた変数が未設定になってしまうという問題が。

これはstring(変数名)で設定していたのが問題で、そんな変数名はないよ、ということになり未設定になるわけです。じゃあint(変数のインデックス、つまり順番)で設定すると解決かと思いきや、うまくいきません。

今度は変数リストの順番を変更すると、設定していた変数が違う変数になります。後々、順番を変更するのはよくありますので、これも×。

そこで、変数に一意のキーに割り当てて使用する方法です。

具体的には、Variable.csにuniqueKeyという変数を追加。

    public abstract class Variable : MonoBehaviour {
        [SerializeField] protected VariableScope scope;
        [SerializeField] protected string key = "";
        //★追加
        [SerializeField] public string uniqueKey;
※以下省略

VariableSelectPopupWindowContent.csのAddVariableに追加します。

        public static void AddVariable(object obj, string suggestedName)
        {
            System.Type t = obj as System.Type;
            if (t == null)
            {
                return;
            }
            var flowchart = curFlowchart != null ? curFlowchart : FlowchartWindow.GetFlowchart();
            Undo.RecordObject(flowchart, "Add Variable");
            Variable newVariable = flowchart.gameObject.AddComponent(t) as Variable;
            newVariable.Key = flowchart.GetUniqueVariableKey(suggestedName);
            //★uniqueKeyに一意キーを入力
            newVariable.uniqueKey = GameCommon.GetUniqueKey();
※以下省略

AddVariableは変数を追加するときに使われるメソッドで、★の部分で一意のキーを割り当ててます。

GameCommon.GetUniqueKeyの中身は以下。

    public static string GetUniqueKey() {
        System.Guid guid = System.Guid.NewGuid();
        return guid.ToString();
    }

これで、名前を変えても順番を変えても大丈夫な変数ができました。

場所移動設定を簡単に(マウスクリック)

ツクールのように移動先をマウスでポチッと設定できるようにしました。

移動場所はギズモ表示してます。

マウスで指定にチェックを入れてから、シーン上をクリックすると座標が自動入力されます。

今までは移動先のゲームオブジェクトを作成して、そのゲームオブジェクトを指定してました。

これでも設定できるのですが、面倒くさい…というわけで変更。

イベント実行順の見える化

これはデバッグのときに役立ちます。

リンクという部分に並んでいるのがフラグ(ツクールでいうセルフスイッチ)が変化するイベントで、これが順番になっています。

つまり、一番上の「ヒロイン会話」イベントのフラグが立つと、「サブ会話」イベントが実行または変化し、そのフラグが立つと、「夜」イベントが実行または変化します。

横のチェックボックスにチェックするとフラグが立ちます。

デバッグのとき、例えば、上から三つ目の「夜」イベントから開始させたいとき、上と二つ目にチェックを入れて実行するだけで、「夜」イベントから開始されます。

ちなみに、ボタンを左クリックすると該当のゲームオブジェクトが選択され、右クリックでイベント(fungusのコマンド)が選択されます。

ボタンの順番は単純に、ボタン順を手動入力して入れ替えてます。

まとめ

エディター拡張はゲーム作り環境の改善に他ならないわけです。unityだとそれが実現できます。

ツクールで作っていたとき、いくつか不満点がありました。確かに簡単にゲームが作れるツールなのですが、拡張性の幅が少ないのと、デバッグがしにくいなと感じてました。

ツクールでデバッグをするとき、うる覚えですが、最初の自動イベントにスイッチや変数を追加して、この条件のときはどうか、みたいなことをしていたと記憶してます。

unityで、これを改善したのはイベント実行順の見える化です。

イベント設定は少し面倒ですが、簡単に設定できるよりもデバッグしやすいほうがいいです。

ゲーム作りは「この条件のときに、最短でデバッグしたい」という局所デバッグが頻発するので、後々楽をするほうが時短になると思ってます。

タイトルとURLをコピーしました