クエリちゃんのバグ退治
PlayGame

PlayGame

  • シーンの切り替え
    • シーンが切り替わったら、ゲーム開始のロゴ表示後にゲームを操作できるようにする。
    • ゲームの終了条件が満たされたら、勝利か敗北のロゴ表示をしてシーンを切り替える。
  • 基本画面
    • 全体にフィールドが表示されている。
    • 画面右上に、オプション・ボタンが配置されている。
    • 画面右下に、味方ユニットのドラッグ用アイコンが配置されている。
    • 画面左下に選択した兵舎、タワー、ユニットの情報が表示される。
  • 操作
    • オプション・ボタンをクリックしたときの操作
      • オプション・ウィンドウを右上に表示する。
        • フィールド任意の位置をクリックすると、この表示は解除される。
        • オプション・ウィンドウの表示内容
          • 曲の音量(Music Volume)を変更するコントロール
          • 効果音の音量(Sound Volume)の変更するコントロール
          • 「ゲームを中断する」のボタン
    • ユニットを配置するための操作
      • 画面右下のユニットボタンからドラッグしてユニットを配置できる。
        • 配置できるタワーと兵舎には枠を表示する。
      • 遠距離ユニットを配置できるタワーには青色の枠を表示する。
      • 近距離と遠距離の両方のユニットを配置できる兵舎には半分が青、もう半分が赤色の枠を表示する。
    • 兵舎、およびユニットを右クリックしたときの操作
      • 別の兵舎、ユニットが右クリックされた場合その情報表示に切り替える。
      • フィールドのユニットと兵舎以外を右クリックすると、この表示は解除される。
      • 画面左下に兵舎情報を表示する。
        • 敵と味方で情報の表示方法を分ける。
        • 敵の情報表示
          • リスポーン中の敵の情報を表示する。
          • 操作はできない。
        • 味方の情報表示
          • 枠を4つ表示し、割当てられているユニットを表示する。
          • ユニットをクリックしたときに表示されるボタンを押すことで、味方のアップグレードをしたり取り除いたりできる。
      • ユニットの移動先を旗アイコンで表示する。
        • 移動先までの経路をわかるように表示する。
      • フィールドを左クリックすると、そこに移動先を示す旗アイコンを表示する。
        • 旗アイコンはドラッグで移動できる地形の上に配置できる。
        • 旗アイコンと兵舎とを点線で結ぶ。
    • タワーをクリックしたときの操作
      • 配置したユニットの影響範囲を表示する。
      • 兵舎と同様の処理を行う。
        • 移動先を指示するための旗アイコンは表示しない。
        • 枠は1つのみ。
    • 強化するユニットの指定
      • カーソルの先にある味方ユニットの能力値が上昇し、体力が少しずつ回復する。
      • カーソルの先にある敵ユニットの移動が遅くなる。
    • カメラ位置の変更
      • 平行移動
        • AWSD キー
        • カーソルキー
        • 左ドラッグ
        • スワイプ
      • 回転
        • AE キー
        • 兵舎とユニット以外の右ドラッグ
        • 2箇所タップ状態での回転
      • 拡大縮小
        • ホイール
          • 拡大に応じて俯角を変更して横から見ている感じにする。
        • ピンチイン、ピンチアウト

フィールド操作

  • マップは俯瞰表示。この俯瞰の角度は拡大縮小に伴って変更される。
  • マウスのホイール、タブレット画面のピンチイン、ピンチアウトで表示の拡大縮小。
  • 左クリックのドラッグ、タブレット画面のスワイプでマップの平行移動。
  • 右クリックのドラッグ、タブレット画面の2箇所タップした状態で回転させるとマップの回転。

フィールド操作

  • 地形を表示する
    • マップは、指定されたファイルから読み込む。
  • 兵舎、タワーを配置する。
    • 兵舎、タワーを配置するサイズを TileGrid と呼ぶ。
    • 1つのTileGrid にはユニットを4体配置でき、ユニットを配置するグリッドを CellGrid と呼ぶ。
      • CellGrid は X 軸の奇数番目の位置が +0.5 だけずれてるとし、隣り合う CellGrid とは6隣接になるようにする。
    • 1つの CellGrid には1ユニットのみ入れる。
  • より高い位置に移動するときには、移動時間が長くなる。

