回答編集履歴

5

追記

2017/09/16 05:24

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,5 +1,215 @@
1
+ ###[追記]各パーティクルの位置とオブジェクトの位置をUpdate内でチェックする
2
+
3
+ 簡単で軽く良い方法が見当たらなかったのでCollision モジュールもTriggerモジュールも使用しない方法を考えてみました。やり方は単純ですべてのパーティクルの位置と該当のオブジェクトの位置を比較する方法です。
4
+
5
+
6
+
7
+ **注意点**
8
+
9
+ - Update内で毎回すべてのパーティクルの位置を取得して比較するので結構重そうです。
10
+
11
+ - オブジェクトとパーティクルが重なっている間中、連続して通知され続けます。
12
+
13
+
14
+
15
+ **コードの参考 ※未検証です**
16
+
17
+ **オブジェクトは止まっていると仮定したコードです**
18
+
19
+ **パーティクルが画面外に出た場合の処理などは入れてません**
20
+
21
+
22
+
23
+ 1 パーティクルにアタッチするスクリプト
24
+
25
+ ```C#
26
+
27
+ using System.Collections.Generic;
28
+
29
+ using UnityEngine;
30
+
31
+ using System;
32
+
33
+ using System.Linq;
34
+
35
+
36
+
37
+ [RequireComponent(typeof(ParticleSystem))]
38
+
39
+ public class hitParticleWatcher : MonoBehaviour
40
+
41
+ {
42
+
43
+ ParticleSystem part;
44
+
45
+ List<monitoringObj> monitoringObjs = new List<monitoringObj>();
46
+
47
+
48
+
49
+ public struct monitoringObj
50
+
51
+ {
52
+
53
+ public Vector3 pos;
54
+
55
+ public float distance;
56
+
57
+ public Action callBack;
58
+
59
+ }
60
+
61
+
62
+
63
+ void Start()
64
+
65
+ {
66
+
67
+ part = GetComponent<ParticleSystem>();
68
+
69
+ }
70
+
71
+
72
+
73
+ /// <summary>
74
+
75
+ /// hitParticleWatcherに自身をセット
76
+
77
+ /// </summary>
78
+
79
+ /// <param name="pos">オブジェクトのポジション</param>
80
+
81
+ /// <param name="distance">どのぐらいの距離で重なったことにするかを指定</param>
82
+
83
+ /// <param name="callBack">重なった時に実行される関数</param>
84
+
85
+ public void monitoring(Vector3 pos, float distance, Action callBack)
86
+
87
+ {
88
+
89
+ var c = new monitoringObj();
90
+
91
+ c.pos = pos;
92
+
93
+ c.distance = distance;
94
+
95
+ c.callBack = callBack;
96
+
97
+ monitoringObjs.Add(c);
98
+
99
+ }
100
+
101
+
102
+
103
+ void Update()
104
+
105
+ {
106
+
107
+ if(monitoringObjs.Count > 0 && part.particleCount > 0)
108
+
109
+ {
110
+
111
+ var ParticleList = new ParticleSystem.Particle[part.particleCount];
112
+
113
+ part.GetParticles(ParticleList);
114
+
115
+
116
+
117
+ //パーティクルと重なったオブジェクトがあればコールバックを返す
118
+
119
+ monitoringObjs.Where(
120
+
121
+ x => ParticleList.Any(
122
+
123
+ p => Vector3.Distance( x.pos, p.position ) <= x.distance
124
+
125
+ )
126
+
127
+ ).ToList().ForEach(x => {
128
+
129
+ x.callBack();
130
+
131
+ hitObj( x );
132
+
133
+ });
134
+
135
+ }
136
+
137
+ }
138
+
139
+
140
+
141
+ //衝突したオブジェクトを取得
142
+
143
+ void hitObj(monitoringObj obj)
144
+
145
+ {
146
+
147
+ Debug.Log(obj.pos);
148
+
149
+ }
150
+
151
+ }
152
+
153
+ ```
154
+
155
+
156
+
157
+ 2 オブジェクトにアタッチするスクリプト
158
+
159
+
160
+
161
+ ```C#
162
+
163
+ using UnityEngine;
164
+
165
+
166
+
167
+ public class obj : MonoBehaviour
168
+
169
+ {
170
+
171
+ //とりあえずインスペクターから設定するようにしました
172
+
173
+ [SerializeField]
174
+
175
+ hitParticleWatcher partWatcher;
176
+
177
+
178
+
179
+ void Awake()
180
+
181
+ {
182
+
183
+ //hitParticleWatcherに自身をセット
184
+
185
+ partWatcher.monitoring(gameObject.transform.position, 1f, hitParticle);
186
+
187
+ }
188
+
189
+
190
+
191
+ //重なっている間連続してメソッドが実行されるので注意してください。
192
+
193
+ void hitParticle()
194
+
195
+ {
196
+
197
+ Debug.Log("HIT");
198
+
199
+ }
200
+
201
+ }
202
+
203
+ ```
204
+
205
+
206
+
207
+
208
+
1
209
  ###Collisionモジュールの衝突判定をなくす
