- 今後はこちらをご覧ください
- unity6-portfolio
- このプロジェクトは主に個人または小規模のUnityゲーム開発におけるスターターキットを目指して作成されています
- コードの再利用性を高め、実装のしやすさや可読性、保守性が向上するような作りを意識しています
- インゲーム/アウトゲーム共にマスターデータで動作しています(データ駆動型)(調整中の部分を除く)
- アセンブリ分割によるモジュラー設計を採用し、MVC/MVP両パターンのゲームモードを共存可能
- マスターデータ定義をローカルパッケージ(com.rei.unity6library)として分離し、再利用性を向上
- 起動時のゲームモード選択画面から、異なるアーキテクチャのゲームを切り替えて起動可能
| 項目 | バージョン |
|---|---|
| Unity | 6000.3.2f1 以上 |
| OS | Windows 10/11 |
- リポジトリをクローン
git clone https://github.com/reigithub/unity6-sample.git
- Unity Hub でプロジェクトを開く
- 初回起動時、パッケージの復元に数分かかる場合があります
Assets/ProjectAssets/UnityScenes/GameRootScene.unityを開いて再生
- NuGetForUnity経由でインストールされるパッケージがあるため、初回ビルド時にエラーが出る場合は再度ビルドしてください
- Addressablesのビルドが必要な場合は
Window > Asset Management > Addressables > Groupsからビルドを実行
| タイトル | ゲームプレイ | リザルト |
|---|---|---|
![]() |
![]() |
![]() |
| タイトル | ゲームプレイ | レベルアップ |
|---|---|---|
![]() |
![]() |
![]() |
| トゥーンシェーダー | ディゾルブエフェクト |
|---|---|
![]() |
![]() |
| シーン遷移 | エフェクト集 |
|---|---|
![]() |
![]() |
┌─────────────────────────────────────────────────────────────┐
│ Game.App │
│ (エントリーポイント・ゲームモード選択) │
└─────────────────────────────────────────────────────────────┘
↓ ↓
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ Game.MVC.Core │ │ Game.MVP.Core │
│ (MVCパターン基盤) │ │ (MVPパターン基盤) │
│ GameServiceManager │ │ VContainer/DI │
└─────────────────────────────┘ └─────────────────────────────┘
↓ ↓
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ Game.MVC.ScoreTimeAttack │ │ Game.MVP.Survivor │
│ (タイムアタックゲーム) │ │ (サバイバーゲーム) │
└─────────────────────────────┘ └─────────────────────────────┘
↖ ↗
└──────────────┬──────────────┘
↓
┌─────────────────────────────┐
│ Game.Shared │
│ (共通ユーティリティ) │
└─────────────────────────────┘
↓
┌─────────────────────────────┐
│ com.rei.unity6library │
│ (ローカルパッケージ) │
│ マスターデータ定義/Enum │
└─────────────────────────────┘
- ゲームモード選択システム: 起動時のタイトル画面から異なるアーキテクチャのゲームモードを選択可能
- アセンブリ分割設計: MVC/MVPパターンを独立したアセンブリで管理し、循環参照を防止
- ローカルパッケージ分離: マスターデータ定義をローカルパッケージ(com.rei.unity6library)として分離し、再利用性を向上
- プレハブシーン/ダイアログ遷移機能: async/awaitによる非同期シーン遷移
- ステートマシーン実装: ジェネリック型コンテキスト付き、遷移テーブルによる状態管理
- マスターデータ管理: TSV→バイナリ変換、エディタ拡張によるデータ駆動開発
- 各種ゲームサービス: オーディオ、シーン遷移、メッセージングなどの共通機能
- DIコンテナ対応: VContainerによる依存性注入(MVPパターン用)
- 戦闘システム: ICombatTarget/IDamageable/IKnockbackableによる統一的な戦闘インターフェース
- 武器システム: 自動発射・地面設置型武器、汎用オブジェクトプール(WeaponObjectPool)
- 敵AIシステム: ステートマシン駆動(Idle/Chase/Attack/HitStun/Death)、ウェーブスポーン
- アイテムシステム: ドロップ抽選、吸引機能、オブジェクトプーリング
- ロックオンシステム: 自動ターゲット追跡、射程管理
- セーブデータシステム: MemoryPackによるバイナリシリアライズ、自動保存
ゲームモード選択システム
- アプリ起動時にGame.Appのタイトル画面を表示
- 選択されたゲームモードに応じて対応するランチャーを起動
- 各ゲームモードは独立したアセンブリで実装され、相互に影響しない
- ゲーム終了時はランチャーをシャットダウンし、タイトル画面に戻ることが可能
- ApplicationEventsによる疎結合なイベント通知(下位→上位アセンブリ)
アセンブリ分割設計
| アセンブリ | 役割 | 依存関係 |
|---|---|---|
| Game.Shared | 共通ユーティリティ、インターフェース | Unity6Library |
| Game.App | エントリーポイント、ゲームモード選択 | Shared, MVC., MVP. |
| Game.MVC.Core | MVCパターン基盤、GameServiceManager | Shared, Unity6Library |
| Game.MVC.ScoreTimeAttack | タイムアタックゲーム実装 | Shared, MVC.Core, Unity6Library |
| Game.MVP.Core | MVPパターン基盤、VContainer | Shared |
| Game.MVP.Survivor | サバイバーゲーム実装 | Shared, MVP.Core |
| com.rei.unity6library | マスターデータ定義、共通Enum | なし(最下層) |
ローカルパッケージ (com.rei.unity6library)
マスターデータ定義ファイルをローカルパッケージとして分離し、以下のメリットを実現:
- 再利用性: 複数のプロジェクトで同じマスターデータ定義を共有可能
- 依存関係の明確化: 最下層に配置することで循環参照を防止
- ビルド時間短縮: 変更頻度の低いコードを分離することでインクリメンタルビルドを効率化
- バージョン管理: パッケージ単位でバージョン管理が可能
含まれるコンテンツ:
- MasterMemory用マスターデータ定義クラス(AudioMaster, ScoreTimeAttackStageMaster等)
- 共通Enum定義(AudioCategory, AudioPlayTag等)
Survivorマスターデータ(11種類):
SurvivorStageMaster: ステージ定義(制限時間、初期武器等)SurvivorStageWaveMaster: ウェーブ定義(出現タイミング、敵数)SurvivorStageWaveEnemyMaster: ウェーブ内敵構成SurvivorEnemyMaster: 敵ステータス(HP、攻撃力、移動速度等)SurvivorPlayerMaster: プレイヤー基本ステータスSurvivorPlayerLevelMaster: レベル別ステータス(吸引範囲等)SurvivorWeaponMaster: 武器定義(タイプ、ダメージ、クールダウン等)SurvivorWeaponLevelMaster: 武器レベル別ステータスSurvivorItemMaster: アイテム定義(効果値、レアリティ等)SurvivorItemDropMaster: ドロップ抽選テーブル
シーン/ダイアログ遷移機能
- 非同期処理(async/await)で実装
- 前のシーンが破棄されていても遷移履歴から再遷移が可能
- 現在シーンをスリープさせて次のシーンへ遷移でき、戻るとスリープ状態から復帰可能
- シーン実装は起動前/ロード時/初期化時/スリープ時/復帰時/終了時など様々なタイミングで追加処理を挟む事ができます
- シーンに任意で引数や戻り値を追加で設定できます
- 引数つきのシーンであっても、履歴から状態を復元して再度引数を渡して遷移する事が可能
- ダイアログ(オーバーレイ)は複数開く事が可能で、不正な挙動を防止するためにシーン遷移時に全て破棄されます
ステートマシーン
- ジェネリック型コンテキストを持ち、任意の型を指定できます。
- 各ステートからコンテキストを参照して、状態管理を行う事ができます
- 初期時に遷移テーブルを構築でき、各ステートがどのステートから遷移するかルールを設定できます。遷移ルールが1ヶ所に集約/可視化され保守性が向上します。
- 任意ステートから遷移先に指定できる特別なステートを設定可能で、適切な設定が遷移テーブルに無い場合に遷移が検証/実行されます。
- ジェネリック型のイベントキー型を指定でき、遷移イベント名をenum等で集約管理できます。遷移先ステート名と一致させると可読性/保守性が向上します。
- 通常のUpdateに加え、MonoBehaivior.FixedUpdate/LateUpdateにも対応。これにより物理演算やカメラ等の状態と相互に連携できます。
サバイバーゲームシステム(MVP)
戦闘システム
ICombatTarget: ダメージ・ノックバック・ターゲット機能を統合した戦闘インターフェースIDamageable,IKnockbackable,ITargetable: 個別機能のインターフェース- 敵・プレイヤー共通の戦闘ロジックを実現
武器システム
SurvivorWeaponBase: 武器の基底クラス(ダメージ計算、クリティカル、発動率)SurvivorAutoFireWeapon: 自動発射型武器(最寄りの敵に向けて弾を発射)SurvivorGroundWeapon: 地面設置型武器(ターゲット位置に円形パターンでダメージエリア生成)WeaponObjectPool<T>: 汎用オブジェクトプール(弾・エリア共通)- マスターデータ駆動(レベルごとのステータス・アセット変更対応)
敵AIシステム
SurvivorEnemyController: ステートマシン駆動の敵AI- 状態遷移: Idle → Chase → Attack → HitStun → Death
SurvivorEnemySpawner: ウェーブ管理・スポーン制御- NavMeshAgentによる経路探索
アイテムシステム
SurvivorItemSpawner: 敵撃破時のドロップ管理- ドロップグループ抽選(確率テーブルによるアイテム決定)
- マグネット吸引機能(範囲内アイテムの自動回収)
プレイヤーシステム
SurvivorPlayerController: 移動・HP・スタミナ・無敵管理- ステートマシン: Normal → Invincible → Dead
- アイテム吸引範囲のレベル連動
セーブデータシステム
SurvivorSaveService: ステージ進行状況・クリア記録の保存- MemoryPackによる高速バイナリシリアライズ
- 自動保存(30秒間隔・バックグラウンド移行時)
- 勝敗確定時の即時保存(データ整合性保証)
その他
- シーン遷移やオーディオ再生などの共通機能は主にゲームサービスとして分離されています
- マスターデータエディタ拡張はTSVから簡単にバイナリを作成でき、TSV更新後すぐにデータをテストできます。これによって検証サイクルを早めています。テストしたバイナリをそのままビルドやアセット配信で使用できます。
- インゲームシーンはPrefabシーン+Unityシーンで構成されており、ステージとなるUnityシーンはロジックから分離されています。その為、コード修正なしで新しいステージを追加できます
- アウトゲームシーンは遷移挙動のカスタマイズ性を担保するため、全てPrefabシーンを採用しています
- ゲームブートストラップ : GameBootstrap.cs
- ゲームモードランチャー管理 : GameModeLauncherRegistry.cs
- アプリタイトル画面 : AppTitleSceneComponent.cs
- アプリケーションイベント : ApplicationEvents.cs
- ゲームモードランチャーIF : IGameModeLauncher.cs
- ステートマシーン : StateMachine.cs
- シーン遷移サービス : GameSceneService.cs
- シーン基底クラス : GameScene.cs
- サービスマネージャー : GameServiceManager.cs
- ランチャー : ScoreTimeAttackLauncher.cs
- プレイヤー制御 : SDUnityChanPlayerController.cs
- VContainerランチャー : VContainerGameLauncher.cs
- ステージシーン : SurvivorStageScene.cs
- プレイヤー制御 : SurvivorPlayerController.cs
- 敵AI : SurvivorEnemyController.cs
- 敵スポーナー : SurvivorEnemySpawner.cs
- 武器基底 : SurvivorWeaponBase.cs
- 汎用プール : WeaponObjectPool.cs
- アイテムスポーナー : SurvivorItemSpawner.cs
- セーブサービス : SurvivorSaveService.cs
- 戦闘インターフェース : ICombatTarget.cs
- 死亡イベント : IDeathNotifier.cs
- ロックオン : ILockOnService.cs
- マスターデータエディタ拡張 : MasterDataWindow.cs
- オーディオマスター定義 : AudioMaster.cs
- ステージマスター定義 : ScoreTimeAttackStageMaster.cs
- オーディオEnum定義 : AudioEnums.cs
.
├── Assets
│ ├── MasterData マスターデータ(TSV, バイナリ)
│ ├── Programs
│ │ ├── Editor エディタ拡張
│ │ │ └── Tests 単体テスト/パフォーマンス改善テストツール
│ │ └── Runtime
│ │ ├── Shared 共通ユーティリティ、インターフェース
│ │ │ ├── Bootstrap IGameLauncher, ApplicationEvents
│ │ │ ├── Combat ICombatTarget, IDamageable等
│ │ │ ├── Constants 共通定数, LayerMaskConstants
│ │ │ ├── Enums GameMode等
│ │ │ ├── Events DeathEventData, IDeathNotifier
│ │ │ ├── Extensions 拡張メソッド
│ │ │ ├── LockOn ロックオンサービス
│ │ │ └── SaveData セーブデータ基盤
│ │ ├── App エントリーポイント
│ │ │ ├── Bootstrap GameBootstrap
│ │ │ ├── Launcher GameModeLauncherRegistry
│ │ │ └── Title アプリタイトル画面
│ │ ├── MVC MVCパターン実装
│ │ │ ├── Core 基盤(Services, Scenes, MessagePipe)
│ │ │ └── ScoreTimeAttack タイムアタックゲーム
│ │ └── MVP MVPパターン実装
│ │ ├── Core 基盤(VContainer, Base)
│ │ └── Survivor サバイバーゲーム
│ │ ├── DI 依存性注入設定
│ │ ├── Enemy 敵システム(AI, スポーナー)
│ │ ├── Item アイテム(スポーナー, ドロップ)
│ │ ├── Models ゲームモデル
│ │ ├── Player プレイヤー制御
│ │ ├── SaveData セーブ機能
│ │ ├── Scenes シーン管理
│ │ ├── Services ゲームサービス
│ │ └── Weapon 武器システム(プール, 弾)
│ └── README.md
└── Packages
└── com.rei.unity6library ローカルパッケージ
└── Runtime
└── Shared
├── Enums AudioCategory, AudioPlayTag等
└── MasterData
└── MemoryTables マスターデータ定義クラス
シーン遷移機能
ステートマシーン
-
改善項目
- ステート管理をHashSet→Dictionaryに変更、ステート検索がO(n)からO(1)に改善(ステート数に依存しない一定時間)
- 遷移時のDictionary検索回数を削減、LINQ使用箇所を改善しアロケーション削減
- メソッドのインライン化でオーバーヘッドを削減
-
状態遷移のスループット向上
- イテレーション数: 30,000
- 遷移時間が平均15%短縮、スループットが平均15%向上
- ベンチマーク結果(ゲームループに違い総合結果)
項目 旧StateMachine 新StateMachine 改善率 総実行時間 (ms) 44.848 35.295 1.27x 平均遷移時間 (μs) 0.300 0.146 2.05x P99遷移時間 (μs) 0.500 0.300 1.67x 最大遷移時間 (μs) 9.500 5.100 1.86x スループット (ops/s) 668,934 849,991 1.27x 遷移/秒 200,680 254,997 1.27x メモリ (bytes) 401,408 401,408 1.00x GC発生回数 1 1 0 -
状態遷移のメモリアロケーション改善
- イテレーション数: 10,000
- メモリアロケーション比較結果(純粋な遷移リクエスト実行時)
項目 旧StateMachine 新StateMachine 改善率 メモリ (bytes) 2,760,704 1,290,240 2.14x バイト/イテレーション 276.07 129.02 2.14x
| 言語・フレームワーク等 | バージョン |
|---|---|
| Unity | 6000.3.2f1 |
| C# | 9.0 |
| cysharp/MessagePipe | 1.8.1 |
| cysharp/R3 | 1.3.0 |
| cysharp/UniTask | 2.5.10 |
| cysharp/MasterMemory | 3.0.4 |
| cysharp/MessagePack | 3.1.3 |
| cysharp/MemoryPack | 1.21.3 |
| hadashiA/VContainer | 1.16.8 |
| NSubstitute | 5.3.0 |
| DOTween | 1.2.790 |
| HotReload | 1.13.13 |
| JetBrains Rider | 2025.3.0.2 |
| VSCode | 1.107.1 |
| Claude Code | - |
- VContainer: MVPパターンにおける依存性注入(DI)コンテナとして。コンストラクタインジェクションによるテスタビリティ向上、ライフサイクル管理の自動化のため。
- MessagePipe: MessageBrokerを用いたUIイベント、ゲームイベントの疎結合なメッセージング処理(Pub/Sub)のため。
- R3 : UIボタンの押下間隔の設定や複雑な非同期イベント処理、Animatorステート等のイベント合成が簡潔に記述可能。保守性/再利用性の向上のため。
- UniTask : Unityに最適化された非同期処理全般のため。現在は主にダイアログのエラーハンドリングに使用しており、随時利用範囲拡大予定。
- MasterMemory: ゲームロジックとデータを分離し、ロジック修正を抑えつつ、開発サイクルを効率化するため。また、デモゲームが大量の音声ファイル(約400個)を使用するため。
- MessagePack: 主にMasterMemoryのデータシリアライザーとして。
- MemoryPack: セーブデータの高速バイナリシリアライズ。ゼロアロケーションでPlayerPrefsより高性能。
- NSubstitute: テストコードでゲームサービス等のモック作成
- Claude Code: テストコード生成、リファクタリング
| 技術 | 採用理由 | 比較した代替案 |
|---|---|---|
| VContainer | 軽量、Source Generator対応、高速 | Zenject(重い), Extenject |
| UniTask | ゼロアロケーション、Unity最適化 | Task/async標準(GC発生), Coroutine(可読性低) |
| R3 | UniRx後継、UniTask統合、アクティブ開発 | UniRx(開発停滞), System.Reactive |
| MasterMemory | 高速読み取り、型安全、IL2CPP対応 | ScriptableObject(大量データ非効率), JSON |
| MemoryPack | 最速シリアライザ、ゼロアロケーション | MessagePack, JSON(低速) |
- 主にUnityAssetStoreのもので自作は含まれません
- Unityちゃん: https://unity-chan.com/ (© Unity Technologies Japan/UCL)
- 約4週間 (2026/1/24時点)
- ✅ サバイバーゲームモード実装(MVP/VContainer) - 基本システム完成
- ✅ MemoryPackを用いたセーブ機能 - ステージ進行・クリア記録保存
- サバイバーゲームモード追加機能(スキルシステム、ボス戦等)
- PlayerLoopへの介入サンプル
- EnhancedScroller実装サンプル
- リストのソート/フィルタ機能サンプル
- オーディオ音量オプション画面
- マルチ解像度対応
- 制限時間内に全3ステージに配置されたアイテムを規定数集めるタイムアタックです
- 動作環境: PC/マウス&キーボード
- 操作: 移動(WASD), ジャンプ(Space), 走る(LShift+移動), カメラ操作(マウスドラッグ)
- VContainerを用いたMVPパターンで実装
- ウェーブ制の敵を倒しながら生き残るサバイバーゲーム
- 動作環境: PC/マウス&キーボード
- 操作: 移動(WASD), ダッシュ(LShift+移動)
- 主要機能:
- 自動攻撃武器システム(マスターデータ駆動)
- ウェーブ管理(敵の段階的出現)
- アイテムドロップ・吸引
- ステージクリア・記録保存
- 実行形式: デモゲームDLリンク ※解凍できない場合は7Zipを推奨















