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

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

P5.エアホッケー.19「敵マレット」

f:id:ore2wakaru:20190531010112p:plain

敵マレットにも専用のノードトゥリーを作ってパックを自動で打ち返すように動いてもらおう。ただし、俺のスクリプトアホアホなので大した動きは出来ないが、、、。 まーなんだかんだで、このシリーズも最終回だ。

敵マレットでも跳ね返るようにする

 動く前にパックを跳ね返せるようにしておこう。パックのノードトゥリー("nPack")のメインループ(On Update部)の一番最後に以下を追加だ。

f:id:ore2wakaru:20190530220450p:plain

単に、すぐ右でやってる自マレットの当たり処理のカタマリを敵マレット用にしたもので、何の注意点とかもないが、

  1. Get Distanceするのは、もちろん "MalletCom" と。
  2. 飛ばすイベントはこれから作るが、"HANSYA_C"。
  3. 敵マレット用の連続2度当たり禁止フラグは、"hanC"。

ま、このくらいか? 自マレット用の処理をがっぽりコピペして、この3点を変更すればいい。

 イベント "HANSYA_C" を追加。反射ベクトルを求める部分だが、ほぼ前回のと一緒。また糞長いので前半・後半に分けた。

f:id:ore2wakaru:20190530222437p:plain

  1. イベント名は "HANSYA_C"。大丈夫だよな。
  2. 敵マレット用の連続2度当たり禁止フラグは、"hanC"。これもいいよな。
  3. ノーマル出すのは敵マレット "MalletCom" との接触面だからな。

f:id:ore2wakaru:20190530223147p:plain

  1. 当たった時、スピードを乗っけるのは敵マレットの "myDir" だ。(ただし、敵マレットの "myDir" はこれからセットするが。)
  2. さっきと一緒、連続2度当たり禁止フラグは、"hanC"。

このくらいしか変更点がないんだよなー。ほぼコピペ。

(で、本当は変更点がほとんどない場合はイベントじゃなくて、Call Function - Functionのペアでカタマリを呼び出す方が無駄がないんだが、前も言ったようになんか俺には使いこなせなかった。呼ばなかったり、同じのを2度呼んじゃったりすんだよ。ま、出来るようになったら使おう。)

敵マレット用ノードトゥリー("nMalletCom")作成

さ、"myDir" なんかを追加していこう。あ、全部作るのか。

基本動作としては、

  1. パックが出てる時に動く。パックが無いのにプルプルするのはやだろう。
  2. パックが敵陣(Com側)内にいるときだけパックを追尾。自陣(Player側)にいる時もプルプルするのはやだろう。
  3. パックが敵陣内にいてもプレーヤー側に動いている時は無駄に追尾しない。無駄追い禁止。
  4. パックが自陣にいる時はホームポジションに戻る。どっしり腰を据えてプレーヤーの出方を待つ。

という簡易AI。(AIとも呼べないがな。)

先に、"nMalletCom" の全景を貼っておこう。グチャグチャなだオイ! それから、全部できた時ちゃんと敵マレット("MalletCom")に貼ることを忘れないように!

f:id:ore2wakaru:20190530231944p:plain

 On Init: 敵マレットの "myDir" をセット。これだけ、楽勝。

f:id:ore2wakaru:20190530232208p:plain

 On Update、メインループ頭: パックが出てるかチェックしてる。新しいノードは2つかな?

f:id:ore2wakaru:20190530233727p:plain

Is Not None: Value から入って来るデータがちゃんと存在するかどうかチェックし、あれば次に処理を渡す。無ければ終わり。データが "None" でなければ次に行くってこと。否定の表現は重なるとむずいよね。

Get Child: 親子関係にあるオブジェクトの(チャイルド)を探す。入力側 Object には親の、Child には探したいの情報を入れる。探し方には何通りかあるが上図のように "By Name" の場合は、ずばりオブジェクト名で探すことになる。Outliner で見て、オブジェクト名を入れよ。で、があれば出力側の Object からその情報を出す。なければ "None" をだす。

プロパティ "sPackRoot" はシーンのルートだけど、オブジェクト型だったの覚えてるかな? パック("Pack")はこれの子という存在にあたる。(Debug Console で見たとき、ちゃんと親子関係の表現で出てきてたよね。確認してみて。) だから、パックがアクティブなシーンに出てるかどうかは、上図の方法でチェックできる。

え? パックがあれば「"packAru" = True」で分かるって? そうなんだけど、右下をちらっと見て欲しい。今回は、シーンに出てるパックの Location 情報が欲しいんだよ。だから、これを持ってきたわけ。

 敵マレットがパックを追いかける範囲を考える。年がら年中追っかけてるんだと締まりがないからな。

f:id:ore2wakaru:20190531001435p:plain

12 でパックの Y 位置が「5 < Y < 30」 のチェック。つまりパックが敵陣内にあるか調べてる。ただ、敵陣内でも深い所にある場合は、壁にめり込むため追わないようにした。2 の時も、Get Locationするために、さっきの子オブジェクトデータをちゃんと持って来てつないでね。

3 でパックの Y 方向・大きさをチェック。「Y > -5」、つまりパックが敵陣ゴール側に向かっている時と、自陣ゴール側にトロトロ向かっている時のみパックにぶつかりに行く。パックが向かってくるスピードがあまりに遅いとイライラするでしょ。だから。

1-2-3 が揃ってマレットがパックを追っかける流れ()に入る。

どっかで False になったら、4 でマージさせて、ホームポジションへ戻る流れ()に。

 ホームポジションX:0, Y:30, Z:0.95)へ。

f:id:ore2wakaru:20190531003728p:plain

 パックを追いかける。ただ、パックの中心を追うのではなく、パックの先っちょを追うようにした。

相当改良の余地があると思うけど、、、

f:id:ore2wakaru:20190531005134p:plain

1: パックの先っちょに。

2: ぶつかりに行く時のスピード倍率。

3: 一見要らなさそうだが、反射ベクトルに加算するので、ここにある。

以上! Trait 追加して、ちゃんと敵マレット "MalletCom" に貼れよ。

テストプレイ

動くじゃろ?

これで完成だ! 終了!

俺、オツカレ!

本日のポイント
  • Is Not None: データがあれば次。
  • Get Child: 親子関係の子を探す。

 このシリーズ、おわっちゃったな~。