たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

弾と剣があたったら、弾が消失してエフェクトでパーティクルを発生させる

前回作成した弾に軌跡をつけることと、剣にあたったら弾が消失してパーティクルがはじけるようにしました。

やったこと

弾に軌跡をつける

やっていることは簡単で、弾のPrefabsにInspectorからTrail Rendererをアタッチしてあげます。そうすることで軌跡は簡単につける事ができます。あとは、いろいろとパラメータをいじってあげていい感じにします。

f:id:c_taquna:20180525005432j:plain

f:id:c_taquna:20180525005630j:plain
う*こビルのような形になってますが、軌跡です。

剣にあたったら弾が消失する

上記の処理は以下で実現可能です。

  1. 衝突判定ができるようにする
  2. 弾があたった時に消える処理をスクリプトで書く

1.衝突判定ができるようにする

  • Collision系
  • Trigger系

がありますが、今回はTrigger系を使っていきます。弾のCollisionで Is Triggerがあると思うので、それにチェックを入れます。それだけです。Is Triggerを入れると衝突したものどうしすり抜けつつあたり判定を実装できます。今回はどのみち弾を消してしまうのでこれで問題ありません。

f:id:c_taquna:20180525011508j:plain

2.弾があたった時に消える処理をスクリプトで書く
たしか、剣を操作するためのスクリプトはなかったので、新たに作成しました。

public class SwordController : MonoBehaviour {
    public GameObject ParticlePrefabs;

    private void OnTriggerEnter(Collider other)★
    {
        if (other.gameObject.tag == "Bullet") {★
            Destroy(other.gameObject);★
        }
    }

    // Update is called once per frame
    void Update () {
		
	}
}

ポイントは★マークのところ。Collider otherですが、このotherは「このスクリプトがアタッチされているオブジェクトから見てあたった相手」の情報が入っています。そのため、あたったもののTagから何にあたったのかを判定して、Bullet(弾)だったらDestroyするような処理にしています。これで、弾と剣が衝突した際に弾を消すことができます。

弾を切った時のエフェクト

これは、弾を切った時(弾と剣がぶつかった時)にパーティクルを放出するようにしました。やり方としては↓です。

  1. パーティクルのPrefabsを作成する
  2. 弾と剣があたった時に、そのPrefabsを生成するようにする

1. パーティクルのPrefabsを作成する
Hierarycy->Effect->Particle Systemで生成する。後はいい感じにパーティクルを調整する。

f:id:c_taquna:20180525012810j:plain
f:id:c_taquna:20180525012817j:plain
f:id:c_taquna:20180525012822j:plain
f:id:c_taquna:20180525012827j:plain
f:id:c_taquna:20180525012832j:plain

  • 弾と剣があたった時に、そのPrefabsを生成するようにする

上の方に書いた、SwordController スクリプトを以下のように変更する。

public class SwordController : MonoBehaviour {

    public GameObject ParticlePrefabs;★

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Bullet") {
            GameObject particle = Instantiate(ParticlePrefabs) as GameObject;★
            Vector3 hitPos = other.ClosestPointOnBounds(this.transform.position);★
            particle.transform.position = hitPos;★
            Destroy(other.gameObject);
        }
    }

    // Update is called once per frame
    void Update () {
		
	}
}

ParticlePrefabsという入れ物を用意しておきます。これは最後にパーティクルのPrefabsを入れておいてください。その後は、衝突判定後の処理にパーティクル生成処理を書いて、剣と弾があたった箇所の座標をだします。その座標にパーティクルを表示すると、剣できった瞬間にいい感じにエフェクトがかかります。

感想

次回以降は、以下の処理を追加する

  • ステージ作成
  • 10発連続撃ち落とせたらクリアーにする
  • 自分にあたったらHPが減るようにする
  • ゲーム開始時から剣を持った状態でスタートするようにする(掴む機能今回はいらないかも)
  • タイトル画面作成
  • HPが0になったらゲームオーバー
  • 弾の予測線
  • その他ブラッシュアップ