俺に解るように説明する "Armory Engine" 入門+

ゲームエンジン Armory Engine (Armory3D) の使い方を手探りで学んで入門しようって感じかな。

P5.エアホッケー.15「動くマレットの登場?」

f:id:ore2wakaru:20190525211337p:plain

マレットをマウス操作で動かすぞ。ゲーム画面上でマウスカーソルがあるところにマレットを移動させるのだ。これでやっとゲームらしくなる~。だがそれには画面上のマウス位置が3Dゲーム空間上のどこにあるのか、その位置を把握しないとイケナイのだが・・・。な、なんとそれをたったMouse CoordsPick Objectの組み合わせだけで行うことが出来る。イイぞ Armory

"Tenjyo"(天井)の正体

スクショにはあったけど、解説は後にするって言ってた "Tenjyo" のこと覚えているかい? これ(下図、昔の画像)。

f:id:ore2wakaru:20190503201918p:plain

実はこれ、MeshPlane オブジェクトなんだ。ここで、必ず追加しておいてくれな。で、配置なんだが、下図参照。

f:id:ore2wakaru:20190525022801p:plain

 3D Viewport で見ると自陣に蓋をするような配置になっている。(だから「てんじょー」って名前にしたわけね。) 表示させてる状態だと、自分のマレットはこの下に隠れてしまう。まー、いつもこんな風に表示されていたら邪魔でしょうがないので、目玉アイコン・カメラアイコン クリックで非表示にしていたわけだ。

 Outliner で見るとオブジェクトの元が Plane なのが分かるね。それから、目玉アイコンカメラアイコンの意味も前やったから、大丈夫だよな。「目玉: 3D Vierport 上での表示・非表示」、「カメラ: ゲーム実行中の表示・非表示」だぞ。

 で、ここが一番大事、サイドバー。これ見て、Location(位置)と Dimensions(寸法)を合わせてくれな。

それでこれ一体何なのかというと、ゲーム画面上のマウスカーソルの位置を3Dゲーム空間座標で取り出すための板だ。下図を見てくれ。

f:id:ore2wakaru:20190525164000p:plain

こんな風に、ゲーム画面って XY2D だろ(左)。そこにマウスカーソル(赤マル)があってもその位置は 2D で管理されてるわけ。上の例だったら(x: 620, y: 590)な。でもその位置から見た目で判断してゲーム空間上の何らかのオブジェクトにぶち当たってると、そこの位置は XYZ3D 座標になるだろ(右)。まー(x: -20, y: -30, z: 2)みたいにさ。(あくまでも例なので実際の位置とは違います。)

マウスカーソルの位置にでマレットを動かしたい場合は、2D じゃなくて当然 3D での位置が欲しいんだよ。つまり簡単に言うと 2D → 3D 座標変換装置が欲しいわけ。それをこの天井板にやらせている。

ゲーム的にいうと、これが、まーマレットの移動範囲になる。だから、自陣に完全にかぶせないで、壁との間に1.5m(マレットの半径)の隙間が空くようにしてくれな。開けておかないと、自分のマレットが壁方向に動くとき壁に埋まる場合がでるぞ。それから、敵陣の方まで伸ばさないでね。敵陣の方まで広げちゃうとマレットが敵陣に入り込んじゃうぞ。これはマレットの移動範囲だからな。つまり、移動範囲は壁にめり込まない自陣内に限るということ。

そして、もうひと設定するぜ。Rigid Body を付ける。え? 物理は使わないんじゃなかったの? って思うかもしれないが、画面上のマウスカーソルの位置取得には Rigid Body が付いたオブジェクトが必要なんだ。

f:id:ore2wakaru:20190525031506p:plain

 もちろんさっき追加してもらった "Tenjyo" に付ける。

 Physics タブは一番下。

 クリックして Rigid Body 追加。

 Type は "Passive" にすること。この Rigid Body は物理で動かすものではなく、マウスの位置を把握するために設置した装置。重力で落っこったりしてもらっては困るのだ。だから "Passive"。

