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

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

P5.エアホッケー.03「パック スポーン(Blender 2.80 新規シーン作成)」

f:id:ore2wakaru:20190507003326p:plain

スペースキーを押したら、中央にパックが出るようにする。やり方としては、もっと簡単な方法があるけど、あえてパックをスポーンさせる方法でやる。Armory にあるスポーン用のノードは2種類。Spawn ObjectSpawn Scene

画面の大きさ変更しとく

と、その前に、[▶ Play] すると出て来るゲーム画面、でかすぎるよね。ってことで、今回も 1280 × 720100% にしておくぜ。

f:id:ore2wakaru:20190506193401p:plain

スポーンとは

スポーンとは簡単に言えばコピペだ。コレのいい所は、元ファイルを汚さずに取っておけるってこと。例えばテキストファイルで考えてみればいいよね。コピーしたものに変更を加えたり、または削除しちゃったりしても元ファイルが残っていればなんぼでもコピペ出来るだろ。

f:id:ore2wakaru:20190506195251p:plain

で、ゲームでよくあるスポーンのさせ方としては、ゲーム画面の見えない所(地面の下とかカメラの後ろとか)にコピー元のオブジェクトを置いておいて、そのコピーを左クリックした時とかに出す感じだ。これを実現させるのがSpawn Objectノード。一番簡単なやり方だ。

だが今回はこれじゃなくて、コピー元を違うシーンに置き、Spawn Sceneノードを使いそれをスポーンさせる方法をとる。ちょっとメンドクサイ方法だ。

この2つの主な違いは、同じシーン(アクティブなシーン)にあるものをコピーするのか、違うシーンにあるものをコピーするのかってとこだ。

(なんであえてメンドクサイ方法を採るかって言うと、スポーンさせた後にノードトゥリーで作った Trait は Add 出来ないから・・・。コレ、はよ修正してくれ。まぁいいけど、別に。)

パック専用のシーンを追加

ということでパックだけ用のシーンを追加する。あたりまえだが、スポーンさせたいのはパックだからな。

f:id:ore2wakaru:20190506203308p:plain

 今まで作ってたシーンに名前を付けておく。Outliner の上の所にシーンを管理してるところがある。普通に、"Scene" になってる所をクリックして好きな名前を付けておこう。何でもイイが俺は "sGame" とした。

 パックだけ用のシーンの作成。[新規シーン作成] ボタンを押す。

f:id:ore2wakaru:20190506204625p:plain

 New をクリックして、

f:id:ore2wakaru:20190513174034p:plain

 名前を付ける。ここで付けた名前は後でスポーンさせる時に使うから分かりやすいものにしておくこと。俺は "sPack" とした。これで、このゲームは2つのシーンを持つこととなったんだぞ。左の [円錐+球+・] のアイコンを押せば、リストで出て来るから、シーンを切り替えられる。

f:id:ore2wakaru:20190506205809p:plain

 シリンダーを追加して、パックとする。位置は(0,0,0)。スケールは1倍のままでOK。スポーンさせる時に縦に0.45倍にする作戦。

たぶん、前のシーンで付けた名前と同じもの(例えば"Pack"とか)だと、後に".001"("Pack.001"ね)とか付くかもしれない。そしたら、もっかいダブルクリックして".001"を消せばいいよ。そうすると、コッチではちゃんと消えるから。でも、前のシーン(例えば"sGame")に戻ると、こっちのパックに".001"が付いてると思う。どお? どーも Blender はシーンを越えても同じ名前は付けちゃいけないようだね。ま、いいけどね。どうせ、"sGame" のパックは削除するからね。

で、忘れちゃいけないのが、こっちのパックにノードトゥリーで作った Trait を付ける事! これ、忘れがちだからな、注意。

ゲーム用のシーンの修正

f:id:ore2wakaru:20190506230647p:plain

 シーン "sGame" に戻って、パック("Pack.001"かな?)を消し、同じ場所に EmptyAdd"PackDerubasyo"命名。これは別シーンに移したパックを出現させるさせるためのモノ。

Location Scale
X 0 1
Y 0 1
Z 0.5 0.45

場所はイイとして、Scale を 0.45 にしておくこと。この大きさでパックが出て来ることとなる。注意。

Empty のイイところはレンダリングの邪魔にならないってとこ。大抵何かをスポーンさせる時の目印として使われる。前の「玉転がし」ではクルクルを回すための親オブジェとして使ったよね。

 "Kami" コレクションを作って、中に "Kami" オブジェクトを追加。俺は Cube で作った(Empty でもいいけど)。この Cube に「スペースキーを押したらパックを出す」っていうスクリプトを貼るんだ。ゲーム全体を管理するためのオブジェクトとする。だから、「」っていう名前にした感じ。位置は、分かりやすい様に、またカメラに映らない様、(0, 0, -5)

スクリプトを貼れるのはオブジェクトだから、こんな風にゲーム全体を管理するため用のオブジェクトが必要となるんだな。

Spawn Scene

では、本日のメイン。シーンをスポーンさせるスクリプトだ。さっきの "Kami" に付けてくれ。

f:id:ore2wakaru:20190506234740p:plain

 名前は適当につけていいが、どのオブジェクトに付けたものなのか忘れてしまったりするので、貼り付けたオブジェクト名は入れておいた方がイイかも知れない・・・。ま、どうでもいいか。

 キー入力のチェックは、「玉転がし」ではOn keyboardを使ったが、違うやり方もあるので覚えよう。On updateを使う方法だ。

 Keyborad State: これは"指定したキー"が"指定された状態"にあるかチェックし、そうだったら、True を信号として出すノード。

今回のだったら、"スペースキー"が"押された"ら True が出るということ。押されてない、または、一回押した後ずーっと押されている場合は、False になる。

 Is True: これは簡単。True の信号が来てれば、次の処理(Out から出る線)に移るよってもの。

つまり、❷~❹で毎フレームスペースキーの状態をチェックして、押されたタイミングでの処理にいくってことだ。

 Spawn Scene: シーンのコピペ。どういうことかというと、今あるシーンに指定したシーンを追加するって事ね。もちろんシーンにあるオブジェクトを追加するって事。必要なのは、生み出す「シーン名()」と生み出すときの「トランスフォーム情報()」の2つ。

今回は、追加するシーンにパックしかないから、結局、パックを1個出すことになる。

 Scene: スポーンさせるのは一応シーンなので、これでシーンを指定する。

 Get Transform: 素人的には、ここは生み出す場所さえ指定出来ればいいと考えるんだが、注意なのは、Location ではなくて Transform で指定するところ。Transform っていうのは、「Location、Rotation、Scale」の3つの情報が入ってるものだからね。単なる場所情報だけではない所に注意。

だから、Empty で作った "PackDerubasyo" の ZScale0.45にしてたってことだぞ。大丈夫かな?

テストプレイ

では、ちゃんと "Pack" にも "Kami" にも Trait をはっ付けてあることを確認してシーン "sGame" から [▶ Play]。(めんどいのでGifは無し。) 実行直後は何もないけど、スペースキーを押すと動くパックが出て来るハズ。出たでしょ。まーよかったわ~。

押せば押すだけ出て来るぞー! メモリを食いつぶしてハングするまで何個でも出るぞー!! わーい!!!!

いやいや、1個だけでいいのだよ。ってことで、次回はこの辺を中心にスクリプトの修正・追加をしていこうと思う。

本日のポイント
  • キー入力チェック方法2通り。
  • Spawn Sceneでシーンをスポーン!
  • そこに必要なのは Location? Transform

 次回、どうすっかな、ホントは。