読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

レトロゲームプロジェクトの研究②Pong編

これのシリーズ
imoue.hatenablog.com


「一昨日調べてたPongGameと同じゲームを、Paper2Dで表現したPongの方を見ていくことに。制作の時系列としては2D版が先だったみたい」

妹「なんで同じのがあるんだろう?」

「2D版はpaper2Dを使ってるだけじゃなく、当たり判定にUE4のコリジョンを使わずに全部自前でやっている。それにCPU戦だけじゃなく対戦モードも用意されている」


ゲーム内容

1P側はカーソルキーの上下、2P側はW・Sキーでパドルを動かす。
パドルどこに当てても跳ね返り方は一定範囲内の角度でランダム。
上下の壁に当たった場合は中央寄りに跳ね返る。

各マップの構成

StartMap

スタート画面。レベルブループリントのみで構成。
ウィジェットの表示とEnterキーの入力検知のみ

ModeSelectionMap

対戦モードの選択。CPU戦と2人対戦のどちらかを選べる。
スタート画面と同じくレベルブループリントのみで構成。
カーソル無しの画像を背景にして、その上に"1P側のカーソルだけの透過画像"と"2P側のカーソルだけの透過画像"のどちらかを上のレイヤに表示している。

MainGameMap

CPU対戦用のマップ。
レベルブループリントではウィジェットの作成と、マップに初期配置されたMainGameアクターとウィジェットの紐付けだけ。

TwoPlayerMap

2人対戦用のマップ。
レベルブループリントではウィジェットの作成と、マップに初期配置されたMainGameアクターとウィジェットの紐付けだけ。

ブループリントの構造

MainGame

CPU対戦用のゲーム全体を管理するアクター。
カメラやスプライト等ゲームの主要要素は全てMainGameアクター内にコンポーネントとして配置されている。

BeginPlayで各種入力を有効化・メインカメラを設定・開始まで少し待つようにして「Ready?」と「GO」の表示・各変数の初期値の設定。
Tickでボールの移動、パドルの移動などを判定。(コリジョンやMomementComponentは使用せず計算で処理している)

MainGameTwoPlayer

MainGameとほぼ同等の機能を持っているけど継承関係などは無し。多分MainGameをコピーした後に微調整したもの。



「……という構造なんだけど、ゲームとしては後発のPongGameプロジェクトの方が優れてる。前回のはパドルの先で上手くつつければ得点出来るというのがあったけど、このバージョンにではそれがない。普通に打ってもCPUが間に合うから、得点の可能性は斜め45度に飛んで来たボールを壁ギリギリの直線で打ち返すパターンしかないけど、角度がランダムだから意図的に狙えない。ほぼ確率がゼロのパターンが出るまで耐えるゲームになる」

妹「これはつらい」

「そういうのもあって改良版を作ったんじゃないかと思う。Paper2Dベースでコリジョンを使った形にも出来るはず。スマートな部分としては、AIが弾の軌道を読んで待ち構えるところ。見えない弾(FaleBullet)があって、それが本物より速いそれを追いかけてるから、予測しているように見える。それが強すぎる=勝ちパターンがほとんどなくなってる原因だけど」

妹「動きは遅いんだよね?」

「遅いけど正確に動かれると厳しい。斜めに来たボールで間に合わない場合があるのは遠いから。これで打った後に中央に戻る仕組みもあると多分負けない。得点するゲームじゃなく、何回打ち合ったかを競うゲームになる」

妹「AIって難しいんだねえ……」