第11回ぷちコン応募作の「冂と亠で円」(これとこれでえん)の制作メモ、4つ目はミニマップについてです。
前回の記事はこちらになります。
Widgetの構造
画面から見える範囲外の物を歩きまわって集めるというゲームなので、ミニマップは必須と思い作ってみました。
まいどまいど調べるところから。tamhoiさんの記事を参考に構築してみました。
まずは土台となるウィジェットを作りました。Canvasにオーバーレイを置いて、半透明に塗りつぶした背景画像を設定しました。
とりあえず、ゲーム中のカメラはまわらないですしレベルの範囲もそれほど広くないので、シンプルな形で実現させました。何事もシンプルから。
まずプレイヤーは、アイコンだけのウィジェットを作って、オーバーレイの子にしてAddしました。
アイコンを動かす
プレイヤーは中心から動かないタイプではなく、範囲内を動きまわるように作りました。回転もさせたかったので、こいつはTickで動かして、SetRenderTransformノードで表示しています。
アイコンは最初、下の図の様にちょっとずれて表示されたので、位置を調整しました。アイコンのサイズは32ピクセルなので、半分ほどずらしました。
Set Display Positionは自作の関数で、中身は以下のようになっています。
- レベル全体のサイズとミニマップの表示範囲を割り算して、表示範囲内に入る値にする。
- アクターの位置と掛け算して範囲内で動くようにする。Z軸は要らないのでなくす。
- プレイヤーのフォワードベクターはX軸で、マップ表示の上下方向はY軸なので入れ替える。
- Y軸のプラスは画面の下方向になるので反転する。
- 表示部分(オーバーレイ)のサイズを得るには、まずスロットオブジェクトを取得する。
- 表示部分のサイズは左上が基準なので、2で割って中心を基準にする。
- アクターの位置とマップの座標をあわせる。
という流れです。
ピックアップアイテムのアイコン表示
各ピックアップアイテムは、自己申告で表示しました。
最初は、レベル上の存在確認のついでに位置の取得もやっていたのですが、更新の頻度は高くしなくても大丈夫だろうと思ったので途中で変えました。
それぞれがチャイルドとして、ミニマップのウィジェットに自分の位置を書き込んでます。
BeginPlayからすぐにAddチャイルドしてしまうとエラーになったので、Delayで少し時間をあけました。SetItemDisplayPosマクロも自作で、プレイヤーでやった内容と中身は同じです。
タイマーを設定して、2秒毎に自分の位置をアップデートしてます。更新の間隔が長すぎるかとも思いましたが、意外と気にならないです。プレイヤーは「あれ?あと何処?」と思った時か、やられてばらまいた時くらいしか見ず、凝視し続けることはまずないので大丈夫だと思いました。(0.1秒の判断が生死を分ける、という厳しい世界ではないですし)
アイコンのアップデート時は、まずリムーブペアレントしてから、改めてクリエイトウィジェットしています。(ついついリムーブするのを忘れます……)
以上、ミニマップについてでした。
次は、モデルについて書こうと思います。