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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

1回答

1450閲覧

オブジェクトとプレイヤーが当たったらパーティクルを表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2018/07/24 13:17

編集2018/07/26 15:02

タイトルの通りオブジェクトとプレイヤーが当たったらパーティクルを表示させたいです。
オブジェクトは複数のprefab化されている物から一つだけをランダムで選び、それをゲーム画面に呼び出されています。

↓prefab化されているオブジェクトにアタッチしているスクリプト

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class YasaiController : MonoBehaviour { 6 public ParticleSystem hosi; 7 public GameObject yasai; 8 9 void Start () { 10 hosi = this.GetComponent<ParticleSystem>(); 11 hosi.Stop(); 12 } 13 14 void OnCollisionEnter2D ( Collision2D other) { 15 if (other.gameObject.tag == "point") { 16 Destroy(yasai); 17 hosi.Play(); 18 } 19 } 20} 21

MissingComponentException: There is no 'ParticleSystem' attached to the "tomato(Clone)" game object, but a script is trying to access it.

You probably need to add a ParticleSystem to the game object "tomato(Clone)". Or your script needs to check if the component is attached before using it.
UnityEngine.ParticleSystem.Stop () (at /Users/builduser/buildslave/unity/build/artifacts/generated/common/modules/ParticleSystem/ParticleSystemBindings.gen.cs:4050)
YasaiController.Start () (at Assets/Scripts/YasaiController.cs:11)

とエラーが出たので検索してみましたが、解決方法が記載されていませんでした。
ご教授願います。

追記1

↓現在のprefab化されているオブジェクトにアタッチしているスクリプト

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class YasaiController : MonoBehaviour { 6 [SerializeField] ParticleSystem hosi; 7 8 void Start () { 9 Debug.Log(hosi != null ? "ParticleSystemが子要素にアタッチされている" : "PParticleSystemが子要素にアタッチされていない"); 10 hosi = GetComponentInChildren<ParticleSystem>(); 11 } 12 13 void OnCollisionEnter2D (Collision2D other) { 14 if (other.gameObject.tag == "point") { 15 hosi.Play(); 16 Destroy(yasai); 17 } 18 } 19}

↓tomatoにアタッチしているスクリプト、パーティクル
イメージ説明
↓パーティクルの設定
イメージ説明

追記2