2
210
 
211
+ **※[追記] この方法ではOnParticleCollisionが走らないようです。**
212
+
3
213
  Collision モジュールをWorld モードで使用中でしたらCollides Withの値をEverythingから任意の値に変更することで衝突判定がなくなるようです。
4
214
 
5
215
 

4

コードを再掲

2017/09/16 05:24

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -30,12 +30,80 @@
30
30
 
31
31
 
32
32
 
33
- **OnParticleCollision 関数を実装する**
33
+ **パーティクルシステムにOnParticleCollision 関数を実装したクラスをアタッチする**
34
34
 
35
35
 
36
36
 
37
+ ```C#
38
+
39
+ using UnityEngine;
40
+
41
+ using System.Collections.Generic;
42
+
43
+
44
+
45
+ public class ExampleClass : MonoBehaviour
46
+
47
+ {
48
+
49
+ public ParticleSystem part;
50
+
51
+ public List<ParticleCollisionEvent> collisionEvents;
52
+
53
+
54
+
55
+ void Start()
56
+
57
+ {
58
+
59
+ part = GetComponent<ParticleSystem>();
60
+
61
+ collisionEvents = new List<ParticleCollisionEvent>();
62
+
63
+ }
64
+
65
+
66
+
37
- 引数でゲームオブジェクトが飛んできますが、パーティクルのオブジェクトのようです。
67
+ void OnParticleCollision(GameObject other)
68
+
69
+ {
70
+
71
+ int numCollisionEvents = part.GetCollisionEvents(other, collisionEvents);
72
+
73
+
74
+
75
+ int i = 0;
76
+
77
+ while (i < numCollisionEvents)
78
+
79
+ {
80
+
81
+ // 衝突したオブジェクトに何かしら処理をする
82
+
83
+ collisionEvents[i].colliderComponent.gameObject.SetActive(false);
84
+
85
+ i++;
86
+
87
+ }
88
+
89
+ }
90
+
91
+ }
92
+
93
+ ```
94
+
95
+ ※コードは未検証です。オフィシャルのコードを元に改変しました。求めているものでない可能性もあります。一度試してみてください。
38
96
 
39
97
 
40
98
 
