環境
Unity 2019.3.0a6
Windows 10 Home
目標
入力に応じて45度間隔で3方向に弾を射出し、衝突したら弾と衝突対象を破壊する
準備
タグに"Enemy"を追加する
衝突する対象のコンポーネントに何かしらのCollider(2Dを除く)をアタッチ
衝突対象のタグには"Enemy"を指定
ParticleSystemの設定
- Transform
- Inspector上でリセットする
- ParticleSystem (変更したもののみ記載)
- main
- Looping : チェックを外す
- Start Lifetime : 2.5 (2.5秒後に自動的に破壊される)
- Start Speed : 5(初期速度)
- Simulation Space : World (弾が独立して移動する)
- Play On Awake : チェックを外す (起動時に再生しない)
- Emission
- Burst
- Rate over Time : 0
- Count : 3 (1回に3発撃つ)
- Cycles : 1 (1回だけ繰り返す)
- Burst
- Shape
- Shape : Circle
- Radius : 0.0001 (半径)
- Arc : 90 (1発目~3発目の角度)
- Mode : Burst Spread (等間隔)
- Rotation : (X,Y,Z) = (0,0,45) (1発目の角度)
- Collision
- Type : World
- Mode : 3D
- Lieftime Loss : 1 (衝突時に自身を即破壊)
- Collision Quality
- Collides With : Enemy (自分でタグを追加)
- Enable Dynamic Colliders : チェックを入れる
- Send Collision Messaages : チェックを入れる (スクリプトからパーティクルの衝突を検知)
- main
メモ
設定どおりであればX軸の正の方向が0度で反時計回り
90 ÷ (3 - 1) = 45 で弾1発毎の角度は45度
1発目を45度方向に射出 (45(ShapeのRotation.zの値))
2発目を90度方向に射出 (45 + 45)
3発目を135度方向に射出 (45 + 45 + 45)
ParticleSystemにアタッチするスクリプト
PlayerShooter.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerShooter : MonoBehaviour {
ParticleSystem particleSystem;
float shootRate = 0.25f;
private float count = 0.0f;
void Start() {
particleSystem = GetComponent<ParticleSystem>();
}
void Update() {
count += Time.deltaTime;
if (Input.GetButton("Fire1") && shootRate < count) {
particleSystem.Play();
count = 0;
}
}
void OnParticleCollision(GameObject c) {
Destroy(c.gameObject);
}
}
参考
https://forum.unity.com/threads/destroy-single-particles.490654/
https://docs.unity3d.com/ja/current/Manual/PartSysCollisionModule.html