前回からの続きです。今回は目標物を用意し、前回作った弾をぶつけてみます。
参考資料:Script Canvasチュートリアル:エンティティを生成して衝突を検出することによるターゲットの射撃
新規にEntityを作り、Mesh・Mesh Collider・Rigid Body Physicsの各コンポーネントを追加します。Meshにはシステムで用意されているprimitive_cubeをロードしました。
スケールと位置を調整して壁にします。

Play Gameで前回作った弾をぶつけてみます。
上手く作動している様です。
次に弾のSliceを改修し、弾がコリジョンに当たったら弾を消す処理を入れてみます。
Entity Outlinerで右クリックで出るメニューからInstantiate slice...を実行し、ファイルブラウザで前回作った弾のSliceを選びます。

弾のSliceのインスタンスが作成されました。

これにScript Canvasコンポーネントを追加し、新規にスクリプトファイルを作ってロードします。

そのスクリプトファイルに下図のスクリプトを作成します。

On Collisionノードでコリジョンの接触が検知されると、Destroy Game EntityノードでEntityが消去される仕組みです。消去するEntityにはSelfが設定されているので、弾自身が消去される事になります。
改修が終わったのでSliceをセーブしましょう。
Entity Outlinerで右クリックで出るメニューからSave slice overridesに入り、改修したSliceを選択してセーブします。

セーブが終わったらEntity OutlinerでSliceを削除します。
ではPlay Gameでテストです。
壁に接触した時点で弾が消えているのが分かります。
次に、壁にも同じ処理を入れ、弾が当たったら弾と壁の両方が消える様にしてみます。
壁のEntityにScript Canvasコンポーネントを追加します。

そしてこちらにも、弾と同じ内容のスクリプトを作成します。
これで、この壁が他のコリジョンと接触すると壁自身を消去する様になります。

Play Gameでテストしてみます。
…Play Gameを実行すると壁が消えてしまいました。
考えてみれば当然で、壁が地面のコリジョンと接触したのでスクリプトが作動してしまったんですね。
今回は弾のコリジョンとの接触だけに反応させたいので、弾のSliceにTagコンポーネントを追加し、そのTagを検知した時だけ消去するという処理を作ります。
改修の為、再び弾のSliceのインスタンスを作成します。

弾のSliceのインスタンスが作成されました。

Tagコンポーネントを追加します。

Add new child elementアイコンをクリックします。

Tagの項目が追加されます。

ここに任意の文字列を追加します。
今回はbullet_Aという文字列にしました。

弾のSliceをセーブします。

セーブが終わったらEntity OutlinerでSliceを削除します。
次は壁の方の作業です。
壁のScript Canvasコンポーネントからスクリプトを開きます。

Script Canvas右下のCreate Variableをクリックします。

使用出来る変数(variable)のリストが表示されます。そこからCollisionを選択します。

Collisionタイプの変数が作成されます。それをScript Canvas内にドラッグ&ドロップし、メニューからSet(変数名)を選びます。

変数をセットするノードが作成されます。

下図の様に接続します。

Setを作成したのと同じ手順でGetも作成します。

Script Canvasの左カラムから必要なノードを選んで追加し、下図のスクリプトを作成します。Destroy Game Entityは処理の最後に移動させました。
赤字が処理の説明です。

これで、特定のTagを持つオブジェクト(今回は弾)が接触した時だけ壁が消える様になりました。
ですがテストした所、このままだと処理が動きません。どうも接触時に弾が先に消えてしまって接触が検知されない様です。そこで、弾のスクリプトに遅延処理を入れる事にしました。
これはスクリプトだけの改修なので、先程までの様に弾のSliceのインスタンスを作成する必要は無く、Script Canvasでの作業になります。
Script CanvasのFile - Openで弾のSliceで使っているスクリプトファイルを開きます。

こちらが弾のスクリプトです。

下図の様にDelayノードを入れ、Timeを0.001に設定します。

テストしてみます。
弾が当たると弾と壁の両方が消える様になりました。
上手く行きましたが、考えてみたら壁の方にも同じ遅延処理を入れておかないと逆の状況が発生する可能性があるのでは…ですが面倒なので今回はこれで済ませます。これを応用する事があったらその時そうしよう。
さて、1回の着弾で壁が消えるのは何かあっさりしている気がするので、複数回の着弾で消える様に変更します。
壁のスクリプトの最後のDestroy Game Entityの直前に、下図の様にインクリメント処理を挟みます。

3回の着弾で壁が消える様になりました。
前回から書いてきましたシューターに関する記事は以上です。
ところで何故この辺りを色々調べていたかというと、こちらのキャラクターのパンチを作る為です。
要は腕の位置で短射程の射撃を行っているのと同じ事です。射程はTriggerで設定しています。
No comments:
Post a Comment