そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】効果音を複数使用したい場合の2つの設定方法

環境

Unity 2019.3.7f1

はじめに

2つ以上の効果音を使用したい時の設定方法です。

基本の記事の応用になります。
音の基本の記事はこちらです。
marumaro7.hatenablog.com



2つの設定方法

設定方法の決定方法は、
音のボリュームやピッチの「詳細設定が共通であるか」で決めます。

AudioSourceコンポーネントでいうこの設定値たちです。
image.png

・設定値が共通の場合
複数のAudioClipに対し、1つのAudioSourceコンポーネントを用意する方法
メリット:AudioSourceの用意は1つで済む
デメリット:個別で音の調整が必要な場合、設定が面倒(スクリプトからいちいち設定変更しないといけない)

・設定値が効果音ごとに異なる場合
1つのAudioClipに対し、1つのAudioSourceコンポーネントを用意する方法
メリット:個別で音の調整が事前に可能。
デメリット:AudioSourceを効果音の数だけ用意する必要がある。
無料の効果音を集めていくとそれぞれ音量が違うので私はこちらの方法で設定しています。


具体例

・設定値が共通の場合

複数のAudioClipに対し、1つのAudioSourceコンポーネントを用意します。

以下、3つのAudioClipを使用する例です。 スクリプトは次のように書きます。

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

public class test4 : MonoBehaviour
{
    [SerializeField] private AudioSource a;//AudioSource型の変数aを宣言 使用するAudioSourceコンポーネントをアタッチ必要

    [SerializeField] private AudioClip b1;//AudioClip型の変数b1を宣言 使用するAudioClipをアタッチ必要
    [SerializeField] private AudioClip b2;//AudioClip型の変数b2を宣言 使用するAudioClipをアタッチ必要 
    [SerializeField] private AudioClip b3;//AudioClip型の変数b3を宣言 使用するAudioClipをアタッチ必要 

    //自作の関数1
    public void SE1()
    {
        a.PlayOneShot(b1);
    }

    //自作の関数2
    public void SE2()
    {
        a.PlayOneShot(b2);
    }

    //自作の関数3
    public void SE3()
    {
        a.PlayOneShot(b3);
    }
}



対応するAudioSourceとAudioClipをアタッチ。
自作の関数をボタンや、特定のタイミングで呼び出して使用します。
(b1~b3は適当に効果音割り付けただけです~)
image.png



・設定値が効果音ごとに異なる場合

1つのAudioClipに対し、1つのAudioSourceコンポーネントを用意します。

3つのAudioClipを使用する例です。
効果音別で設定値を変更したいため、3つのAudioSourceを用意します。
スクリプトは次のように書きます。

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

public class test4 : MonoBehaviour
{
    [SerializeField] private AudioSource a1;//AudioSource型の変数a1を宣言 使用するAudioSourceコンポーネントをアタッチ必要
    [SerializeField] private AudioSource a2;//AudioSource型の変数a2を宣言 使用するAudioSourceコンポーネントをアタッチ必要
    [SerializeField] private AudioSource a3;//AudioSource型の変数a3を宣言 使用するAudioSourceコンポーネントをアタッチ必要

    [SerializeField] private AudioClip b1;//AudioClip型の変数b1を宣言 使用するAudioClipをアタッチ必要
    [SerializeField] private AudioClip b2;//AudioClip型の変数b2を宣言 使用するAudioClipをアタッチ必要 
    [SerializeField] private AudioClip b3;//AudioClip型の変数b3を宣言 使用するAudioClipをアタッチ必要 

    //自作の関数1
    public void SE1()
    {
        a1.PlayOneShot(b1);//a1にアタッチしたAudioSourceの設定値でb1にアタッチした効果音を再生
    }

    //自作の関数2
    public void SE2()
    {
        a2.PlayOneShot(b2);//a2にアタッチしたAudioSourceの設定値でb2にアタッチした効果音を再生
    }

    //自作の関数3
    public void SE3()
    {
        a3.PlayOneShot(b3);//a3にアタッチしたAudioSourceの設定値でb3にアタッチした効果音を再生
    }
}


image.png
対応するAudioSourceとAudioClipをアタッチ。
AudioSourceの設定を個別で変更することで細かい調整を行うことができます。

おわりに

もっと良いやり方があれば教えてください。

【Unity】サウンドの基本 AudioClip AudioSource AudioListener

環境

Unity 2019.3.7f1

はじめに

サウンドを再生したことはあるけど、
再生方法がいくつかあって、いまいち手順がまとまっていないためメモ

サウンドの基本

音を鳴らすには次の3つが必要です。
・AudioClip
 CDみたいなもの 自分でファイルを用意する。
  再生できる形式はaif、wav、mp3、oggです。
