メモ
🎮 前提条件(仕様)
- プレイヤーは高さ 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 の意味 |
|---|---|---|
| 歩いてる最中 | 止まってる |
| ジャンプ中 | ジャンプしてない |
| 空中で落ちてる | 地面に立ってる |
🧪 状態チェックは毎フレーム行う!
ゲームの Update() 関数の中で、毎フレームこういうチェックをしてます:
if (!isFalling) {
PlayerInput(); // 入力を見て
PlayerMovement(); // 動かす
} else {
PlayerFallDown(); // 落下処理
}📝 イメージでまとめると…
状態 | 条件 | 行動 |
|---|---|---|
歩く | 前が空いてる | スーッと1マス進む |
ジャンプ | 前にブロック、その上が空 | ピョンと1段上に乗る |
落下 | 足元が空(またはジャンプ後) | スーッと1段ずつ下がる |
✅ ポイントまとめ
- 状態は3つだけ:「歩く」「ジャンプ」「落下」
- 条件に応じて状態を切り替えてるだけだから、考え方はシンプル!
- 実際の動きは
moveRatioを使って「ぬるっと動かしてる」
No Comments