Thanks to visit codestin.com
Credit goes to github.com

Skip to content

fami-gb/DomainParadeCore

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

【設計書】ハードウェア連動型・同時ターン制 陣取りゲーム

1. システム全体概要

本システムは、物理的なハードウェア(LEDマトリクス+キーパッド)とソフトウェア(Unity)を連携させた、2人対戦型の陣取りゲームである。 複雑なゲームロジック(状態管理、カード効果、競合判定)はすべてUnity側で集中的に処理し、ESP32は2人分の入力を捌きつつ、描画データを最速でLEDに反映する「入出力特化のハブ」として機能する。

2. ハードウェア構成(ESP32側)

  • マイクロコントローラー: 1台のESP32(PlatformIO環境などでのファームウェア開発を想定)
  • ディスプレイ: 1台の16×16 フルカラーシリアルLEDマトリクス(WS2812B / NeoPixel等。2人で共有して閲覧)
  • 入力デバイス: 2台の物理キーパッド(プレイヤー1用、プレイヤー2用としてESP32に接続)
  • 通信方式: USBシリアル通信(PC - ESP32間)

3. ソフトウェア構成(Unity側)

  • 開発環境: Unity (Universal 2D Core テンプレート)
  • 役割: ゲームの進行管理、カードのロジック処理、盤面データの計算、シリアル通信のホスト。
  • UI/描画方針:
    • デバッグ・盤面: エディタ上にはデバッグ用の16×16の四角形オブジェクト(Tilemap等)のみを配置し、ロジック開発に特化する。
    • カードUI: 手札やカード情報の表示は、Unityの画面上、またはWebページ(拡張機能として)に構築してプレイヤーに提示する。
  • データ管理アーキテクチャ:
    • 盤面データ: 純粋なC#の2次元配列(例:int[16, 16])として保持。
    • カードデータ: ScriptableObjectを活用。カード名、パワー、スペシャル属性、および「基準点からの相対座標リスト(塗る形状)」を管理。

4. ゲームロジックとステートマシン

4.1. 画面の表示状態(UIステート)

限られた解像度のLEDボードで視認性と操作性を両立するため、キーパッドの特定の割り当てボタン(トグル)を押すことで、以下の3つの状態をローテーションで切り替える。

  1. カード選択状態: デッキから引いた手札を選び、使用するカードを決定する状態(UIはUnity/Web画面側を主に使用)。
  2. 移動状態: LEDボード上にカーソルを表示し、選択したカードの配置場所(座標)を決定する状態。
  3. 盤面表示状態: カーソルを非表示にし、現在の陣取り状況(全体マップ)のみを俯瞰して確認する状態。

4.2. 同時ターン制の解決ロジック(ナワバトラー方式)

お互いが同じターンで同時にカードを出す処理は、以下の「3ステップバッファ方式」で解決する。

  1. 入力フェーズ: 両プレイヤーがキーパッドでカードと配置座標を決定し、待機(ロックオン)する。
  2. 仮置きフェーズ(内部処理): Unity内部で「プレイヤーAの仮配置配列」と「プレイヤーBの仮配置配列」を個別に生成する。
  3. 競合判定フェーズ(盤面更新):
    • 2つの仮配置配列を比較し、メインの盤面(16×16配列)を更新する。
    • パワーの強弱による「塗り替えし」や、スペシャルマスによる特殊な上書き、重なった際の中立ブロック化などのコンフリクト解決を行う。

5. 通信データフロー

通信遅延(レイテンシ)を極限まで減らし、処理落ちを防ぐためのデータ設計。

  1. [ESP32 -> Unity] (入力データの送信)
    • 2つのキーパッドの入力をESP32が検知し、「P1_UP」「P2_CHANGE_STATE」「P1_DECIDE」といった軽量な信号をUnityへ随時送信する。
  2. [Unity内部] (ロジック処理)
    • 入力を受け取り、各プレイヤーのステートマシンの更新、または同時ターン処理(競合判定)の実行。
  3. [Unity -> ESP32] (バイナリ配列での描画データ送信)
    • 計算済みの256マス分の色データを、テキスト(JSON等)ではなく**「768バイトのバイナリ配列(256マス × RGB各1バイト)」**としてシリアル通信で直接送信する。
  4. [ESP32] (描画)
    • 受信した768バイトのバイナリデータをそのままFastLED等のバッファに流し込み、LEDボードを即座に更新する。

6. 今後の開発ステップ

アーキテクチャの根幹が確定したため、今後は以下のステップでモジュールごとに開発を進める。

  • Step 1: Unity側の土台構築
    • 16x16の2次元配列を管理し、3つのステート(カード選択・移動・盤面表示)を遷移させる GameManager クラスの作成。
  • Step 2: 競合判定ロジックの実装
    • ScriptableObjectを用いたカードデータの定義と、同時ターンのコンフリクト解決(塗り替えし・ブロック化)処理の実装。
  • Step 3: 通信モジュールの実装
    • Unity側のC#シリアル通信ポートの実装と、バイナリ配列(byte[])の生成・送信処理。
  • Step 4: ESP32側の実装
    • 2つのキーパッド(マトリクス回路)の並列読み取りと、バイナリデータを受信してLEDを光らせるファームウェアの作成。

About

Client(ESP32): https://github.com/fami-gb/pipi-chan

Resources

Stars

Watchers

Forks

Contributors

Languages