teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

追記

2021/06/08 01:51

投稿

Y0241-N
Y0241-N

スコア1066

title CHANGED
File without changes
body CHANGED
@@ -78,4 +78,102 @@
78
78
  }
79
79
  }
80
80
 
81
+ ```
82
+
83
+ #追記 2021/6/8 10:40
84
+ sakura_hana様のアドバイスに従ってInstantiateでparticleObjectを複製し、別物としてParticle Systemを保持し、これを後に変更した複製元に適用する。という方法を試したのですが、参照先に変更が適用されず、変数上で保持しているparticleには変更が適用されているという状態になってしまいます。
85
+
86
+ particleはparticleObjectにアタッチされているParticle Systemを参照しているのですが、なぜ変更が適用されないのか分からず困っています。
87
+
88
+ ```
89
+ using System.Collections;
90
+ using System.Collections.Generic;
91
+ using UnityEngine;
92
+ using UnityEngine.Playables;
93
+ using UnityEngine.Timeline;
94
+
95
+ public class ControllParticleBehaviour : PlayableBehaviour
96
+ {
97
+ public GameObject particleObject;
98
+ public GameObject copyOB;
99
+ public ParticleSystem particle;
100
+ public ParticleSystem copyPV;
101
+ public Transform playPos;
102
+ public bool isPlayOfPlayback;
103
+ public PostPlaybackEnum PostPlayback;
104
+ public enum PostPlaybackEnum
105
+ {
106
+ Active, //クリップを抜けた後もアクティブにする
107
+ NonActive, //クリップを抜けた後は非アクティブにする
108
+ Delete, //クリップを抜けた後は対称を破棄する
109
+ Revert //クリップを抜けた後は元の値に戻す
110
+ }
111
+
112
+ // クリップに入った時に走らせる処理
113
+ public override void OnBehaviourPlay(Playable playable, FrameData info)
114
+ {
115
+ if(particle != null)
116
+ {
117
+ Debug.Log("Start");
118
+
119
+ switch(PostPlayback)
120
+ {
121
+ case PostPlaybackEnum.Active:
122
+ break;
123
+
124
+ case PostPlaybackEnum.NonActive:
125
+ break;
126
+
127
+ case PostPlaybackEnum.Revert:
128
+
129
+ copyOB = Object.Instantiate(particleObject); //別オブジェクトとして複製
130
+ copyPV = copyOB.GetComponent<ParticleSystem>(); //再生前の Particle System として保持
131
+ copyOB.SetActive(false);
132
+
133
+ break;
134
+
135
+ case PostPlaybackEnum.Delete:
136
+ break;
137
+
138
+ default:
139
+ break;
140
+ }
141
+
142
+ if(playPos != null)
143
+ {
144
+ particleObject.transform.position = playPos.position;
145
+ }
146
+
147
+ particleObject.SetActive(true);
148
+
149
+ ParticleSystem.MainModule par = particle.main;
150
+ par.startLifetime = 10;
151
+
152
+ Debug.Log(copyPV.main.startLifetime.constant + " / 2"); // copyPV の startLifetime は再生前の値(例として値は「1」とする)を保っている
153
+ particle.Play();
154
+ }
155
+ }
156
+
157
+ // クリップを抜ける際に走らせる処理
158
+ public override void OnBehaviourPause(Playable playable, FrameData info)
159
+ {
160
+ if(particle.isPlaying && PostPlayback == PostPlaybackEnum.Revert && copyPV != null)
161
+ {
162
+ Debug.Log("!");
163
+ particle = copyPV; //ここで particleObject にアタッチされている Particle System の値を再生前の値に戻したい
164
+
165
+ Debug.Log(copyPV.main.startLifetime.constant + " / Copy"); // 1
166
+ Debug.Log(particle.main.startLifetime.constant + " / Default"); // 1
167
+ Debug.Log(particleObject.GetComponent<ParticleSystem>().main.startLifetime.constant); // 10 ← particleObject の Particle System は paritcle とイコールなはずなのに、変更が適用されていない
168
+ Object.Destroy(copyOB);
169
+ }
170
+
171
+ if(particle.isPlaying && PostPlayback == PostPlaybackEnum.NonActive)
172
+ {
173
+ Debug.Log("Stop");
174
+ particle.Clear();
175
+ particleObject.SetActive(false);
176
+ }
177
+ }
178
+ }
81
179
  ```