現在、浮気がバレたら死というゲームを作ってます。
今作でゲーム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で、これを改善したのはイベント実行順の見える化です。
イベント設定は少し面倒ですが、簡単に設定できるよりもデバッグしやすいほうがいいです。
ゲーム作りは「この条件のときに、最短でデバッグしたい」という局所デバッグが頻発するので、後々楽をするほうが時短になると思ってます。