🏃‍♂️

「Game A Week」を7週間続けてみた

に公開

この記事は、jig.jp Engineers' Blog Advent Calendar 2025 12月11日の記事です。


Game A Weekとは

「Game A Week」とは、期限1週間でゲームを作るチャレンジです。このチャレンジは、ゲーム開発の経験を積むことが目的です。

こちらの記事が起源のようです。

https://www.gamedeveloper.com/audio/game-a-week-getting-experienced-at-failure

「Game A Week」は、ルールを決めてチャレンジすると効果的です。
ゲームは毎週作ること、ゲームはどこかにリリースすること、ゲームはチャレンジ終了まで修正しないことなどのルールがあります。

どうやったか

1人では続かない気がしたため、一緒にチャレンジする人を募集しました。
結果2人が一緒にチャレンジしてくれることになり、合計3人でチャレンジを開始しました。
次の通りルールを決めて、チャレンジを開始しました。

  • 開発期間は、月曜日にスタートし日曜日まで
  • 作ったゲームのリンクを共有する
  • 毎週ゲームをリリースする
  • リリースしたゲームは修正しない
  • 火曜日までに振り返りを書く
  • 今年いっぱい、年末まで続ける

言語は自由ですが、慣れていたUnityで開発しました。

7週間の成果

記事投稿時点で、7つのゲームを作りました。
ゲームは、Unityを使って作成し、フリーゲーム投稿サイトである unityroom に投稿しました。
ゲーム一覧はこちらです。

https://unityroom.com/users/dicenull

それぞれのゲームについて軽く紹介します。リンク先のゲームも遊んでみてください。

1週目 ダイスバトル

ローカル2人対戦のシューティングゲームです。10年前に初めて作った自作ゲームを3Dリメイクしました。発射した弾が、自機の移動に追従するのがこだわりです。

https://unityroom.com/games/dicedotbattle

2週目 敵をデカくして倒せ!

敵を大きくする弾と、敵を倒す弾の2種類を使い分けて高得点を目指すゲームです。
大きくしている間は敵を倒せないリスクと、大きくしてから倒すと高得点になるリターンのバランスを狙いました。

https://unityroom.com/games/dice-big-shooting

3週目 クリックブロック崩し

「ブロック崩し」のバーの代わりにマウスクリックで反射するゲームです。
ブロック崩しxエイム練習ゲームを作る予定でしたが、思ったより時間がなくクリックで反射という要素だけを残してリリースしました。

https://unityroom.com/games/block-break-notes

4週目 文字で戦う文字バトル

倒した敵の文字を装備して、RPGのように戦うゲームです。
ゲームジャンルとしてローグライクがあります。原点となるゲーム「ローグ」はアスキー文字で表示していたことを思い出し、文字で戦うゲームを作ってみました。レベルデザインが難しかったです。

https://unityroom.com/games/text-text-battle

5週目 止まって避けろ!ダイスヨケ

「かわくだりゲーム」に"止まる"アクションを追加したゲームです。unityroomのランキング機能を導入し、スコアランキングが反映されるようにしました。

https://unityroom.com/games/kawa-dice

6週目 ダイスを動かし続けろ!

数字キーとダイスの目が対応している特殊な移動方法で壁に当たらないように移動するゲームです。
このゲームは避けゲーとして作りましたが、同じ移動方法で別ジャンルのゲームも作れそうです。

https://unityroom.com/games/dice-control

7週目 手を2回叩いたあとゲーム

子供ころに一度はやったであろうあの手遊びをゲームにしました。画像アセットをnano bananaで作成しました。チャージのアセットは、言葉で伝えにくいポーズだったため生成に苦労しました。

https://unityroom.com/games/charge-game

Unityスピード開発の工夫

DIの代わりにServiceLocator

実装速度を優先するために、UnityのDIパッケージは使わずにServiceLocatorを自作しました。
Registerでサービスを登録し、Getでインタフェースやクラスの型で取得できるようにしています。

using System;
using System.Collections.Generic;
using UnityEngine;

public class GetIt : MonoBehaviour
{
    private readonly Dictionary<Type, object> _services = new();
    public static GetIt Instance { get; private set; }

    GetIt() { if (Instance == null) Instance = this; }

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    // サービスの登録
    public void Register<TInterface, TImplementation>(TImplementation implementation) where TImplementation : TInterface
    {
        _services[typeof(TInterface)] = implementation;
        _services[typeof(TImplementation)] = implementation;
    }

    // サービスの取得
    public TInterface Get<TInterface>()
    {
        if (_services.TryGetValue(typeof(TInterface), out var service))
        {
            return (TInterface)service;
        }
        throw new KeyNotFoundException($"Service not found for type: {typeof(TInterface).Name}");
    }
}

よく使うシーンをテンプレート化

チャレンジ4週目に、クリア判定・ゲームリスタートなど最低限必要な部品が多いことに気がつきました。
テンプレートとして、スペースを押したらゲームオーバーになるまでをUnityシーンをにしました。
ServiceLocatorでInterfaceを登録し、コードも共通化しました。

using R3;

public interface IGameData
{
    public Observable<bool> IsGameOver { get; }
    public void GameOver();
    public void Reset();
}

inspector

感想

毎週リリースが継続できてよかったです。作ったゲームを遊んでもらえると、とても嬉しいです。
ゲームを完成させるまでが大変でしたが、ゲームを完成させたことが自信に繋がります。
形になったゲームを元に、新しいゲームを作るモチベーションにもなりました。

終わりに

今年いっぱい、年末まで続けると決めたので残りの週も頑張ります。ネタが尽きないように完走したいです!
ぜひ「Game A Week」にチャレンジしてみてください!

jig.jp Engineers' Blog

Discussion