リブlab

理系大学生のIT・電気・大学・趣味についての日記

Unityの罠をQ&A形式で解決してしんぜよう01

 今度、今回の記事の内容を分割して記事にします。タイトルだけだと欲しい情報見つけにくいと思うので。

目次

 Q.ifの条件にGetAxisを使いたいけどcastしても通用しない!どうしよう!

 A.if(Input.GetAxis("Horizontal") != 0) { //do something }のようにしましょう。

 Q.ゲーム(Scene)を再生すると勝手に音が出るんすけど。

 A.AudioSourceのPlayOnAwakeを確認しよう!チェックがついているはずだ!

 Q.それでもだめです!

 A.なにー!それならこのようなコードを書け!

    AudioSource mysound;
    bool toggle = false;

   void Update()
    {
  if(!toggle)
       Invoke("toggleChange", 0.1f);
  if(toggle)
       {
            if (!(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A)
                || Input.GetKey(KeyCode.S)  || Input.GetKey(KeyCode.D)))
            {
                mysound.Play();
            }
       }
    }
    //副作用マシマシな関数ですまない
    void toggleChange()
    {
        toggle = true;
    }

 このスクリプトのようにtoggleをフラッグにして判定すればいいぞ!こうすることで一回だけInvokeすることになる!

 今回の場合だと、WASDキーの内どれかを押している間は音が出て、押していないときは音が出ないぞ!勿論、開始時に音は出ない!!!(何故これでうまくいくのか分かってないがうまくいった。(なんでNOT演算子がいるんですかね))

 ちなみに、これは開始時に音を出さないようにInvokeによりn秒後に処理を実行するようにしている。今回の処理はtoggleをfalseからtrueに変更した。Invokeは処理を遅らせて実行するのに使われているぞ。
 処理速度的にifの入れ子はどうかと思うがしゃーない。

 Q.ポーズ画面をTime.timeScaleで実装したら音が鳴り続けるぞゴラァ

 A.申し訳ございませんお客様。今回の場合ですとこのように実装なさってはいかがでしょうか。

    // Update is called once per frame
    void Update()
    {
        if (ポーズが呼ばれたとき)
        {
            if (ポーズUIがインスタンス化されていない時)
            {
    ポーズUIをインスタンス化
                Time.timeScale = 0f;
                AudioListener.volume = 0;
            }
            else
            {
                Destroy(ポーズUI);
                Time.timeScale = 1f;
                Invoke("AudioChange", 0.1f);
                
            }
        }
    }
    void AudioChange()
    {
        AudioListener.volume = 1;
    }

 のように実装なさってください。使いやすいように不必要な情報を省き、抽象化しております。Pause画面の作り方をご存じなければ、下記の記事をご参考ください。

gametukurikata.com

  では、今回のスクリプトのご説明をさせていただきます。AudioListner.volumeの値を変えることでミュート機能を実装しました。ポーズ時にBGMをおかけになる場合には使えませんのでご注意ください。
 AudioListner.volumeの値をいじることで聞こえる音量を調節できます。
値の範囲は0.0~1.0です。0の時に聞こえません。
ちなみにAudioListner.pauseというものもございます。
 Invokeにつきましては、ゲーム再開後に謎の音声が出ますのでその対策に記述していますことをご留意ください。

参考リンク

AudioListener.volume - Unity スクリプトリファレンス

AudioListener.pause - Unity スクリプトリファレンス

 Q.ポーズUIのつくり方のリンクの通りにUpdate関数に下記のものを実装しましたがUpdate関数が止まりません。
   void Update()
    {
        //これでpauseしてる時にUpdateを止める。しかし、音はなる。しかし、音以外の処理はうまくいく。
        if (Mathf.Approximately(Time.timeScale, 0f))
        {
            return;
        }
     }

 A.仕様かバグです。諦めて他の手を考えましょう。なので一つ上のやり方で実践してください。

さいごに

 今回の記事はすべて自分の経験をもとに書いています。なぜPlayOnAwakeのチェックを外してもゲーム開始時に音がでるのかとか、それ対策のコードで何故解決できたのかとかは一応理由は予測できてますが

if (!(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) 
  || Input.GetKey(KeyCode.S)  || Input.GetKey(KeyCode.D)))

 これについては全く意味が分かりませんが、これからも精進したいと思います。 その過程で得たものなどは備忘録がてら日記を書くことで、皆さんと共有したいと思います。
 コメントやマサカリ歓迎です。お待ちしています。ご閲覧ありがとうございました。