Developer

【Unity実践】#18 アセット編 ~ トラップの作成 ~【Boxゲーム】
2021.05.23
Lv2

【Unity実践】#18 アセット編 ~ トラップの作成 ~【Boxゲーム】

今回の内容

今回はトラップのアセットをダウンロードして適用していきます。

※初めての方はこちらから
【第1回記事】この連載について

トラップのアセットをインポートする

トラップのアセットは以下を使用します。

検索は「Dungeon Traps」で検索すると見つかります。

※アセットのダウンロード・インポートは第15回の記事で説明しています。

トラップを配置する

シーン「GameScene2」を使って、トラップのアセットを配置・編集していきます。

↓ GameScene2の現状

まずは右下に置いていたトラップ(Trap)を削除しましょう。
代わりに、インポートしたアセットを配置します。
Dungeon Traps > Trap > Prefab > Pf_Trap_Needle をシーンに配置してください。

「Pf_Trap_Needle」の名前を「Trap_Needle」に変更しておきます。

さらに Position を以下の様に設定して、削除した Trap と同様に右下に配置しましょう。

↓ 配置イメージ

これで配置までが完了となります。

トラップにスクリプトを適用する

配置した Trap_Needle に以前作成した TrapScript を適用していきますが、
作業する時には以下のようなことを気にしながら進めると上手く置き換えができます。

TrapScript はコライダーが設定されているオブジェクトにアタッチする想定のソースとなっている
⇒ Trap_Needle およびその子要素の中に、↑ を都合よくみたすオブジェクトがあるか?
⇒ あればそれに適用、なければコライダーを自分で設定する。

参考(TrapScript のソース)
[csharp] using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TrapScript : MonoBehaviour
{
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.tag == "Player")
{
other.gameObject.GetComponent<PlayerScript>().isDamaged = true;
}

if (other.gameObject.tag == "Dragon")
{
other.gameObject.GetComponent<DragonScript>().isDamaged = true;
}
}
}
[/csharp]

↑の方針に従って、まずは Trap_Needle およびその子要素の構成をザックリ見てみると以下の通りです。

Trap_Needle(子要素をまとめる用途。見た目はナシ)
┣ Needle(針)
┗ Trap_Needle(床)

この中で、針にあたる Needle にはコライダーが付与されており、
その範囲については針の見た目と対応しているので、トラップの判定として使う上で大きな問題は無さそうです。

というわけで今回は一番手軽そうな、Needle に TrapScript を適用する方針とします。
ここまで決まると作業自体はとてもシンプルで、Needle に TrapScript をアタッチするだけです。

シーンを再生し、以下の様に針に触れるとゲームオーバーとなれば成功です。

プレハブ化とScene3での確認

これで針のトラップが完成したので、プレハブ化しておきましょう。
GameScene2 に作成した Trap_Needle を、Prefabs フォルダにドラッグ&ドロップします。

次に GameScene3 の Trap を、この Trap_Needle に置き換えましょう。
この時また1点問題があり、Dragon が針に当たらずに落下してしまいます。

画面外に出ているので、これはこれで問題は無いのですが、
正しく当たっていれば消滅するはずなので、意図通りに動いていないのは少しマズイです。

少し強引な対処ではあるのですが、今回は Rigidbody を使って、
z軸方向への移動、およびxyz各軸周りの回転を制限する対応を行います。

プロジェクトビューで Prefabs > Dragon を選択して、Rigidbody で以下の設定を行ってください。

(念のため、GameScene3 の Dragon にも適用されていることを確認してください。)

これで以下の様に、ドラゴンが消滅するようになります。

ちなみにドラゴンが消滅せずに落下してしまったのは、以下が原因です。
・針の上に積もった箱の破片により、針に触れるまでのタイムラグが生じる
・その間に針によって押し出されて、ドラゴンが落下する

今回は連載用にかなり簡潔で雑な対応としましたが、
・箱の破片の当たり判定を細かく調整(ドラゴンもしくはギミックをすり抜けるように)
・トラップのコリジョンを Trigger にしてしまう
あたりの対応を行うとより丁寧な実装となります。

おわりに

トラップの作成はこれで完了とします。
とりあえず針のトラップだけを作成しましたが、Dungeon Traps に含まれる他のアセットを利用すれば、
同様のトラップを何パターンか作成できると思います。

次回はゴールにアセットを適用したいと思います!

 
 

連載目次リンク

実践Unityゲームプログラミング 連載目次
 

関連する連載リンク

「初心者のための」Unityゲーム制作 目次
 

© Unity Technologies Japan/UCL