レトロゲームプロジェクトの研究①PongGame編
「昨日のプロジェクトの中身を見ていくわけだけど、まずは見た感じ簡単そうだったPongGameから。Pong(ポン)というのはゲーム史の本を開くと最初のあたりに書いてある有名なゲームだから、多分妹も知ってるんじゃないかと思うんだけど」
妹「知ってるんじゃないかな……やったことはないけど」
「今回の22のプロジェクトのうちの2つがこのPongで、PongGameの方はポリゴンゲームで、Pongの方はPaper2Dという違いがある。今日はは3DのPongGameプロジェクトの
方。こっちの方が構造が簡単そうだった」
操作方法
カーソルキーの上下で右側のパドルを操作して、ボールが右端に行かないようにする。Pキーで一時停止。
ゲームウィンドウを閉じるまでエンドレス。
ブループリントの構造
レベルブループリント
- カメラの設定
- 両端のトリガーに接触した場合の処理(ボールの削除・得点の加算呼び出し・ボールの向きを負けた側へ・ボール生成呼び出し)
- ポーズ処理呼び出し
Ball_BP(ボール)
- 効果音の発生
- ボールの動きはProjectileMovementのバウンス機能で処理
Paddle_BP(上下に動かせるパドル)
- PlayerかCPUかをIsPlayer変数をで判定して分岐(ただしCPU処理の都合上、右側をAIにしても正しく動作しない)
- プレイヤー側の場合、上下の移動量に合わせて移動
- CPU側の場合、ボールが右側に向かってる場合だけ、縦軸(Z)をボールに合わせようとして動く
Pong_GameMode_BP(レベルのゲームモード)
- 初期化処理(左右どちらにボールが行くかランダムで決定・生成イベント呼び出し・ウィジェットの表示)
- ボール生成イベント(速度、発射角度はランダム)
- 得点の加算
- ポーズ処理
「というような構造になっている。重要な部分はだいたいゲームモードにあって、必要に応じて呼び出すだけ、ブループリントアクターの数も少なくて、わかりやすい仕組みになってる」
妹「……これCPU強すぎじゃない? 全然勝てそうな気がしないんだけど」
「CPUのパドルはプレイヤーより遅いけど、ミスなく動くから、間に合うボールには絶対間に合う仕組みになってるんだよ。間に合わない速度や角度で打てばいいけど、ボールの発射角度を普通に打ち合ってても変化しないから、人間がミスをすると負けるし、ミスをしなければ終わらない」
妹「ひどすぎる」
「パドルの正面じゃなくて側面、細い部分でボールをつっつけばいい。そうすると急角度がつくからCPUでは届かない。ただしミスの確率も増えるけど」
妹「たしかにこうすると結構勝てる。一度得点すると相手がボールを拾えなくて連続得点出来たりする」
「こういうミスしなければ負けないタイプのゲームのAIは難しい。普通にやるとCPUが圧勝してしまうから、手を抜いて貰わないといけないんだけど、弱すぎても駄目だし。このプロジェクトでは、プレイヤーより移動速度が遅いのと、軌道予測をせず常にボールを追いかけることで調整してる」
妹「仕組みは簡単だけど、面白くするのは難しそう」
「対処法としては、動かしながらパッドに当てると角度が付くとか、打ち続けるとCPUの反応速度がだんだん落ちるとかが考えられる。障害物やアイテムを入れて複雑にしてもいいかも」