以上で、Plane オブジェクト "Tenjyo" のセッティングは終了だ。ただ、Outliner のカメラアイコンのところは色なしの方な。これでレンダリングされることはなくなるが、Rigid Body が付いていることで、ちゃんと装置としての反応はする

マレットにスクリプトを貼る

f:id:ore2wakaru:20190525202753p:plain

マレットに貼るスクリプトの内容はコレで全部。じゃ~よろしく~。 って言って終わってもよかったんだけど、簡単に解説しておくな。

 On Init

f:id:ore2wakaru:20190525170659p:plain

ここでは、"myAcc" を設定している。"myAcc" というのはマレットの移動速度の倍率だ。値を大きくすればマウスカーソルの位置に素早く移動できる。俺は XY "7.0" にしたけど、お好きに。Z 方向には進ませないので "0" ね。

 On Update

f:id:ore2wakaru:20190525205954p:plain

 マレットは物理で動かすわけではないので、通常 "Update" でOK。

 ここで 2D → 3D の座標を取り出している。

Mouse Coords: Coords からマウスカーソルの2D座標が出る。(ちなみに Movement からはマウスの移動量、Wheel からはマウスホイールの移動量が出る。) 2D と言ってもピンの色を見れば分かる通り、Vector型。だから、XY しか使わない、Z はいつも "0" の Vector型になる。

Pick Object: Screen Coordsゲーム画面上の座標(2D)を入れると、3Dゲーム空間上で見ため的にその位置にあるオブジェクトの情報が得られる。ただし、そのオブジェクトには Rigid Body が付いてないとイケナイ。だからさっき、"Tenjyo" に Rigid Body を付けた。Object からは当たったオブジェクト情報、Hit からは当たった位置が取り出せる。2Dで入れると3Dで出て来るって事だ。スゲーな。

結局この2つのノードを通じて、マウスカーソルの位置のオブジェクトを調べることが出来る。だからもし RTS ゲーを作りたくなった時はこれを使って、画面上をクリックしてユニットを選択したり、ココ行けっつって移動場所を指定したりできるわけだ。便利だなー。

 Pick ObjectObject から出た情報と "Tenjyo" とを比べ、マウスカーソルの位置のオブジェクトが "Tenjyo" かどうか調べてる。

 で、マウスカーソルが "Tenjyo" に当たった場合のみ、そのマウスカーソルが指してる場所にTranslate Objectで移動させる。つまり "Tenjyo" 以外の所にあったら移動させないってことな。で、移動量は ❺~❼ で計算してもってくるわけ。

 マレットの移動方向を求める計算。「マレットの移動方向・距離 = マウスカーソル位置(マレットの移動目的地) - マレットの現在位置」で出る。だから、Pick ObjectHit から出た位置から自マレットの位置を引いてる。

f:id:ore2wakaru:20190525205343p:plain

一般的に「目的地 - 自分位置」で自分の行きたい方角・距離が出る。自分を引けって覚えるといいぞ!

 さっきのが移動方向とスピードになるんだけど、これだと進むスピードが遅いので、"myAcc" で決めた数値を掛けてスピードアップさせる。

 で、前もやったが、Delta を掛けて完成。ただし、Z には "0" でOKだ。

必ずマレット("MalletPlayer")に貼れよ。貼り忘れるなよ99%貼り忘れて [▶ Play] すると思うけどな。

テストプレイ

ちゃんと貼ったか? (しつこい!) じゃー、ちゃんと動くだろ。じゃ、また。

本日のポイント
  • Mouse CoordsPick Objectで 2D → 3D 座標変換。
  • Pick ObjectRigid Body が付いてるものに反応する。
  • 移動用ベクトルを求めるには「目的地 - 自分位置」。自分を引くと自分の進みたい道が見える。

 次回、跳ね返す!