メモ 🎮 前提条件(仕様) プレイヤーは高さ 2ブロック分 の大きさ(頭+胴体) ジャンプは1ブロック分のみ 可能 ブロック世界は world[x][y][z] のようなグリッドで表現 「今立っている場所」と「前進方向」にあるブロックを調べて移動可能性を判定 🔍 判定に使うブロック範囲(図) プレイヤーの足元 py として、 進行方向の dx, dz を使って座標 (px+dx, py, pz+dz) などを調べます。 上から見た進行方向(Z奥に進む場合) ↑ 進行方向 z | | [x][y+2][z+1] ← ジャンプ時の頭上クリアチェック [x][y+1][z+1] ← 頭位置 [x][y ][z+1] ← 足元 or 障害物 [x][y+1][z] ← 現在地(頭) [x][y ][z] ← 現在地(足) ✅ 判定ロジックまとめ(擬似コード) bool CanMoveForward(int px, int py, int pz, int dx, int dz) { int tx = px + dx; int tz = pz + dz; // ケース①:目の前が空いていて、2ブロック分スペースがある if (isAir(tx, py, tz) && isAir(tx, py + 1, tz)) { return true; // そのまま前進 } // ケース②:1段段差があるけど、ジャンプで登れる if (!isAir(tx, py, tz) && isAir(tx, py + 1, tz) && isAir(tx, py + 2, tz)) { return true; // ジャンプで前進可能 } // その他:ぶつかる or 高すぎる return false; } 🧱 判定図(側面図) ケース①:そのまま進める 空気 [ ][y+1][ ] [ ][ y ][ ] ← 前方2ブロックが空なので通れる ↑↑↑ 頭 胴 足 ケース②:1段ジャンプ可能 [ ][y+2][ ] ← 空気(ジャンプ後の頭) [x][y+1][ ] ← 空気(ジャンプ後の胴体) [x][ y ][ ] ← ブロック(ジャンプ対象) ケース③:進めない(壁 or 高すぎ) [x][y+2][x] [x][y+1][x] ← どこかが詰まってるのでNG [x][ y ][x] 🛠 isAirとは? bool isAir(int x, int y, int z) { return world[x][y][z] == BLOCK_AIR; } ✅ メリット 複雑な物理処理なしで、ブロック単位で「進める or ジャンプできる」を判定できる 敵AIやパスファインディングでも使いやすい 斜面や複雑地形にも柔軟に対応可能 🎮 状態のしくみ:プレイヤーの「行動モード」を理解しよう! 🎲 プレイヤーの3つの状態 歩いてる (=普通に移動) ジャンプ中 (=1段上へピョン!) 落下中 (=足元が空で落ちてる) 🔁 状態の流れ(図っぽく) ↑ ジャンプ ←──────── ↑ │ │ │ 落下中に終点到達 落下する条件 ↑ │ │ ↓ [歩いてる] ──→ [落下中] ──→ [落下中継続] ↑ │ └──── ジャンプできる? ───┘ 🧠 状態の切り替え条件(とってもやさしく!) 🚶‍♂️ 歩く状態(isWalking) ● いつこの状態になる? キーボードで前に進むキーを押したとき 進みたい先が 空いてる(ブロックがない) ● 何をする? 少しずつ前に動く 動き終わったら止まる(また入力待ち) 🦘 ジャンプ状態(isJumping) ● いつこの状態になる? 前にブロックがあるけど、 その上に空間がある (=乗れる) ● 何をする? 放物線のアニメで、 ピョンと1段上 に乗る 着地したら「歩く状態」に戻る 🕳️ 落下状態(isFalling) ● いつこの状態になる? 足元に ブロックがない(空中に浮いてる) ● 何をする? 少しずつ下に落ちる 下にブロックがあるところで止まる 🧩 状態フラグで管理(プログラム上) フラグ true の意味 false の意味 isWalking 歩いてる最中 止まってる isJumping ジャンプ中 ジャンプしてない isFalling 空中で落ちてる 地面に立ってる 🧪 状態チェックは毎フレーム行う! ゲームの Update() 関数の中で、毎フレームこういうチェックをしてます: if (!isFalling) { PlayerInput(); // 入力を見て PlayerMovement(); // 動かす } else { PlayerFallDown(); // 落下処理 } 📝 イメージでまとめると… 状態 条件 行動 歩く 前が空いてる スーッと1マス進む ジャンプ 前にブロック、その上が空 ピョンと1段上に乗る 落下 足元が空(またはジャンプ後) スーッと1段ずつ下がる ✅ ポイントまとめ 状態 は3つだけ:「歩く」「ジャンプ」「落下」 条件に応じて 状態を切り替えてるだけ だから、考え方はシンプル! 実際の動きは moveRatio を使って「ぬるっと動かしてる」