本システムは、物理的なハードウェア(LEDマトリクス+キーパッド)とソフトウェア(Unity)を連携させた、2人対戦型の陣取りゲームである。 複雑なゲームロジック(状態管理、カード効果、競合判定)はすべてUnity側で集中的に処理し、ESP32は2人分の入力を捌きつつ、描画データを最速でLEDに反映する「入出力特化のハブ」として機能する。
- マイクロコントローラー: 1台のESP32(PlatformIO環境などでのファームウェア開発を想定)
- ディスプレイ: 1台の16×16 フルカラーシリアルLEDマトリクス(WS2812B / NeoPixel等。2人で共有して閲覧)
- 入力デバイス: 2台の物理キーパッド(プレイヤー1用、プレイヤー2用としてESP32に接続)
- 通信方式: USBシリアル通信(PC - ESP32間)
- 開発環境: Unity (Universal 2D Core テンプレート)
- 役割: ゲームの進行管理、カードのロジック処理、盤面データの計算、シリアル通信のホスト。
- UI/描画方針:
- デバッグ・盤面: エディタ上にはデバッグ用の16×16の四角形オブジェクト(Tilemap等)のみを配置し、ロジック開発に特化する。
- カードUI: 手札やカード情報の表示は、Unityの画面上、またはWebページ(拡張機能として)に構築してプレイヤーに提示する。
- データ管理アーキテクチャ:
- 盤面データ: 純粋なC#の2次元配列(例:
int[16, 16])として保持。 - カードデータ:
ScriptableObjectを活用。カード名、パワー、スペシャル属性、および「基準点からの相対座標リスト(塗る形状)」を管理。
- 盤面データ: 純粋なC#の2次元配列(例:
限られた解像度のLEDボードで視認性と操作性を両立するため、キーパッドの特定の割り当てボタン(トグル)を押すことで、以下の3つの状態をローテーションで切り替える。
- カード選択状態: デッキから引いた手札を選び、使用するカードを決定する状態(UIはUnity/Web画面側を主に使用)。
- 移動状態: LEDボード上にカーソルを表示し、選択したカードの配置場所(座標)を決定する状態。
- 盤面表示状態: カーソルを非表示にし、現在の陣取り状況(全体マップ)のみを俯瞰して確認する状態。
お互いが同じターンで同時にカードを出す処理は、以下の「3ステップバッファ方式」で解決する。
- 入力フェーズ: 両プレイヤーがキーパッドでカードと配置座標を決定し、待機(ロックオン)する。
- 仮置きフェーズ(内部処理): Unity内部で「プレイヤーAの仮配置配列」と「プレイヤーBの仮配置配列」を個別に生成する。
- 競合判定フェーズ(盤面更新):
- 2つの仮配置配列を比較し、メインの盤面(16×16配列)を更新する。
- パワーの強弱による「塗り替えし」や、スペシャルマスによる特殊な上書き、重なった際の中立ブロック化などのコンフリクト解決を行う。
通信遅延(レイテンシ)を極限まで減らし、処理落ちを防ぐためのデータ設計。
- [ESP32 -> Unity] (入力データの送信)
- 2つのキーパッドの入力をESP32が検知し、「P1_UP」「P2_CHANGE_STATE」「P1_DECIDE」といった軽量な信号をUnityへ随時送信する。
- [Unity内部] (ロジック処理)
- 入力を受け取り、各プレイヤーのステートマシンの更新、または同時ターン処理(競合判定)の実行。
- [Unity -> ESP32] (バイナリ配列での描画データ送信)
- 計算済みの256マス分の色データを、テキスト(JSON等)ではなく**「768バイトのバイナリ配列(256マス × RGB各1バイト)」**としてシリアル通信で直接送信する。
- [ESP32] (描画)
- 受信した768バイトのバイナリデータをそのままFastLED等のバッファに流し込み、LEDボードを即座に更新する。
アーキテクチャの根幹が確定したため、今後は以下のステップでモジュールごとに開発を進める。
- Step 1: Unity側の土台構築
- 16x16の2次元配列を管理し、3つのステート(カード選択・移動・盤面表示)を遷移させる
GameManagerクラスの作成。
- 16x16の2次元配列を管理し、3つのステート(カード選択・移動・盤面表示)を遷移させる
- Step 2: 競合判定ロジックの実装
- ScriptableObjectを用いたカードデータの定義と、同時ターンのコンフリクト解決(塗り替えし・ブロック化)処理の実装。
- Step 3: 通信モジュールの実装
- Unity側のC#シリアル通信ポートの実装と、バイナリ配列(
byte[])の生成・送信処理。
- Unity側のC#シリアル通信ポートの実装と、バイナリ配列(
- Step 4: ESP32側の実装
- 2つのキーパッド(マトリクス回路)の並列読み取りと、バイナリデータを受信してLEDを光らせるファームウェアの作成。