Unityでゲームジャムやるときのテンプレートを作ってみた

# テンプレ使って時間短縮したい

**初投稿です！**

私は現在専門学生で、月に1回ゲームジャムをする授業を受講しています。1チーム7人、約7時間でゲームを完成させるのが目標なのですが、いっつも時間がギリギリになってしまいます。そこで毎回必要になる機能をあらかじめ作って、使いまわせるようにしようと考えました。

# 必要なもの

* 時間のカウントと表示
* スコアのカウントと表示
* シーン(インゲーム, タイトル, リザルト)
* データの保存
* 日本語フォント
* 必要なパッケージのインストール

特に日本語フォントは用意するのが手間なので、このテンプレートが役に立つはず。

# 実装してみる

### 時間のカウントと表示・スコアのカウントと表示

この2つについては普通に実装したので、特に語ることはないです。

### シーン
とりあえず3つ用意しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802709/0b5ede20-e55b-d3ef-8ef1-8b9f0aa3704a.png)

Unityでゲームを作っていると「エディタでのシーンの切り替えがちょっと面倒」って思います。そこで、メニューバーからシーンの切り替えができるようにしてみました。これで毎回プロジェクトウィンドウからシーンを探し出す手間とはさよならです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802709/3dfbd4f2-098d-69aa-6567-61ab170b3f75.png)

```cs:SceneSwitcher.cs
// 再生中か
if (EditorApplication.isPlaying)
{
    SceneManager.LoadScene(sceneName);
}
else
{
    EditorSceneManager.OpenScene(ConfigLoader.GetConfig().MenuSceneSwitcherConfigData.ScenesFolderPath + sceneName + ".unity");
}
```

EditorApplication.isPlayingで処理を分けることにより、エディタとランタイムどちらでも切り替えることができます。

ついでに、今どのシーンにいるかを判断してボタンの横にチェックマークを表示したのですが、かなり不格好になってしまいました。

```cs:SceneSwitcher.cs
[InitializeOnLoadMethod]
static void Initialize()
{
    EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
    SceneManager.sceneLoaded += OnSceneOpenedInPlaying;
    EditorSceneManager.sceneOpened += OnSceneOpenedInEditor;
    // エディタ起動時にsceneOpenedが呼ばれないため、初回のみdelayCallで実行
    EditorApplication.delayCall += OnSceneOpenedFirstTime;
}
```

ランタイムからエディタに戻った時、ランタイムでシーンを開いた時、エディタでシーンを開いた時、エディタを起動したときにチェックマークを更新しています。もっといい方法がありそう。

### データの保存

PlayerPrefsを使うことにしました。
制限はあるけれど小規模なプロジェクトなのでちょうどいいと思います。

### 日本語フォント

友人曰く、サイズが大きすぎるフォントアセットはGitHubのリポジトリにプッシュできないとのこと。なので、足りない文字を自動で作ってくれるDynamicフォントを使用しました。

フォントアセットの作成にはこちらの記事を参考にさせていただきました。
[本当に使える！TextMeshProでの「日本語」「多言語」対応方法](https://blog.kyubuns.dev/entry/2021/02/06/001609)

これで問題は解決と思いきや、今度はDynamicフォントによる差分でマージの際にコンフリクトしてしまう...。

そこで、上の記事を執筆された[きゅぶんず](https://x.com/kyubuns)さんが紹介されていたこちらを利用することにしました。

[TMProDynamicDataCleaner](https://github.com/STARasGAMES/tmpro-dynamic-data-cleaner)

https://x.com/kyubuns/status/1767133858330538406

保存時にDynamicフォントの差分が出ないようにしてくれるものすごく便利なパッケージです。これで日本語フォントの用意が完了しました。

### 必要なパッケージのインストール

少し面倒なパッケージのインストールも1クリックでできるようにします。具体的には、「TextMeshPro」と上記の「TMProDynamicDataCleaner」の2つです。

```cs:PackageInstaller.cs
public static void InstallPackages()
{
    // ダイアログ表示
    bool result = EditorUtility.DisplayDialog(
        "パッケージのインストール",
        "以下のパッケージをインストールしますか？\n\n" +
        ConfigLoader.GetConfig().PackageInstallerConfigData._Identifiers.Keys.Aggregate((x, y) => x + "\n" + y),
        "Yes",
        "No");

    if (result)
    {
        Debug.Log("パッケージのインストール中...");

        List<string> identifiers = new(ConfigLoader.GetConfig().PackageInstallerConfigData._Identifiers.Values);
        // インストール
        _request = Client.AddAndRemove(identifiers.ToArray());
        EditorApplication.update += Progress;
    }
}
```

UnityEditor.PackageManager.Client.AddAndRemoveにパッケージの識別子の配列を渡すことで、一括でインストールすることができます。

ただ問題があり、GitのURLでUMPパッケージとしてダウンロードする場合にGitがインストールされていないと、パッケージのインストールができないようです。チーム内でGitをインストール済みの人がこの操作をすればいいのかなと思います。

### おまけ

簡単に機能を試せるようなウィンドウを用意してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802709/a4dc83b4-dacb-2971-4ccb-eeabded18b43.png)

# 完成！

### unitypackage
[GitHub](https://github.com/Kusu-Nose/GameJamTemplate/releases/tag/v1.0.1)

### 使い方
1. unitypackageをプロジェクトにインポート
1. Tools > HackathonTemplate > PackageInstaller > Install を押してパッケージをインストール
1. Build Settings... の Scenes In Build にシーン3つを追加

Assets/HackathonTemplate/Config.asset で設定を変更することができます。

# まとめ

他パッケージへできるだけ依存しないようにしたり、インスペクタ表示をAttributeで分かりやすくしたりと、使う人の事を意識して制作しました。
**後は実際に使ってみるだけ！**

今後も記事書いていけたらいいな。