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

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

ただいまの
回答率

92.00%

  • C#

    3169questions

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

  • Unity

    1439questions

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

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

解決済

回答 1

投稿 2017/03/21 04:23

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

auiz

score 2

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);
                }

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

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/21 05:09

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/03/21 05:45

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

    キャンセル

  • 2017/03/21 06: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を代入するようにすれば!は不要になる書き方もできます、そこは好みです

    キャンセル

  • 2017/03/22 02:38

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

    キャンセル

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

ただいまの回答率

92.00%

関連した質問

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

  • C#

    3169questions

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

  • Unity

    1439questions

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

閲覧数の多いC#の質問

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