質問編集履歴

1

追記

2021/06/08 01:51

投稿

Y0241-N
Y0241-N

スコア1066

test CHANGED
File without changes
test CHANGED
@@ -159,3 +159,199 @@
159
159
 
160
160
 
161
161
  ```
162
+
163
+
164
+
165
+ #追記 2021/6/8 10:40
166
+
167
+ sakura_hana様のアドバイスに従ってInstantiateでparticleObjectを複製し、別物としてParticle Systemを保持し、これを後に変更した複製元に適用する。という方法を試したのですが、参照先に変更が適用されず、変数上で保持しているparticleには変更が適用されているという状態になってしまいます。
168
+
169
+
170
+
171
+ particleはparticleObjectにアタッチされているParticle Systemを参照しているのですが、なぜ変更が適用されないのか分からず困っています。
172
+
173
+
174
+
175
+ ```
176
+
177
+ using System.Collections;
178
+
179
+ using System.Collections.Generic;
180
+
181
+ using UnityEngine;
182
+
183
+ using UnityEngine.Playables;
184
+
185
+ using UnityEngine.Timeline;
186
+
187
+
188
+
189
+ public class ControllParticleBehaviour : PlayableBehaviour
190
+
191
+ {
192
+
193
+ public GameObject particleObject;
194
+
195
+ public GameObject copyOB;
196
+
197
+ public ParticleSystem particle;
198
+
199
+ public ParticleSystem copyPV;
200
+
201
+ public Transform playPos;
202
+
203
+ public bool isPlayOfPlayback;
204
+
205
+ public PostPlaybackEnum PostPlayback;
206
+
207
+ public enum PostPlaybackEnum
208
+
209
+ {
210
+
211
+ Active, //クリップを抜けた後もアクティブにする
212
+
213
+ NonActive, //クリップを抜けた後は非アクティブにする
214
+
215
+ Delete, //クリップを抜けた後は対称を破棄する
216
+
217
+ Revert //クリップを抜けた後は元の値に戻す
218
+
219
+ }
220
+
221
+
222
+
223
+ // クリップに入った時に走らせる処理
224
+
225
+ public override void OnBehaviourPlay(Playable playable, FrameData info)
226
+
227
+ {
228
+
229
+ if(particle != null)
230
+
231
+ {
232
+
233
+ Debug.Log("Start");
234
+
235
+
236
+
237
+ switch(PostPlayback)
238
+
239
+ {
240
+
241
+ case PostPlaybackEnum.Active:
242
+
243
+ break;
244
+
245
+
246
+
247
+ case PostPlaybackEnum.NonActive:
248
+
249
+ break;
250
+
251
+
252
+
253
+ case PostPlaybackEnum.Revert:
254
+
255
+
256
+
257
+ copyOB = Object.Instantiate(particleObject); //別オブジェクトとして複製
258
+
259
+ copyPV = copyOB.GetComponent<ParticleSystem>(); //再生前の Particle System として保持
260
+
261
+ copyOB.SetActive(false);
262
+
263
+
264
+
265
+ break;
266
+
267
+
268
+
269
+ case PostPlaybackEnum.Delete:
270
+
271
+ break;
272
+
273
+
274
+
275
+ default:
276
+
277
+ break;
278
+
279
+ }
280
+
281
+
282
+
283
+ if(playPos != null)
284
+
285
+ {
286
+
287
+ particleObject.transform.position = playPos.position;
288
+
289
+ }
290
+
291
+
292
+
293
+ particleObject.SetActive(true);
294
+
295
+
296
+
297
+ ParticleSystem.MainModule par = particle.main;
298
+
299
+ par.startLifetime = 10;
300
+
301
+
302
+
303
+ Debug.Log(copyPV.main.startLifetime.constant + " / 2"); // copyPV の startLifetime は再生前の値(例として値は「1」とする)を保っている
304
+
305
+ particle.Play();
306
+
307
+ }
308
+
309
+ }
310
+
311
+
312
+
313
+ // クリップを抜ける際に走らせる処理
314
+
315
+ public override void OnBehaviourPause(Playable playable, FrameData info)
316
+
317
+ {
318
+
319
+ if(particle.isPlaying && PostPlayback == PostPlaybackEnum.Revert && copyPV != null)
320
+
321
+ {
322
+
323
+ Debug.Log("!");
324
+
325
+ particle = copyPV; //ここで particleObject にアタッチされている Particle System の値を再生前の値に戻したい
326
+
327
+
328
+
329
+ Debug.Log(copyPV.main.startLifetime.constant + " / Copy"); // 1
330
+
331
+ Debug.Log(particle.main.startLifetime.constant + " / Default"); // 1
332
+
333
+ Debug.Log(particleObject.GetComponent<ParticleSystem>().main.startLifetime.constant); // 10 ← particleObject の Particle System は paritcle とイコールなはずなのに、変更が適用されていない
334
+
335
+ Object.Destroy(copyOB);
336
+
337
+ }
338
+
339
+
340
+
341
+ if(particle.isPlaying && PostPlayback == PostPlaybackEnum.NonActive)
342
+
343
+ {
344
+
345
+ Debug.Log("Stop");
346
+
347
+ particle.Clear();
348
+
349
+ particleObject.SetActive(false);
350
+
351
+ }
352
+
353
+ }
354
+
355
+ }
356
+
357
+ ```