はじめに
こんにちは、カピです!
少々前にはなりますが、2025年8月初旬に開催されたUnityroom1さん主催の『1週間ゲームジャム』にチームで参加し、なんとかゲームを一つ完成させることができました!
開発中はコンフリクトやエラーとの格闘でしたが、終わってみれば最高の体験でした。
この記事では、私たちのような初心者がどんな流れでゲームを作り、どんな壁にぶつかり、どう乗り越えたのかを記録として残したいと思います!
イベント概要
Unity1週間ゲームジャムとは?
Unityを使って1週間でゲームを作るお祭りです。
月曜0時にお題が発表されます。日曜20時までにゲームを作って投稿しましょう。
お題については多少こじつけでも大丈夫。
ゲーム作りを楽しむことを心がけてください。
期間中に投稿したゲームは、日曜20時に一斉公開されます。
ハッシュタグは#unity1weekです。みんなでゲーム作りを楽しもう。
引用:Unity1週間ゲームジャム イベントページ
開発期間
2025年8月4日(月) 0時 〜 2025年8月10日(日) 20時
チーム結成とテーマ発表
今回のゲームジャムは、友人であるriu(チームメイトの名前)と2人で参加することに。役割分担は、私が主にプレイヤーとシステム周りを、友人が敵の動きやキャラクターデザインを担当しました。
発表されたテーマは「ひく」
ここから私たちの1週間が始まりました。
どんなゲームを作ったか
『かぜ、ひいちゃう!!』
テーマ「ひく」から、「(風邪を)ひく」というアイデアを思いつき、「謎のウイルスが蔓延する世界で、ウイルスの攻撃をひたすら避ける」というコンセプトの、トップダウン視点のサバイバル・スコアアタックゲームに決めました。
ゲーム性としては『Vampire Survivors』2に近いですね。
スコア形式をとることで自然とやりこみが生まれることを狙いました。
Unityroom自体にもスコア連携のAPIが用意されていたので相性はバッチリでした。
ゲームのコア要素:
- 敵の咳攻撃や弾を避けてハイスコアを目指す
- アイテムの「マスク」を取ると一定時間無敵になる
ゲームリンク:
Unityroom ↓
Miniverse(チームサイト) ↓
※スコアランキングは未実装
開発でぶつかった壁
開発はもちろん順風満帆...とはいきませんでした。特に印象的だった4つの壁を紹介します。
1. 地獄のマージコンフリクト
今回初めて本格的なチーム開発に挑戦し、GitとGitHubを使ってバージョン管理に挑戦しました。
学びながらブランチを切って作業し、プルリクエストでレビューし合う流れは順調...かと思いきや、ある日プルリクエストに真っ赤な警告が…
This branch has conflicts that must be resolved
――そう、マージコンフリクトです…
原因:
2人とも同じGameScene.unityというシーンファイルを変更してしまっていました。Gitが「どちらの変更を優先すれば良いか分からない!」と競合していました。
解決策:
相方に「どんな変更をした?」と確認し合い、一度mainブランチの変更を取り込んだ上で、相方の方が変更の量が多かったので、相方のバージョンを「正」として採用し、採用されなかった自分の変更を手動でやり直すことで、無事に解決できました。今回は自分があまり変更を加え始める前に発生したおかげで、あまり大事には至らなかったのが不幸中の幸いでした。Prefabをもっと活用すれば、この問題は減らせたかもしれません。今回でチーム開発におけるPrefabの大切さを身に沁みました。
2. シーン遷移に伴うサウンドマネージャーの不具合
BGMやSEを実装した際、シーンを切り替えると音が鳴らなくなる問題に直しました。これは、シーン遷移時にマネージャーオブジェクトへの参照が失われることが原因でした。
解決策:
DontDestroyOnLoadでオブジェクトを永続化させ、シングルトンパターンを使いつつ、マネージャーは最初のシーンにだけ配置するルールを徹底することで解決しました。
using UnityEngine;
public class SoundManager : MonoBehaviour
{
// 1. シングルトンパターンのための静的インスタンス
public static SoundManager Instance { get; private set; }
void Awake()
{
// 2. インスタンスの重複防止処理
if (Instance != null)
{
// 既に別のインスタンスが存在する場合、このオブジェクトは破棄する
Destroy(this.gameObject);
return;
}
// 3. インスタンスを自身に設定
Instance = this;
// 4. シーン遷移しても破棄されないようにする
DontDestroyOnLoad(this.gameObject);
}
// (BGM再生メソッドやSE再生メソッドなどが続く...)
public void PlayBGM(AudioClip clip)
{
// ...
}
}
3. OnClickの設定漏れ(初歩的なミス…)
リトライボタンがなぜか反応しない問題。コードを何度も見直しましたが、原因は単純で、Unityエディタ上でボタンのOnClick()イベントにボタンの処理が記述されているスクリプトをそのままアタッチしていました…。
解決策:
空のオブジェクトのGamaManagerにボタン処理のスクリプトをアタッチし、ボタンのOnClick()イベントにGamaManagerをアタッチすることで無事に解決しました。初歩的なミスですが、意外とよくやってしまうので気を付けたい。
4. レイアウトが崩れる問題
Full HDを基準にUIを作っていたのですが、画面サイズを変えるとレイアウトが崩壊してしまいました。
解決策:
Canvas ScalerのモードをConstant Pixel SizeからScale With Screen Sizeに変更し、基準解-像度を設定することで、どんな画面サイズでもUIが崩れないようになりました。これはWeb公開する上で必須の設定でした。
UnityroomとのAPI連携の経験
ゲーム性として『スコア制』を取っているゲームだったので、個人のスコアをランキングとして残すことがやりこみ要素を生み出すことは理解していました。
そこで、Unityroomに用意されているスコアランキング機能の実装に挑戦しました。
挑戦と言っても、Unityroom側で丁寧なマニュアルとAPIキーが用意されていたこともあり、はじめてながら一時間程度で実装できました。
感想
紆余曲折ありましたが、最終的にはBGMやSE、スコアランキング機能まで実装でき、チームで一つのゲームを完成させるという目標を達成することができました。
特に、Gitを使ってブランチを切りながら共同作業した経験は、個人開発では味わえない楽しさと難しさがあり、大きな学びになりました。
おわりに
ゲームジャムは、短期間で集中してゲーム開発の楽しさと大変さを味わえる最高のお祭りだと思います。この記事が、これからゲームジャムに参加してみようと思っている誰かの、ささやかな後押しになれば嬉しいです。
最後まで読んでいただき、ありがとうございました!
-
Unityで作成したゲームを無料で投稿し、ブラウザ上で遊べるようにする、日本発のゲーム投稿サイトです。アカウント登録すれば誰でもゲームを公開でき、多くのゲームが無料でプレイできます。 ↩
-
『Vampire Survivors』(ヴァンパイア・サヴァイヴァーズ)は、poncleによって開発および発売されたゲームソフト。 ↩
