🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

2323閲覧

ブロック崩しで弾く棒に弾が当たった時だけ効果音を流したい

such22

総合スコア10

C#

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

Unity

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

0グッド

0クリップ

投稿2019/10/21 08:43

編集2019/10/21 09:04

前提・実現したいこと

Unityを始めたばかりで、
3Dのブロック崩しを作っており、
弾く棒に弾が当たった時だけ効果音を流したいです。
(ifを使って条件分岐したいです。)

発生している問題・エラーメッセージ

現状、ブロックや壁に当たった時も音声が流れてしまい、
下記のようにプログラムを書いてみたら、
何も音声が流れません。

エラーメッセージ NullReferenceException: Object reference not set to an instance of an object Sound2.OnCollisionEnter (UnityEngine.Collision collision) (at Assets/Scripts/Sound2.cs:17)

該当のソースコード

using UnityEngine; public class Sound2 : MonoBehaviour { public AudioClip sound; private AudioSource audioSource; private void OnCollisionEnter(Collision collision) { if (collision.gameObject.name == "Sphere") { audioSource.Play(); } else { audioSource.Stop(); } } }

試したこと

OnCollisionEnter(Collision collision)について調べてみて、
ifを追加してみましたが、効果音が流れません。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問欄に記載されている「NullReferenceException」というエラーは今後良く見ることになるかもしれないので教えておきますが、存在しないものを見ようとしているよ!という内容のエラーです。
今回は17行目のaudioSource.Play();ができない→つまりaudioSourceの中身がありませんよ!といわれています。

対応方法:
①audioSourceがprivate宣言されているということもありこのスクリプトはブロック崩しで弾く棒オブジェクトについていると思いますので、そのオブジェクトにAudio Sourceというコンポーネントをつけてあげましょう。これはこのオブジェクトから音を流すよ!というコンポーネントです。
②そして追加したAudio SourceのAudioClipに音を指定してあげるとその効果音が鳴るようになります。
③そしてこのスクリプトに、

C#

1void Start() { 2 audioSource = GetComponent<AudioSource>(); 3}

というプログラムを追加してあげましょう。
内容は、このオブジェクトが生成されたときにオブジェクトにくっついているAudioSourceコンポーネントを取得してaudioSourceに保存しておくよ!という内容です。
④最後にこの処理はいらないと思います。
これはボールが当たっているときに音が鳴るけど、逆に当たっていないときにはすぐに音を止めるよ。という内容になってしまうので、そのままだと当たった瞬間だけ「ポ」見たいな一瞬音が鳴ったかな?位の感じになってしまうかと思います。

C#

1else 2{ 3 audioSource.Stop(); 4}

これらができるようになればきっとボールが当たったときに効果音が鳴るようになるでしょう。

投稿2019/10/21 09:26

megumin

総合スコア78

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

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

such22

2019/10/25 00:52

ご回答いただきありがとうございます。 megumin様に教えていただいた通り、 プログラムを書き換えてみたのですが、 ゲームが始まった瞬間に音声が再生され、 その後は音声が流れないです。 以下のコードの if (collision.gameObject.name == "Sphere") の部分がおかしいのかと思いますが、 原因がわかりません。 何か解決方法があれば教えていただきたいです。 以下コード-------------------------------------- using UnityEngine; public class Sound2 : MonoBehaviour { public AudioClip sound; private AudioSource audioSource; private void OnCollisionEnter(Collision collision) { if (collision.gameObject.name == "Sphere") { audioSource.Play(); } void Start() { audioSource = GetComponent<AudioSource>(); } } }
megumin

2019/10/25 01:04

1.ゲームが始まった瞬間に音が流れるのはおそらく、①のときに追加したAudio Sourceの「Play On Awake」にチェックが入っているからだと思います。これはこのオブジェクトが生成されたときに鳴らすよ!というものなので最初になってほしくない場合はチェックをはずします。 2.void Start()~の記述位置が間違ってますね^^;これは省略しているのですが、「private void Start()」というMonoBehaviour(Unity)ですでに作られている関数のことです。意味はこのオブジェクトが生成されたときに1回だけ処理を行う関数です。これをOnCollisionEnter関数の内側ではなく、外側に置くようにしましょう。OnCollisionEnterの上でも下でも問題ありません。関数の位置は処理とは関係ないのでお好きな場所にどうぞ。 using UnityEngine; public class Sound2 : MonoBehaviour { public AudioClip sound; private AudioSource audioSource; void Start() { audioSource = GetComponent<AudioSource>(); } private void OnCollisionEnter(Collision collision) { if (collision.gameObject.name == "Sphere") { audioSource.Play(); } } }
such22

2019/10/25 04:21

megumin様 「Play On Awake」のチェックと、 void Start()~の記述位置を修整したら、 音声が流れました! 質問が拙い部分も多々あったと思いますが、 丁寧に回答していただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問