このブログはUnityの初心者向けに、Untiyの機能の使い方、基本のスクリプトファイルの使い方から応用までをご説明しています。中級以上の方に読んでいただきたい内容も随時更新していますので、お時間がある方、検索でここにアクセスされた方はぜひ立ち寄っていってください。
前回の記事「発射したミサイルに当たったオブジェクトを削除する方法」までで、クリックした場所に向けて弾を飛ばし、オブジェクトに当たったら弾とそのオブジェクトを削除する動きができました。
【プレハブ生成シリーズ】
今回は削除するタイミングで、ParticleSystemで作成した爆発エフェクトのプレハブを生成する方法についてご説明します。
下の動画は「ファイブボックス 一分間Unity講座 弾を当てた場所に爆発エフェクトを作る方法」 のショート動画です。ご興味がございましたら、こちらの動画もご参照ください。
1,爆発エフェクトの作成
Hierarchy上で右クリック、または+ボタンから「Effects」⇒「Particle System」を選択し、ParticleSystemを作成します。
今回は爆発演出を作りたいので、各モジュール、パラメータを次のように指定していきます。
※一分間の説明をベースとしていますので、なるべく少ない変更箇所で作っています。
メインモジュール
おもに新たに生成されるParticleの初期状態を管理するモジュールです
❶ Start LifeTime:1.5 粒子1つ1つの生存時間
❷ Start Speed:1 粒子の初速度
❸ Start Size:3 粒子の最初の大きさ
❹ Start Color:任意の色を指定、サンプルではオレンジ刑にしています
Emissionモジュール 放出レートとタイミングを管理するモジュールです
❺ Rate Over Time:0 ユニットタイムごとに放出される粒子の数
❻ Bursts:+ボタンで1つ追加 パーティクル生成イベントを追加
Count:100 放出される粒子数を指定
Shapeモジュール
パーティクルを放出する体積、面、および開始速度の方向を定義するモジュールです
❼Shape:Sphere(球体)放出するボリュームの形状
Velocity over Lifetime モジュール
Particleの生存期間中の速度を制御するモジュールです
❽ Radial:3 中心から離れる粒子の半径
Size over Lifetime モジュール
Particleの生存期間中の大きさの変化を制御するモジュールです
❾ Size:curveを選択、エディターから右下がりのカーブを指定
徐々に小さくなる
他にも多くのモジュールがありますが、お好みに合わせて調整してみてください。
全体的に大きいようなので、TransformコンポーネントでScaleをx,y,z とも0.3程度にしておきます。
最後は、作成したParticle SystemをAssetsフォルダにドラッグ&ドロップでプレハブ化します。プレハブの名前は「ExplosionPrefab」にしておきます。
2,作成済みのスクリプトファイル
作成済みのスクリプトファイルは過去の動画をご参照ください。
スクリプトファイルは以下にまとめました。
PrefabManager.cs
[SerializeField] GameObject cubePrefab; //cubeのプレハブ
[SerializeField] GameObject bulletPrefab, battery;
float timer; //経過時間を管理する変数
Camera cam; //メインカメラ
void Start()
{
cam = Camera.main; //メインカメラを取得し代入
}
void Update()
{
//マウスが左クリックされたときクリックされた場所に弾を飛ばす処理
if(Input.GetMouseButtonDown(0))
{
//マウスの座標を取得
var mousePos=Input.mousePosition;
//カメラからの奥行きを10に設定
mousePos.z = 10.0f;
// スクリーン座標をワールド座標に変換
var targetPos = cam.ScreenToWorldPoint(mousePos);
// 弾を生成
GameObject bullet =
Instantiate(bulletPrefab, battery.transform.position,
uaternion.identity);
// クリックした位置へのベクトルを取得し標準化
var dir = (targetPos - battery.transform.position).normalized;
// Rigidbodyに力を加える(クリックした座標に2000の力で飛ばす)
bullet.GetComponent<Rigidbody>().AddForce(dir * 2000);
//弾を3秒後に削除
Destroy(bullet, 3.0f);
}
//Cube を生成する処理
timer += Time.deltaTime; //timerに経過時間を加算
if (timer > 1.0f) //timerが1秒を超えたら
{
//Vector3型の変数:pos を宣言、半径5の球体内のランダムな場所を指定
Vector3 pos = Random.insideUnitSphere * 5.0f;
//cubePrefabをposの座標に、回転無しで生成
Instantiate(cubePrefab, pos, Quaternion.identity);
timer = 0; //timerを0リセット
}
}
BulletManager.cs
void OnCollisionEnter(Collision collision) //衝突検知のイベント関数
{
//衝突したオブジェクトがCubeタグを持っていたら
if (collision.gameObject.CompareTag("Cube"))
{
Destroy(collision.gameObject); //衝突したオブジェクトを削除
Destroy(gameObject); //自分自身を削除
}
}
3,弾が当たった場所に爆発のエフェクトプレハブを生成
今回は作成済みの「BulletManager.cs」を編集します。
追記するのは下のスクリプトファイルの青地の部分です。
BulletManager.cs
[SerializeField] GameObject explosionPrefab; //爆発のPrefabを宣言
void OnCollisionEnter(Collision collision) //衝突検知のイベント関数
{
//衝突したオブジェクトがCubeタグを持っていたら
if (collision.gameObject.CompareTag("Cube"))
{
Destroy(collision.gameObject); //記述済み
Destroy(gameObject); //記述済み
//当たった場所にexplosionPrefabを生成、explosionと名前を付けて変数化
GameObject explosion =Instantiate(explosionPrefab,
transform.position,Quaternion.identity);
Destroy(explosion, 2.0f); //2秒後にexplosionを削除
}
}
BulletManagerは、作成済みのBulletのプレハブにアタッチされています。
BulletのプレハブのBulletManagerに表示された変数:ExplosionPrefab に、ExplosionPrefab をAssignします。
これで動画のように、当たったタイミングで爆発のエフェクトが表示されるようになっていると思います。
ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
Комментарии