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

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

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

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

Unity

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

Q&A

解決済

1回答

3057閲覧

(Unity)他のクラス(スクリプト)から呼び出したサウンド(メソッド)を1回だけ鳴らす方法

auiz

総合スコア13

C#

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

Unity

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

0グッド

0クリップ

投稿2017/03/20 19:23

Unity(C#)でVRのゲームを作っています。
特にエラー等は出ていないのでアップデート関数より上とInvokeで呼び出しているGameStartメソッドは割愛しております。
スタートボタンを見つめたら(Rayを当てたら)スタートボタンが赤くなりシーンがゲームプレイ画面へと遷移するというコードです。

Rayがコライダー(スタートボタン)に当たったら”バン”(鉄砲の音です)と音を1度鳴らせてからシーンを遷移させたいのですが、以下のコードのように当たり前ではあるのですが、Rayがコライダーに当たったらRayがコライダーに当たってる限り、シーンが遷移するまで"バンバンバンバン"と何度も音がなってしまいます。
ShotSoundメソッドは他スクリプトに記述している.playOneShotメソッドをShotSoundメソッド内に記述し、このスクリプトで宣言したsound変数に格納しているものです。
このsound.ShotSoundメソッドを1度だけ実行する、もしくはこの音を一回だけ鳴らしたり、連続して音が出ないようにする方法はないのでしょうか。。
調べたのですが全く解決方法が見つからなかったため質問いたしました。
お手数をおかけしますが、何卒お力添えをよろしくお願いします。

void Update () { Ray ray = new Ray (diveCamera.transform.position, diveCamera.transform.forward); RaycastHit hit; if (Physics.Raycast (ray, out hit)) { if (hit.collider.gameObject.tag == "changecollider") { for (int i = 0; i < changeImages.Length; i++) { changeImages [i].GetComponent<Image> ().color = Color.white; } sound.ShotSound ();//このサウンドを鳴らすメソッドを1度だけ実行させたい。連続して音が出ないようにしたい。 hit.collider.gameObject.transform.parent.GetComponent<Image> ().color = Color.red; Invoke ("GameStart", 3f); } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

メンバにbool型ですでにRayがヒットしているかの変数を持たせるのはどうですか?

private bool isHitRay; // すでにヒットしたか void Update () { Ray ray = new Ray (diveCamera.transform.position, diveCamera.transform.forward); RaycastHit hit; if (Physics.Raycast (ray, out hit)) { if (hit.collider.gameObject.tag == "changecollider") { if (!isHitRay) { // 一度もヒットしていないなら処理を行う isHitRay = true; // ヒットした for (int i = 0; i < changeImages.Length; i++) { changeImages [i].GetComponent<Image> ().color = Color.white; } sound.ShotSound ();//このサウンドを鳴らすメソッドを1度だけ実行させたい。連続して音が出ないようにしたい。 hit.collider.gameObject.transform.parent.GetComponent<Image> ().color = Color.red; Invoke ("GameStart", 3f); } } } }

投稿2017/03/20 20:09

doubutweet

総合スコア141

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

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

auiz

2017/03/20 20:45

1発で解決しました!本当にありがとうございます! ちなみにif文の中に ! が付いている理由って何でしょうか? 外してみたら作用しなくて自分も ! 状態だったのですが。
doubutweet

2017/03/20 21:11

isHitRayの値を反転させるために使っています `!`はNOT演算といい、後ろに記述してあるisHitRayの値を反転して返します isHitRayの値がtrueならfalse、falseならtrueを返します isHitRayの初期値はfalseの為、一回目はfalseが反転してtrueとなり if文の中の処理が実行されます しかしそのif文内で`isHitRay = true;`とisHitRayの値をtrueに変更しており、 二回目以降はtrueが反転してfalseとなってしまう為、if文の中の処理が実行されなくなります 余談ですがisHitRayの初期値をtrueにして、途中をfalseを代入するようにすれば!は不要になる書き方もできます、そこは好みです
auiz

2017/03/21 17:38

そういえば参考書等でNOT演算みたことありました。こういう場面で使うのですね。 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問