AllyUnits

  • ユニットを登録し、移動と攻撃を行わせる。
  • セル間の移動表示は時間をかけて行うが、判定等の内部処理的には即座にセルを移動したものとして扱う。
  • セルの移動経路は A* アルゴリズムで導出する。
    • A* アルゴリズムの処理に時間がかかるようなら再検討する。
    • フィールド上のユニットを障害物とした状態で目標位置までの経路が見つかる場合は、その経路を移動させる。
      • 見つからない場合は、ユニットがいないときの経路を移動させる。
  • ユニットは移動か攻撃か回復か待機の状態を持つ。
  • 近距離ユニットが兵舎の上に乗ると占拠割合が増加し、100 % になると占拠状態になる。
    • 兵舎に敵と味方の両陣営のユニットが乗っている場合は占拠割合は変化しない。
      • 兵舎に敵のみが乗っている場合は、占拠割合は減る。
      • 占拠してない状況でどちらのユニットも乗ってないと、占拠割合は減る。

待機

  • 今の位置よりも移動目標に近いセルに移動できない状態。
    • より移動目標に近いセルがあるかの再評価は、一定時間後に行う。
  • 適当に待機アニメーションを再生させる。
  • 移動目標から3セル以内の距離に敵がいた場合、攻撃する。
    • ユニット毎の攻撃範囲は、以下のように定義する。
      • 近距離ユニット: 1セル
      • 遠距離ユニット:
        • アーチャー: 2セル
        • スナイパー: 3セル
        • ソーサラー: 2セル
        • ヒーラー: 2セル
  • そのユニット移動先のセルに敵がいたら攻撃する。
    • 自ユニットがヒーラーの場合、何もしない。
  • 傷ついた味方が2セル以内にいる場合、ヒーラーは回復状態に遷移する。

移動

  • 目標位置の指定は TileGrid に対して行う。
  • 指定された CellGrid に移動する。
  • 移動後は待機状態に遷移する。
  • 移動途中に敵に隣接したら攻撃を行う。
  • 傷ついた味方が2セル以内にいる場合、ヒーラーは回復状態に遷移する。

攻撃

  • 対象の敵を攻撃する。
  • 攻撃できる対象がいなくなったら、移動状態に遷移する。

回復

  • 傷ついた味方が2セル以内にいる場合、その味方に隣接して回復を行う。

ユニットの配置

  • 右下のボタンが左クリックされたら、ボタンに対応するユニットをカーソル位置に表示する。
    • クリックが離されたら、ユニットの選択状態を解除する。
  • 空きのあるタワーやバラックにカーソル位置が移動したら、その配置できる場所にユニットを表示する。
    • この状態でクリックを離すと、その位置にユニットを配置する。

兵舎からのユニット生成

兵舎のある CellGrid 4つ全てに他のユニットがいる場合は、ユニットを生成しない。

  • 味方ユニットの生成
    • ユニットをバラックに配置したときに生成する。
    • 倒された後は、リスポーン時間が経過してから生成する。
  • 敵ユニットの生成
    • 兵舎を占拠後、リスポーン時間が経過してから生成する。
    • ゲーム開始から占拠している兵舎は、ゲーム開始時点で兵舎を占拠したものとして扱う。

タワーからの攻撃

  • ユニット本来の射程 + 1 だけ攻撃できる。
  • タワーがある各 CellPosition から射程を評価し、合成したリストを射程判定に用いる。

味方からの攻撃

  • 攻撃できるユニットがいて射程内のときに state を State.Attack にする。
    • 攻撃対象を登録する。
    • Animator の "Attack" Trigger をセットして、モーションを Attack に切り替える。
  • モーション中のイベントから適切なメソッドを呼び出す。
    • DrawSwingEffect, FireArrow() など。
      • このメソッドでエフェクト表示、およびダメージ計算を行う。
    • モーション中からのイベントは複数あってもよく、必要な引数を渡しても良い。
  • エフェクト表示やダメージ計算の処理は専用の Prefab を用いて行う。
    • 攻撃対象が存在するかどうかの判定を行うために Field オブジェクトを渡す。
  • Attack モーションの終了は専用のイベントを配置して AttackMotionEnd() で受け取る。

敵からの攻撃

  • 以下の順に評価して行動を決定する。
    1. 射程内の敵を攻撃する。
    2. 攻撃してきた敵のうち、最も近いユニットを攻撃対象にする。
    3. 目的地に移動させる。
    4. 目的地にいて敵もいないので何もしない。
  • 空を移動するユニットは、Tile の影響を受けない地上ユニットとして実装する。
    • 移動経路を探索するときのグラフは専用のものを利用する。
    • CellPosition は他ユニットと重なることはできない。

飛行ユニットの移動

  • 専用の経路探索グラフを用いる。
    • 高低差によって移動が阻害されない。
    • 高さがゼロの場所も移動ノードとして扱う。
  • 要約すると、高低差の影響を受けずに移動し、地面と水面とを移動できる。
    • 地上ユニットが移動できない地面には飛行ユニットも移動できない。