41
99
  [https://docs.unity3d.com/jp/540/ScriptReference/MonoBehaviour.OnParticleCollision.html](https://docs.unity3d.com/jp/540/ScriptReference/MonoBehaviour.OnParticleCollision.html)
100
+
101
+
102
+
103
+ **実装のポイントを上記リンクから引用**
104
+
105
+
106
+
107
+ > コライダー が現在のフレームで、あるパーティクルシステムの複数のパーティクルと衝突した場合でも、 コライダー は、指定されたフレームで衝突した各パーティクルシステムにつき、最多でも 1 つのメッセージしか受け取りません。 パーティクルシステム によるすべての衝突に関する詳細な情報を得たい場合は、 ParticlePhysicsExtensions.GetCollisionEvents を使って ParticleSystem.CollisionEvent の配列を取得する必要があります。
108
+
109
+

3

修正中

2017/09/14 08:50

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  ###Collisionモジュールの衝突判定をなくす
4
2
 
5
3
  Collision モジュールをWorld モードで使用中でしたらCollides Withの値をEverythingから任意の値に変更することで衝突判定がなくなるようです。
@@ -36,34 +34,8 @@
36
34
 
37
35
 
38
36
 
39
- ```C#
40
-
41
- using UnityEngine;
42
-
43
- using System.Collections;
44
-
45
- using System.Collections.Generic;
37
+ 引数でゲームオブジェクトが飛んできますが、パーティクルのオブジェクトのようです。
46
38
 
47
39
 
48
40
 
49
- public class ExampleClass : MonoBehaviour
50
-
51
- {
52
-
53
- void OnParticleCollision(GameObject other)
54
-
55
- {
56
-
57
- //オブジェクトが引数で飛んでくるのでここで何かしらする
58
-
59
- }
60
-
61
- }
62
-
63
- ```
64
-
65
-
66
-
67
- ※コードは未検証です。オフィシャルからの引用になります。
68
-
69
41
  [https://docs.unity3d.com/jp/540/ScriptReference/MonoBehaviour.OnParticleCollision.html](https://docs.unity3d.com/jp/540/ScriptReference/MonoBehaviour.OnParticleCollision.html)

2

追記

2017/09/14 08:40

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -1,4 +1,8 @@
1
+
2
+
3
+ ###Collisionモジュールの衝突判定をなくす
4
+
1
- Collision モジュールをWorld モードで使用中でしたらCollides Withの値をEverythingから任意の値に変更することで求めていことがきそうな気がしまがいかがでしょうか
5
+ Collision モジュールをWorld モードで使用中でしたらCollides Withの値をEverythingから任意の値に変更することで衝突判定がなくなようです。
2
6
 
3
7
 
4
8
 

1

追記

2017/09/14 08:33

投稿

IShix
IShix

スコア1724

test CHANGED
@@ -11,3 +11,55 @@
11
11
 
12
12
 
13
13
  [https://docs.unity3d.com/jp/540/Manual/PartSysCollisionModule.html](https://docs.unity3d.com/jp/540/Manual/PartSysCollisionModule.html)
14
+
15
+
16
+
17
+
18
+
19
+ ###[追記] Collision モジュールでパーティクルが、オブジェクトと重なったときに、重なった先のオブジェクトを取得
20
+
21
+ > Send Collision Messages の値を有効にすると、OnParticleCollision 関数を使用してスクリプトからパーティクルの衝突を検知することができます。
22
+
23
+
24
+
25
+ **Send Collision Messagesをオンにする**
26
+
27
+ ![Collision モジュール](d76159905c20e3d5667fc8f7ded9127d.png)
28
+
29
+
30
+
31
+ **OnParticleCollision 関数を実装する**
32
+
33
+
34
+
35
+ ```C#
36
+
37
+ using UnityEngine;
38
+
39
+ using System.Collections;
40
+
41
+ using System.Collections.Generic;
42
+
43
+
44
+
45
+ public class ExampleClass : MonoBehaviour
46
+
47
+ {
48
+
49
+ void OnParticleCollision(GameObject other)
50
+
51
+ {
52
+
53
+ //オブジェクトが引数で飛んでくるのでここで何かしらする
54
+
55
+ }
56
+
57
+ }
58
+
59
+ ```
60
+
61
+
62
+
63
+ ※コードは未検証です。オフィシャルからの引用になります。
64
+
65
+ [https://docs.unity3d.com/jp/540/ScriptReference/MonoBehaviour.OnParticleCollision.html](https://docs.unity3d.com/jp/540/ScriptReference/MonoBehaviour.OnParticleCollision.html)