・AudioSource
 CDプレイヤーみたいなもの このコンポーネントをオブジェクトに付ける必要有り。
・AudioListener
 スピーカーみたいなもの MainCameraにこのコンポーネントが勝手についている。
  一つのシーンに2つ以上つけると警告がでる。

音の再生方法

音の再生方法は大きく分けて次の2種類
・AudioSourceにAudioClipを紐づけして再生

スクリプトから再生
  -Playメソッド
   BGM再生(重ねて再生×)
 
  -PlayOneShotメソッド
   SE再生(重ねて再生〇)
 
  -UnPauseメソッド
     一時停止を解除

音の停止方法

 スクリプトから停止
  -Stopメソッド
   CDプレイヤーでいう■ボタン 再度再生すると最初からの再生になる。

  -Pauseメソッド
    一時停止する

具体例

音の再生方法

・AudioSourceにAudioClipを紐づけして再生

AudioSourceコンポーネントを適当なオブジェクトに付けて
・オーディオクリップに音楽ファイルをアタッチ
・ゲーム開始時に再生にチェック
を行い実行することで再生できます。
image.png

スクリプトから再生

Playメソッド、PlayOneShotメソッドを使用するために
以下の前準備を行います。

前準備
・空のゲームオブジェクトを作成
・新規スクリプトを作成
・作成した空のオブジェクトに次の2つを割り当て
 AudioSourceコンポーネント
 作成した新規スクリプト
・AudioSourceコンポーネント設定
 「ゲーム開始時に再生」のチェックを外しておく

image.png

Playメソッド

主な用途はBGM再生です。
複数の音を重ねて再生できません。

では、Playメソッドを使って音を再生してみます。


まず、スクリプトをこのように書きます。

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

public class test4 : MonoBehaviour
{
    [SerializeField] private AudioSource a;//AudioSource型の変数aを宣言

    void Start()
    {
        a.Play();//AudioSource型が入っている変数aを再生
    }
}

[SerializeField]についての説明はこちら↓
marumaro7.hatenablog.com

次にインスペクター画面で
・AudioSourceを変数aにアタッチ
・再生したい音楽ファイル (AudioClip) 割り当て
  image.png

実行すると音が再生されます。

 

PlayOneShotメソッド

こちらは複数の音を重ねて再生できますが、ちょっと手間が増えます。

スクリプトはこちらにします。

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

public class test4 : MonoBehaviour
{
    [SerializeField] private AudioSource a;//AudioSource型の変数aを宣言
    [SerializeField] private AudioClip b;//AudioClip型の変数bを宣言

    void Start()
    {
        a.PlayOneShot(b);//AudioClip型の変数bを引数として、AudioSource型が入っている変数aを再生 
    }
}



変数aにAudioSourceをアタッチ
変数bに再生したいAudioClipをアタッチします。
image.png
実行することで音が再生されます。

 

UnPauseメソッド

一時停止を解除する
Pauseメソッドの具体例の項目で一緒に説明します。

 

音の停止方法

スクリプトから停止

音の停止、一時停止はPlayメソッドや「ゲーム開始時に再生」にて音が再生されている状態で使います。
   

Stopメソッド

ボタンに自作の関数を割り当てて使うコードです。

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

public class test4 : MonoBehaviour
{
    [SerializeField] private AudioSource a;//AudioSource型の変数aを宣言 再生するAudioSourceをアタッチ必要
   
    void Start()
    {        
    }

    //ボタンに割り当てる自作の関数
    public void PushButton()
    {
        a.Stop();//AudioSource型が入っている変数aを停止 
    }
}



新規でボタンを作成し、Buttonコンポーネントでこのように関数を割り当てることで使います。
image.png
再生している状態でボタンを押せば音が停止します。

 

Pauseメソッド

PauseメソッドとUnPauseメソッドのボタンを作り
一時停止・一時停止解除ができるようにします。

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

public class test4 : MonoBehaviour
{
    [SerializeField] private AudioSource a;//AudioSource型の変数aを宣言 再生するAudioSourceをアタッチ必要
   
    void Start()
    {        
    }

    //ボタン1つ目に割り当てる自作の関数
    public void PushButtonPause()
    {
        a.Pause();//AudioSource型が入っている変数aを一時停止 
    }

    //ボタン2つ目に割り当てる自作の関数
    public void PushButtonUnPause()
    {
        a.UnPause();//AudioSource型が入っている変数aを一時停止解除 
    }

}

2つのボタンに自作の関数をそれぞれ割り当てることで
一時停止と一時停止解除を行うことができます。



応用記事

marumaro7.hatenablog.com

marumaro7.hatenablog.com

【Unity】型変換 string→int string→float float→int int→桁数指定してstring

環境

