おはようございます。
今まではイラストメインで記事を書いていましたが、
最近ゲーム制作の練習を始めたので、その過程を記事にしていこうと思います。
今回はUnityというゲームエンジンを使って、ブロックを押してゴールを目指すいわゆる「倉庫番」のパズルゲームを作っていきます。
手探りで進めていくことになるので、今後どうなるか全く読めませんが頑張ります!

まずはUnityをインストールして起動したところです。何もわからない!

自作のテスト用画像をキャラクターとして配置してみます。

解説サイトを参考にプログラムを書いて動かせるようにしました。
挙動が若干もっさりしてるので修正したい。
ちょっとプログラムを変えたらキビキビ動くようになりました。

設定した壁や床をタイルのように配置できる機能もあるようなので設置。
そして押せるブロックも追加。物理演算やぶつかり判定が最初から入っているので実装は楽でした。
ただ、自由に押せてしまうと倉庫番としてはイマイチなので1マスずつ動くようにしていきます。
そしてなんとか実装できたのがこちら。
キャラクターがブロックの方向に進もうとしたらブロックを1マスぶん移動させる、という単純な処理ですが、結構苦戦しました。
これはキャラクター側の移動プログラムに「ブロックと接触しているとき」の処理を加えて、
ブロックを押したときに、ブロック側のプログラムを呼び出すことで実装しています。
また、変な挙動をしないようにブロックの移動が完了するまでキャラクターは移動できないようにしています。
そしてこのままだと押したときにブロック同士が重なってしまったり、壁をすり抜けたりするのでもうひと処理加えます。
ブロック同士の重なりは、もとからUnityにあるぶつかり判定を利用し、お互い重ならないようにして解消。
ただ、そうするとブロックの移動処理が終わらず、移動完了を待っているキャラクターが移動できなくなってしまうので、
ブロックが移動してなかったら移動が完了したことにして処理を終わらせています。
壁との判定は、移動予定のタイルの情報を取得し、壁だったら同じように移動処理を終わらせています。
また、地味だったのでブロックの移動時にエフェクトを発生させてみました。ちょっと追加するだけでなかなか華やかになりました。
それでは今回の記事はここまでにしようと思います。
誰でもわかる記事を目標にしたいので、今後処理についてどこまで詳しく書くか、試行錯誤しつつになりそうです。
最後まで閲覧いただきありがとうございました。