particle systemとparticle systemの重なり判定もしくは当たり判定ができないというのを調べました。
Hose_Water_Particlesは放水のgameopbject
using UnityEngine;
using System.Collections;public class ParticleCollision : MonoBehaviour
{
private void Start()
{
GameObject Water = GameObject.Find("Hose_Water_Particles");
} private void OnCollisionEnter(Collider other)
{ if (other.gameObject.tag == "Water")
{
Destroy(other.gameObject);
} }
}
※ソース
ts_un_stu_202012/-/tree/user/taka/99_Portfolio/MyPortfolio
以下の点に注意してもう一度確認してください。
②どちらかのColliderの「isTrigger」がtrueになっており、CollisionEnterで判定が取れなくなってしまっているか
③そのParticleSystemのレイヤーと、当たって欲しいオブジェクトのレイヤーがヒットするようになっているか
④Destroyがうまくいっていないだけで、当たり判定自体は問題ないのか(breakポイント等を使って確認するといいですね)
「ParticleCollision」スクリプト内の関数OnCollisionEnterを消して、以下の様に書き換えれば『炎に放水し、炎に当たれば炎が消える』という実装ができます。
private void OnParticleCollision(GameObject obj)
{
if (obj.tag == "Water")
{
Destroy(this.gameObject);
}
}
OnParticleCollision関数
を使用します。OnParticleCollision関数は引数として必ずGamobject型の変数を使用します。
以下のサイトも参考にしてみて下さい。
https://qiita.com/Mikoshi/items/ed2e02acdce3ee5c3998
this.gameobject
で炎自身のオブジェクトを指定してください。そうすれば、放水のパーティクルが触れた時点で炎のオブジェクトが消えます。
ありがとうございます!
続けて質問ですが、5秒間当たればtransform.scaleを半分に、
10秒間当たれば消すというようなif文を作成したいと考えております。
何か良い記事かヒントをいただけませんでしょうか。
OnParticleCollisionはパーティクルが触れている間ずっと呼ばれるので、
変数で触れている時間を計測して、if文等で経過時間ごとに効果を実装すれば良いと思います。
具体的な実装方法は手探りで是非試してみて下さい。
using UnityEngine;
using System.Collections;
public class ParticleCollision : MonoBehaviour
{
float seconds = 5f;
private void Start()
{
GameObject Water = GameObject.Find("Hose_Water_Particles"); }
private void OnParticleCollision(GameObject obj)
{ seconds += Time.deltaTime; if (obj.tag == "Water")
{
Destroy(this.gameObject);
}
}
}
時間は指定できたのですが、接触する時間の算出はどのようにやればいいのでしょうか。
パーティクルが触れている間ずっと呼ばれる
ので、記載して頂いたスクリプトの変数「seconds」で接触時間の計測は出来ていますよ。
if( 指定時間 < seconds ) //指定時間よりsecondsが大きくなったらif文の処理を開始
{
処理
}
using UnityEngine;
using System.Collections;
public class ParticleCollision : MonoBehaviour
{
float seconds = 10f;
private void Start()
{
GameObject Water = GameObject.Find("Hose_Water_Particles");
}
private void OnParticleCollision(GameObject obj)
{ seconds += Time.deltaTime; if (obj.tag == "Water")
{
if ( 9 < seconds)
{
Destroy(this.gameObject);
}
}
}
}
何度もすみません。接触した瞬間消えるのですが、、、間違えてますか?
OnParticleCollision関数は、自身の炎のパーティクルに接触した際にも関数内の処理が呼ばれます。
現在のスクリプトでは、水のパーティクルが触れていなくても、常に変数secondsでの時間計測が行われてしまいます。
なので、「seconds += Time.deltaTime;」を「if (obj.tag == "Water")」の中に入れて下さい。
そうすれば、水のパーティクルが触れた時のみ時間計測が行われるはずです。
プロジェクトを確認したのですが、正常に水を当て続けて9秒経過した後に炎のオブジェクトが消えます。
状況確認がこちらでできない状態なので、ひとまず「ParticleCollision」スクリプトの
変数「seconds」に[SerializeField]を付けてインスペクタに表示するか、
Debug.Logを使うかで、数値がどのように変動しているかを確認してみて下さい。
そうすれば「Water」タグを持ったパーティクルが触れる前から数値が増えているのか、
「Water」タグを持ったパーティクルが触れたら急激な増え方をしているか等がわかるはずです。
「9秒間BoxColiderにパーティクルの接触があったら、炎が消える」という感じですね。
OnParticleCollisionはBoxColiderにパーティクルが当たった場合に呼ばれるので、この解釈で問題ありません。