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

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

ただいまの
回答率

90.34%

  • C#

    7705questions

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

  • Unity

    4418questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    976questions

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 304

nyattou55

score 41

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class YasaiController : MonoBehaviour {
    public ParticleSystem hosi;
    public GameObject yasai;

    void Start () {
        hosi = this.GetComponent<ParticleSystem>();
        hosi.Stop();
    }

    void OnCollisionEnter2D ( Collision2D other) {
        if (other.gameObject.tag == "point") {
            Destroy(yasai);
                hosi.Play();
            }
        }
}

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化されているオブジェクトにアタッチしているスクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class YasaiController : MonoBehaviour {
    [SerializeField] ParticleSystem hosi;

    void Start () {
        Debug.Log(hosi != null ? "ParticleSystemが子要素にアタッチされている" : "PParticleSystemが子要素にアタッチされていない");
        hosi = GetComponentInChildren<ParticleSystem>();
    }

    void OnCollisionEnter2D (Collision2D other) {
        if (other.gameObject.tag == "point") {
            hosi.Play();
            Destroy(yasai);
            }
        }
}


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

 追記2

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class YasaiController : MonoBehaviour {
    [SerializeField] ParticleSystem hosi;
    public GameObject yasai;

    void Start () {
        hosi = GetComponent<ParticleSystem> (); //ここを追加
        Debug.Log(hosi != null ? "ParticleSystemが子要素にアタッチされている" : "ParticleSystemが子要素にアタッチされていない");
    }

    IEnumerator OnCollisionEnter2D (Collision2D other) {
        if (other.gameObject.tag == "point") {
            hosi.Play ();

            yield return new WaitForSeconds (0.8f); //0.8秒待つ。しかし、この間はオブジェクトは削除されない。それを改善したい。

            Destroy (yasai);
        }
    }
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

 [追記] NullReferenceException が発生する

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

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

イメージ説明

 MissingComponentExceptionが発生する

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

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

using UnityEngine;

public class GetChildTest : MonoBehaviour
{
    ParticleSystem hosi;

    void Start()
    {
        hosi = GetComponentInChildren<ParticleSystem>();

        Debug.Log(hosi != null ? "ParticleSystemが子要素にアタッチされている" : "PParticleSystemが子要素にアタッチされていない");
    }
}

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

using UnityEngine;

public class GetChildTest : MonoBehaviour
{
    [SerializeField] ParticleSystem hosi;

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/25 08: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が子要素にアタッチされている"と表示されています。
    原因が分かりましたらご教授願います。

    キャンセル

  • 2018/07/25 15:27

    追記しましたのでご覧ください。

    キャンセル

  • 2018/07/25 16:11

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

    キャンセル

  • 2018/07/25 22:39

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

    キャンセル

  • 2018/07/25 23:33

    追記に載せました。

    キャンセル

  • 2018/07/25 23:42

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

    キャンセル

  • 2018/07/25 23:45 編集

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

    キャンセル

  • 2018/07/26 00:07

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

    キャンセル

  • 2018/07/26 05:23

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

    キャンセル

  • 2018/07/26 09:27

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

    キャンセル

  • 2018/07/26 22:26

    初期化時にStop()した場合、見えてないだけで内部でパーティクルが生成されています。その状態からオブジェクトを表示すると内部で生成されていたパーティクルが一気に表示されます。

    今回の場合、"Play On Awake"で停止しているのでPlay()のタイミングで生成され始めます。その都合でオブジェクトを消すまで短い場合など、表示されてないように見えたりします。

    ここからは、設定やオブジェクトを消すタイミングの問題で今回のエラーとは関係無いので、色々試してみて再質問していただいてもよろしいでしょうか?

    よろしくお願いいたします。

    キャンセル

  • 2018/07/26 23:51

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

    キャンセル

  • 2018/07/29 09:50

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

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    7705questions

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

  • Unity

    4418questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity2D

    976questions