30代セミリタイア備忘録

30代でセミリタイアしました。セミリタイアの考察やゲーム関連の雑記を書いてます。

unityでゲームを作ってみる日記その2~Pong製作編~

 何日かだらだらと触ってみた結果、めちゃくちゃ簡単なPongを作れたのでご報告。

今回の成果物

 ゲーム画面はこんな感じ。死ぬほどシンプルになってます。

f:id:retire-diary:20220115150315p:plain

 左側がプレイヤーで、右側がNPCのつもりですがNPC部分は実装してないのでただ佇むだけの壁打ちモードになってます。

 ソースコードとして新規に書いたのはプレイヤーの移動部分とボールの初期化、勝敗判定くらいで30行も書いてないと思います。リトライ処理とか点数処理とかも入れてませんしね。

 それでも一応動くものが作れるってのは凄いです。画面表示とか当たり判定、反射とかがデフォルトで入ってるものを使えるので滅茶苦茶簡単ですね。

 

プレイヤーGameObject

コンポーネント設定

 Squareの2Dオブジェクトを生成しサイズを適当に設定。

 BoxCollider2DとRigidbody2Dのコンポーネントを追加。

 Physics Material 2Dを新規に生成し、Boucinessを1に、Frictionを0にしてRigidbody2Dに紐づけ。

 ちなみにこのままだと壁にぶつかってると回転するので、Rigidbody2DのConstraintsでX軸を固定して対処。

 

 これに加えてプレイヤー入力で移動するスクリプトを記述して追加してます。

入力処理

 今回の場合、上下キーでパドルを動かす処理となるので、上下キーの入力を検知すれば良いですね。

 その場合に使える関数としてはInput.GetKeyかInput.GetAxisがあるようです。

 

 Input.GetKeyは指定したキーコードの入力を検知するものになっています。若干ハードコーディング的になる模様。

 一方でInput.GetAxisはUnityのInputManagerに対応したキー入力を検知でき、対応範囲が広そうなので今回はこちらを使用。

 

 Input.GetAxisのままだと補正がかかり、一定時間をかけて徐々に入力が増加していくような挙動となります。

 Input.GetAxisRawだと補正がかからず、一瞬で規定値(-1 or 1)に到達する模様。

 

 今回は特にこだわりないのでGetAxisRawを使用。上下キーとWSキーで動く感じ。

 

移動処理

 transform.positionのy座標をキー入力に応じて上下させれば勝手に移動します。

 上下の壁にもBoxCollider2Dを設定しておくと壁より先に行くこともないので楽ちんです。

 ただ正確にはrigidbodyを設定しているゲームオブジェクトはtransform.positionを操作するのは良くないとかなんとか。確かに壁にめり込んだりしてるのでちょっと不安感あります。適切な処置を見つけたい所。

 

ボールGameObject

移動処理

 速度と進行角度をランダムで設定して生成し、以降は一定速度で壁にもパドルにも全反射する仕様。

 最初はこちらもtransform.positionで移動させようとしてたんですが、反射時に角度を変えたりする処理を入れるのが面倒すぎて頓挫。

 そこでAddForceで一番最初の進む方向だけ指定して後の反射や当たり判定なんかはrigidbody2DやCollider2Dにお任せする方式に変更。これで一応きっちり動くようになりました。

 

 ただ、パドルの上下方向からボールが当たるとパドルが動き始めるという不具合があります。まぁお試しゲームだから良いかなと諦め。

 

勝敗判定GameObject

処理方式

 左右の壁手前に透明な当たり判定を設置。BoxCollider2Dのみを付与、isTriggerチェックを入れたうえで、勝敗判定スクリプトにOnTriggerEnter2Dを書いておけば勝敗判定処理が動きます。

f:id:retire-diary:20220115155314p:plain

 上図の緑部分が勝敗判定部分。

 今回はDebug.Logでコンソールにひっそりと「勝ち・負け」が出るだけの控えめ演出となってます。

 

まとめ

 とりあえずお試しゲームを作ってみた感想として、すさまじくお手軽にゲームを作れそうな予感があります。太古の昔にDXライブラリとC++で頑張ってた身からすると隔世の感。

 今回得た知識だけでもブロック崩しくらいは簡単に作れそうなのでまずはそこを目標にやっていこうと思います。

 

 いないとは思いますが今回のPongプロジェクト欲しい方とか、もう少し解説欲しい方等いればtwitterとかでご連絡ください。