実現したいこと
現在フライトシュミレーションゲームを作成しています。
エネミー側が使用する砲弾の仕様について以下のように実現したいです。
OnColliderEnterで接触判定をし、Rigidbodyの影響を受けることなくプレイヤーやオブジェクトにHitした時点でパーティクルを再生する
砲弾オブジェクトはRigidbody(UseGravity = true)をAddForce(ForceMode.Impulse)で射出しOnColliderEnterでHit判定しています。
そうするとHitした瞬間砲弾が当たったプレイヤーオブジェクトは彼方に吹き飛びます。
ですが接触した時に吹き飛ばない仕様にしたいです。
砲弾は弧を描くように射出したいのでUseGravityを使用したいです。
砲弾のRigidbody
砲弾のソースコード
C#
1public class TurretBullet : MonoBehaviour 2{ 3 public float turretBulletSpeed = 0.0f; 4 5 private TrailRenderer trail; 6 7 public Rigidbody bulletR; 8 9 10 public void Awake() 11 { 12 bulletR = GetComponent<Rigidbody>(); 13 trail = GetComponent<TrailRenderer>(); 14 } 15 16 private void OnEnable() 17 { 18 //Rigidbodyを初期化 19 bulletR.velocity = Vector3.zero; 20 //TrailRendererを初期化 21 trail.Clear(); 22 23 //出現後一定時間で非表示にする 24 StartCoroutine(BulletInvisible()); 25 //弾を前進させる 26 bulletR.AddForce(transform.forward * turretBulletSpeed, ForceMode.Impulse); 27 } 28 29 private void OnCollisionEnter(Collision collision) 30 { 31 if (collision.gameObject.tag == "Ground" || collision.gameObject.tag == "Player") 32 { 33 this.gameObject.SetActive(false); 34 ParticlePool.instance.GetExplosion(transform.position, transform.rotation); 35 } 36 } 37 38 private IEnumerator BulletInvisible() 39 { 40 yield return new WaitForSeconds(5); 41 this.gameObject.SetActive(false); 42 } 43}
試したこと
- 接触判定をOnColliderEnterでなくOnTriggerEnterでなら砲弾のRigidbodyの影響を受けることはないのですが、
砲弾の爆発パーティクルが地面の中や、プレイヤーを通り越してからの表示になってしまうのでプレイヤー画面からでは当たったのかよくわからなくなり、あまり良くない見栄えになってしまいました。
-
砲弾を射出と判定の2つのオブジェクトに分割し、親オブジェクトのRigidbodyを射出用(colliderなし)、子オブジェクトのColliderを判定用に(IsTrigger = false)、Rigidbodyはmassを0.01に設定しました、がプレイヤーオブジェクトは吹き飛んでしまいました。
-
プレイヤーオブジェクトのRigidbodyのMassを大きくする。元の10倍ぐらいにしても同じように吹き飛びました。
-
まだ試していないですが、プレイヤーオブジェクトに判定を移すという方法も考えましたが、後々砲弾の種類が増えたりするかもしれないので、調節が難しくなりそうだということと、やはりRigidbodyそのものを受けるのでどうしても吹き飛んでしまうきがするので、試していません。
環境情報など
・Unity 2019.3.
あなたの回答
tips
プレビュー