前回までの作業で一応弾を発射する処理を作れたのですが、まだ
- 弾を撃っても何も出ないので、撃ったのかどうかが分かりづらい
- ヒットしても何も出ないので、弾がヒットしたかどうかが全く分からない
- ダメージ処理が未実装
といった問題があります。このうち3番目は敵キャラクターを作ってからのほうが作業しやすいので、ここではまず1・2番目の問題を解決するために
- 弾を発射したときに出るマズルフラッシュエフェクト
- 弾が何かに当たったときに出るヒットエフェクト
の2つのエフェクトの作り方を解説していきます。
…まあ本当はアセットストアに丁度いいアセットがあれば良かったのですが、(執筆時点では)無料のエフェクト素材はURPに対応していないものばかりだったので、今回はエフェクトの作り方の練習も兼ねて自作する方向で頑張ってみましょう。
完成サンプル
まず今回の2つのエフェクトの完成サンプルは次のGIFのとおりです。
パーティクルシステムを使ってエフェクトを作る
では先ほどのエフェクトの作り方を見ていきましょう。今回はUnity標準の「パーティクルシステム」を使ってエフェクトを作っていきます(※)。
ただパーティクルシステムは設定可能な項目がとても多く複雑なので、ここでは詳しい使い方まで説明しきれません。そこでまだ全然使ったことがないという方は、とりあえずこの後説明するエフェクトの作り方通りに作業して「慣れる」ことから始めることをオススメします。
※ちなみに今回のプロジェクトはURPなので「VFX Graph」という新機能を使ってエフェクトを作ることもできます。しかしそのVFX Graphで作ったエフェクトは、執筆時点ではWebGLで動かないらしいのでここではパーティクルシステムを使うことにしました。
マズルフラッシュエフェクトの作り方
最初に、銃を発砲したときに銃口から出る「マズルフラッシュ」のエフェクトを作ります。主な手順は次の通りです。
- 新しいパーティクルシステムを作る
- ポイントライトを作り、パーティクルシステムの子にする
- エフェクト用のマテリアルを作る
- パーティクルシステムの設定を行う
それぞれ詳しく見ていきましょう。
新しいパーティクルシステムを作る
まずはシーンに新しいパーティクルシステムのゲームオブジェクトを作ります。パーティクルシステムは右クリック→「エフェクト」→「パーティクルシステム」から作れます。
できたら名前を「Muzzle Flash Effect」に変更して、以前作った銃の「Bullet Spawn」オブジェクトの子にしておきましょう。
また、パーティクルシステムはデフォルトで回転Xが「-90」になっていると思うのでこれを「0」にしておいてください。
ポイントライトを作り、パーティクルシステムの子にする
次に、マズルフラッシュが出た時は銃や周囲のオブジェクトを照らしたいのでライトを作ります。新しいポイントライトを作り、先ほどのMuzzle Flash Effectオブジェクトの子にしたら下の画像のようにLightコンポーネントの設定を行ってください。
なお通常時はライトを消灯しておきたいので、予めLightコンポーネントのチェックをOFFにしておきましょう。
マズルフラッシュ用のマテリアルを作る
そうしたら次はエフェクト用のマテリアルを作ります(マズルフラッシュ・ヒットエフェクト共通)。適当なフォルダに新しいマテリアルを作り、名前を「Effect Material」にしたら次の画像のように設定を行ってください。
「Shader」のところは「Universal Render Pipeline/Particles/Unlit」にして、「Base Map」のテクスチャは「Default-Particle」(最初からプロジェクトに入っていて、検索すると出てきます)を設定しましょう。
パーティクルシステムの設定を行う
さて、ここまで出来たらパーティクルシステムの設定を行います。主な設定項目は次の通りです。
- 基本設定
- 放出
- 形状
- 生存期間の色
- ライト
- レンダラー
基本設定
- ループ:OFF
- 開始時の生存期間:0.15
- 開始時の速度:0
- ゲーム開始時に再生:OFF
放出
形状
半径:0.01
生存期間の色
下の図のようなグラデーションを設定。透明度は上のツマミをクリックすると変更できます。
ライト
レンダラー
マテリアル欄に先ほど作ったマテリアルを設定。
弾のヒットエフェクトの作り方
次に、弾がヒットしたときの「ヒットエフェクト」を作ります。主な手順は次の通りです。
- 新しいパーティクルシステムを作る
- パーティクルシステムの設定を行う
- パーティクルをプレハブ化する
それぞれ詳しく見ていきましょう。
新しいパーティクルシステムを作る
まずは先ほどと同様に新しいパーティクルシステムを作ります。名前は「Bullet Hit Effect」にしておいてください。
パーティクルシステムの設定を行う
次にパーティクルシステムの設定を行います。ヒットエフェクトの場合の設定項目は次の通りです。
- 基本設定
- 放出
- 形状
- 生存期間の色
- レンダラー
基本設定
- ループ:OFF
- 開始時の生存時間:1
- 開始時の速度:5~10(※右側の三角形をクリックして「2つの値間でランダム」を選択)
- 開始時のサイズ:0.1~0.2
- 重力モディファイア:5
- アクションを停止:破棄(※エフェクト再生終了時に、ゲームオブジェクトが自動的に削除されるようになる)
放出
形状
生存期間の色
先ほどと同様のグラデーションを設定する。
レンダラー
先ほどと同様にマテリアルを変更する。
パーティクルをプレハブ化する
ヒットエフェクトはスクリプトからインスタンス化するので、完成したらプレハブ化しておいてください。
銃のスクリプトを変更してエフェクトが出るようにする
これでエフェクトができたので、あとは銃のスクリプトを変更してエフェクトが出るようにしていきます。前回の「FpsGunController」を次のように変更してください(「★変更その1」と書いてある部分が変更箇所です。また、関係ない部分は省略してあります)。
using System.Collections; using UnityEngine; public class FpsGunControler : MonoBehaviour { [SerializeField] Transform bulletSpawn = null; [SerializeField, Min(1)] int damage = 1; [SerializeField, Min(1)] int maxBullet = 30; [SerializeField, Min(1)] float maxRange = 30; [SerializeField] LayerMask hitLayers = 0; [SerializeField, Min(0.01f)] float fireInterval = 0.1f; // ★変更その1 [SerializeField] ParticleSystem muzzleFlashParticle = null; [SerializeField] GameObject bulletHitEffectPrefab = null; // 省略 // 弾の発射処理 void Fire() { if (timerIsActive) { return; } // ★変更その1 muzzleFlashParticle.Play(); if (Physics.Raycast(bulletSpawn.position, bulletSpawn.forward, out hit, maxRange, hitLayers, QueryTriggerInteraction.Ignore)) { BulletHit(); } StartCoroutine(nameof(FireTimer)); } // 弾がヒットしたときの処理 void BulletHit() { // ★変更その1 Instantiate(bulletHitEffectPrefab, hit.point, Quaternion.LookRotation(hit.normal)); } // 省略 }
変更できたら「FpsGunController」コンポーネントの「Muzzle Flash Particle」欄と「Bullet Hit Effect Prefab」欄を設定してください。
ここまでの作業でエフェクトが出るようになったと思うので、テストプレイして確認しておきましょう。
次のページ→弾薬ゲージ&弾薬回復処理の作り方