質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

18641閲覧

パーティクルシステムの再生位置をスクリプトで制御したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

3クリップ

投稿2016/09/25 08:22

編集2016/09/25 08:24

###前提・実現したいこと

シーン上のパーティクルシステムの再生時間をスクリプトで制御したいと思っています。

シーン上にパーティクルシステムを置いた場合、そのシミュレートとして、ゲームを実行しなくても、Particle Effectパネルで、Playback Time(再生時間)を指定できたり、Stopボタンで、Playback Timeを0.00の時間にリセットすることができますが、この操作をゲーム実行時にスクリプトで行いたいと思っています。

timeプロパティがそれらしき変数と思ってコードを組んでみたのですが、変化はありませんでした。

スクリプトで、パーティクルシステムをリセット(Playback Timeを0.00にするイメージ)したり、再生位置を指定(Playback Timeを指定した時間にするイメージ)して、途中から再生たりする方法のご教授をお願い致します。

ちなみにStop()を呼び出しても、パーティクルの再生時間は0.00にリセットされないことを確認しています。

###試したこと

timeプロパティを操作してみたが、変化しない。

C#

1GameObject pObject; 2ParticleSystem particle; 3 4 void Start(){ 5 pObject = GameObject.Find ("Particle System"); 6 particle = pObject.GetComponent<ParticleSystem> (); 7 particle.Stop (); 8 } 9 10 void Update(){ 11 if (Input.GetKeyDown (KeyCode.X)) { 12 particle.time = 0; //リセットされない。 13 particle.Play (); 14 } 15 if (Input.GetKeyDown (KeyCode.Y)) { 16 particle.time = 3; //途中から再生されない。 17 particle.Play (); 18 } 19 } 20

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

書いてみました。

###ポイント Simulate
ParticleSystem.Simulate(float t, bool withChildren = true, bool restart = true);
https://docs.unity3d.com/jp/current/ScriptReference/ParticleSystem.Simulate.html
このメソッドで実現できると思います。

###実装
2000ミリ秒ごとにパーティクルをリセットするプログラムです。
適当なオブジェクトに以下スクリプトをアタッチしてインスペクタ上から操作したいパーティクルを指定してください。

C#

1using UnityEngine; 2using System.Collections; 3//FOR TEST 4using UnityEngine.Events; 5 6public class paricleManager : MonoBehaviour { 7 8 //パーティクルを指定 9 [SerializeField] 10 ParticleSystem particle; 11 12 void Awake() 13 { 14 StartCoroutine(testLoop(2f,()=>{ 15 particle.Simulate(0.0f,true,true); 16 particle.Play(); 17 })); 18 } 19 20 //FOR TEST 21 IEnumerator testLoop(float waitTme,UnityAction action) 22 { 23 var waitTime = new WaitForSeconds(waitTme); 24 while (true){ 25 yield return waitTime; 26 action (); 27 } 28 } 29}

投稿2016/09/25 10:20

編集2016/09/25 13:51
IShix

総合スコア1724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/25 13:28

ご回答ありがとうございます。1点だけ気になったのですが、2fと書かれているので、200ミリ秒でなく、2000ミリ秒ごとにリセットされるプログラムという認識で大丈夫ですか?
IShix

2016/09/25 13:52

そうですね。おっしゃる通りです。本文を2000ミリ秒に修正しました。
退会済みユーザー

退会済みユーザー

2016/09/25 14:02

ご回答ありがとうございます。再生時間を制御できるようになりました。また、UnityActionというものを知らなかったので、勉強になりました。調べてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問