Unity 2019.3.7f1

はじめに

私がよく使う型変換
・string→int
・string→float
・float→int
・int→桁数指定してstring

をまとめました。(覚えられない)

方法

・string→int
int型の変数 = int.Parse("数字の文字")

・string→float
float型の変数 = float.Parse("数字の文字")

・float→int
float→intに関しては2種類あります。

-(int)を使う-
int型の変数 = (int)数値 
小数点以下は切り捨てになります。

-Mathfを使用した変換-
切り上げ: int型の変数 = Mathf.CeilToInt(数値);
切捨て : int型の変数 = Mathf.FloorToInt(数値);
四捨五入: int型の変数 = Mathf.RoundToInt(数値);
RoundToIntに関して、
小数点が5の場合、偶数に近い方に変換されるため注意!

・int→桁数指定してstring
string型の変数 = 数値.ToString("000")
0の数で桁数が決まります。

具体例

・string→int

文字列の100をint型に変換後、計算できるか確認するため1を足してます。

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

public class test : MonoBehaviour
{
    private int a;//int型の変数aを宣言
    
    void Start()
    {
        a = int.Parse("100");//文字列100を数値に変換し変数aに代入
        a = a + 1;//変数aに1を足してみる
        Debug.Log("a="+a);//コンソールに表示
    }
}

image.png



・string→float

文字列の1.111をfloat型に変換後、計算できるか確認するため1を足しています。 変換する文字列に「f」はつけないことに注意!!

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

public class test : MonoBehaviour
{
    private float a;//float型の変数aを宣言
    
    void Start()
    {
        a = float.Parse("1.111");//文字列1.111を数値に変換し変数aに代入
        a = a + 0.1f;//変数aに0.1を足してみる
        Debug.Log("a="+a);//コンソールに表示
    }
}

image.png


・float→int

-(int)を使う-

1.9999をint型に変換します。

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

public class test : MonoBehaviour
{
    private int a;//int型の変数aを宣言
    
    void Start()
    {
        a = (int)1.9999f;//1.9999をint型に変換し変数aに代入
        Debug.Log("a="+a);//コンソールに表示
    }
}

小数点以下は切り捨てられ1になりました。
image.png


-Mathfを使用した変換-

切り捨て、切り上げ、四捨五入がありますが、 代表して一番ややこしい四捨五入を行います。 なにがややこしいかというと、小数点が0.5の時、偶数に近いほうに変換されます。 これはもう"四捨五入ではないなにか"です。 1.1、1.5, 1.9、2.1, 2.5, 2.9で処理してみましょう。

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

public class test : MonoBehaviour
{
    private int a;//int型の変数aを宣言
    private int b;//int型の変数bを宣言
    private int c;//int型の変数cを宣言
    private int d;//int型の変数dを宣言
    private int e;//int型の変数eを宣言
    private int f;//int型の変数fを宣言

    void Start()
    {        
        a = Mathf.RoundToInt(1.1f);//1.1を四捨五入しint型に変換
        b = Mathf.RoundToInt(1.5f);//1.5を四捨五入しint型に変換
        c = Mathf.RoundToInt(1.9f);//1.9を四捨五入しint型に変換
        d = Mathf.RoundToInt(2.1f);//2.1を四捨五入しint型に変換
        e = Mathf.RoundToInt(2.5f);//2.5を四捨五入しint型に変換 計算結果注意
        f = Mathf.RoundToInt(2.9f);//2.9を四捨五入しint型に変換

        Debug.Log("a=" + a);//コンソールに表示
        Debug.Log("b=" + b);//コンソールに表示
        Debug.Log("c=" + c);//コンソールに表示
        Debug.Log("d=" + d);//コンソールに表示
        Debug.Log("e=" + e);//コンソールに表示
        Debug.Log("f=" + f);//コンソールに表示
    }
}

2.5の処理結果e=をみると2となっています。
このように私たちの感覚では2.5を四捨五入すると3になりますが、
偶数に近い側の2に変換されてしまいます。
image.png



・int→桁数指定してstring

10を三桁の文字列に変換します。

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

public class test4 : MonoBehaviour
{
    private string a;//string型の変数aを宣言

    void Start()
    {        
        a = 10.ToString("000");//数値を桁数指定で文字列に変換
        Debug.Log("a=" + a);//コンソールに表示
    }
}


010の文字列となりました。
image.png

おわりに

・文字列から数値はParse
・floatからintはMathfを確認
・数値から桁数指定はToString
くらいの感じで覚えておけばすぐ対応できそうですね。

【Unity】switch文の判定を文字列で行う

環境

Unity 2019.3.7f1

はじめに

switch文は数値だけでなく文字列でも判定できるのでメモ。

具体例

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