tomatoに直接Particleをアタッチ。
イメージ説明
↓tomatoにアタッチしているスクリプト

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class YasaiController : MonoBehaviour { 6 [SerializeField] ParticleSystem hosi; 7 public GameObject yasai; 8 9 void Start () { 10 hosi = GetComponent<ParticleSystem> (); //ここを追加 11 Debug.Log(hosi != null ? "ParticleSystemが子要素にアタッチされている" : "ParticleSystemが子要素にアタッチされていない"); 12 } 13 14 IEnumerator OnCollisionEnter2D (Collision2D other) { 15 if (other.gameObject.tag == "point") { 16 hosi.Play (); 17 18 yield return new WaitForSeconds (0.8f); //0.8秒待つ。しかし、この間はオブジェクトは削除されない。それを改善したい。 19 20 Destroy (yasai); 21 } 22 } 23}

"yield return new WaitForSeconds (0.8f);"これで0.8秒待ち、その間にパーティクルを出すことによってパーティクルを出すことができました。しかし、その0.8秒の間tomatoは削除されないのでそこを、tomatoがpointというタグのオブジェクトに当たったらすぐに削除&パーティクルを出すようにしたい。
ご教授願います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

[追記] NullReferenceException が発生する

ゲーム開始時にParticle Systemがアタッチされたオブジェクトが非表示の状態で生成されておりませんか?その場合、Particle Systemの初期化が終わってないのでStop()を呼んだタイミングでNullReferenceExceptionエラーが発生します。オブジェクトのチェックボックスを入れるか、hosi.Stop()を呼ばないことでエラーは消えると思います。
イメージ説明

もしエフェクトが開始しないように非表示にしているのでしたらPlay On Awakeのチェックボックスを外すことでPlayを呼ぶまで動きませんので、Start()の hosi.Stop()と見た目はほぼ同じ動作になります。

イメージ説明

MissingComponentExceptionが発生する

tomatoにParticleSystemがアタッチされていないようですね。子要素にアタッチしていませんか?
イメージ説明

その場合GetComponentInChildrenで取得できます。

C#

1using UnityEngine; 2 3public class GetChildTest : MonoBehaviour 4{ 5 ParticleSystem hosi; 6 7 void Start() 8 { 9 hosi = GetComponentInChildren<ParticleSystem>(); 10 11 Debug.Log(hosi != null ? "ParticleSystemが子要素にアタッチされている" : "PParticleSystemが子要素にアタッチされていない"); 12 } 13}

何度も登場するオブジェクトの場合、GetComponentInChildrenやGetCompornentは重い処理なのでInspectorからアタッチするのがおすすめです。用途によって使い分けると良いと思います。
イメージ説明

C#

1using UnityEngine; 2 3public class GetChildTest : MonoBehaviour 4{ 5 [SerializeField] ParticleSystem hosi; 6 7}

投稿2018/07/24 19:07

編集2018/07/25 06:33
IShix

総合スコア1724

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

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

退会済みユーザー

退会済みユーザー

2018/07/24 23:52

ご回答ありがとうございます。 GetComponentInChildrenで取得してみたところ、次のようなエラーが発生しました。 NullReferenceException: Object reference not set to an instance of an object YasaiController.Start () (at Assets/Scripts/YasaiController.cs:11) "Debug.Log(hosi != null ? "ParticleSystemが子要素にアタッチされている" : "PParticleSystemが子要素にアタッチされていない");"これでは"ParticleSystemが子要素にアタッチされている"と表示されています。 原因が分かりましたらご教授願います。
IShix

2018/07/25 06:27

追記しましたのでご覧ください。
退会済みユーザー

退会済みユーザー

2018/07/25 07:11

追記の部分の"Play On Awake"とオブジェクトのチェックボックスを外してみましたが、先ほどと同じエラーが出てしまいました。
IShix

2018/07/25 13:39

オブジェクトの構造を画像で掲載できませんか?そして、どのオブジェクトにYasaiController、ParticleSystemをアタッチしているかオブジェクト名教えてほしいです。
退会済みユーザー

退会済みユーザー

2018/07/25 14:33

追記に載せました。
IShix

2018/07/25 14:42

hosi = GetComponentInChildren<ParticleSystem>()を削除して確認してもらってもいいですか?
IShix

2018/07/25 14:46 編集

あとParticle SystemがアタッチされたParticle-hosiオブジェクトのチェックボックスは外すのではなく入れてください。
退会済みユーザー

退会済みユーザー

2018/07/25 15:07

"hosi = GetComponentInChildren<ParticleSystem>()を削除"削除してみたところエラーは出なくなりましたが、パーティクルは出ません。 "Particle SystemがアタッチされたParticle-hosiオブジェクトのチェックボックスは外すのではなく入れてください"Particle-hosiオブジェクトのチェックボックスは入れてあります。
IShix

2018/07/25 20:23

Particle SystemのLoopingはオンですか?それならPrewarmのチェックボックスを入れてみてください。
退会済みユーザー

退会済みユーザー

2018/07/26 00:27

Particle SystemのLoopingはオフにしています。 設定画面を追記に載せましたのでご覧ください。
IShix

2018/07/26 13:26

初期化時にStop()した場合、見えてないだけで内部でパーティクルが生成されています。その状態からオブジェクトを表示すると内部で生成されていたパーティクルが一気に表示されます。 今回の場合、"Play On Awake"で停止しているのでPlay()のタイミングで生成され始めます。その都合でオブジェクトを消すまで短い場合など、表示されてないように見えたりします。 ここからは、設定やオブジェクトを消すタイミングの問題で今回のエラーとは関係無いので、色々試してみて再質問していただいてもよろしいでしょうか? よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2018/07/26 14:51

"追記2"を新たに記載しました。 tomatoに直接パーティクルを入れることによって、パーティクルが任意のタイミングで出るようになりました。 しかし、追記2にも書いてある通り、0.8秒の間パーティクルを出す時間が必要なので(この時間の間にDestroyを行うと、パーティクルそのものも消えてしまうため)どうにかして削除&パーティクルを同時に行いたいです。 よろしければ、引き続きご教授願います。
退会済みユーザー

退会済みユーザー

2018/07/29 00:50

isTriggerのon/ofで無事解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問