public class test : MonoBehaviour
{
    string a;//string型の変数aを宣言
    
    void Start()
    {
        a="算数";//変数aに算数を代入

        switch (a)
        {
            case "算数": //aが算数の時に実行する
                Debug.Log("電卓を使います"); //コンソールに表示
                break;  //switch文から抜ける

            case "理科": //aが社会の時に実行する
                Debug.Log("薬品を使います"); //コンソールに表示
                break; //switch文から抜ける

            default:    //aが上記以外の場合に実行する
                Debug.Log("そんな教科はありません"); //コンソールに表示
                break; //switch文から抜ける
        }
    }
}

実行結果

image.png

おわりに

数値判定の時と同じ感覚でできちゃいますね。

【Unity】UIの透過をスクリプトからまとめて調整するCanvasGroup

環境

Unity 2019.3.7f1

はじめに

ボタンの透過率を変更しても
ボタンに付けているテキストの透過率は一緒に変化しません。

まとめて透過率を変更したいときはCanvasGroupが便利です。

手順

1.透過値を変更したいUIを適当オブジェクトにまとめる
2.まとめたオブジェクトにCanvasGroupコンポーネントを追加
3.スクリプトからCanvasGroupコンポーネントを取得しアルファ値を変更する
 CanvasGroup型の変数.alpha=0f~1f;

具体例

3つのボタンの透過値を実行後50%に変更していきます。

1.ボタンを3つ作成 image.png

2.CanvasにCanvasGroupコンポーネントを追加
image.png

CanvasGroupコンポーネントが追加されました。
image.png


3.スクリプト作成
スクリプトを新規作成します。スクリプト名はCanvasTestとしました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//UIを使うとき追加

public class CanvasTest : MonoBehaviour
{
    [SerializeField] private CanvasGroup a;//CanvasGroup型の変数aを宣言 あとでCanvasGroupをアタッチする
        
    void Start()
    {
        a.alpha = 0.5f;//変数aのalpha値を変更
    }
}



4.空のゲームオブジェクト作成&スクリプトをアタッチ
image.png


5.スクリプトにCanvasGroupをアタッチ
Canvasを空のオブジェクトのスクリプトの変数a欄にアタッチ
image.png


CanvasGroupの場所を覚えさせることができました。
image.png


6.実行結果
透過率がまとめて変わりました~。
image.png

おわりに

個別の透過率変更とはサヨナラです♪

【Unity】否定演算子の使い方

環境

Unity 2019.3.7f1

はじめに

否定演算子の使い方がわからなくなるのでメモ

使い方

使い方は2種類
・if文で使用
 if(変数 != 数値)
 {
  処理内容
 }

・trueとfalseを逆にする
 変数 = !変数;

具体例

・if文で使用

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

public class test : MonoBehaviour
{
    int a;

    void Start()
    {
        a = 2;

        //aが1ではないなら処理
        if(a != 1)
        {
            Debug.Log("aは1じゃないよ");//コンソールに表示
        }       
    }
}

実行結果
image.png



・trueとfalseを逆にする

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

public class test : MonoBehaviour
{   
    bool a;
    
    void Start()
    {
        a = true;

        a = !a;
        Debug.Log("a=" + a);
        a = !a;
        Debug.Log("a=" + a);
        a = !a;
        Debug.Log("a=" + a);
        a = !a;
        Debug.Log("a=" + a);        
    }
}

実行結果
image.png

おわりに

なにかと使える否定演算子

【Unity】シーンの事前ロード

環境

Unity 2019.3.7f1

はじめに

移動先のシーンが重くて遷移まで間が開いてしまう問題を解決するべく
シーンの事前ロードについて調べました。

方法

事前ロードし、ボタンを押したらシーン移動するコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//追加

public class SceneTest : MonoBehaviour

{
    AsyncOperation a;//AsyncOperation型の変数aを宣言
    void Start()
    {
        //SceneManager.LoadSceneAsync("GameScene")の返り値(型はAsyncOperation)を変数aに代入
        a = SceneManager.LoadSceneAsync("GameScene");

        //AsyncOperationの中の変数allowSceneActivationをfalseにする
        //これがtrueになるとシーン移動する
        a.allowSceneActivation = false;
    }

    //ボタンに割り当て
    public void Change_Scene_button()
    {       
        //trueにしてシーン移動
         a.allowSceneActivation = true;
    }
}


解説

SceneManager.LoadSceneAsync("シーン名");のみを使ってシーン移動する場合、
下図のことが処理されています。
image.png


allowSceneActivationの情報を下図のように一旦falseにしておくことで
シーン読み込み後のシーン移動をストップします。
image.png

おわりに

ちょっとややこしいですが、定型文として覚えておく程度で良いと思います。
動けばOKの精神♪