【Unity】SE音の設定【正解音・ハズレ音】

今回のソースは、SE音の設定についてです。

使用するのはAudio Sourceコンポーネントです。

SE音だけでなく、BGMなんかもこいつの設定で簡単に出来ますね。

まずは、Hierarchy内にあるオブジェクトに対して、Audio Souceをアタッチします。

そして、流したい音楽を、AudioClipに設定するだけ。

なんとこれだけで、音楽が流れ出します。

BGMなんかは本当にこれだけの設定で完了ですね。

今回の様な正解音やハズレ音といったSE音は、
ゲーム開始にすぐなってもらって、
終わりでは困ります。

ユーザの選択によって、

あっている→正解音
外れている→ハズレ音

と流れて欲しいわけです。

ですので、第一段階として、
まずはゲーム開始時にならない様にします。

画像の中にある、
Play On Awake
これのチェックを外しましょう。

次の動作としては、
ユーザのタップで正解音・ハズレ音のいずれかを鳴らす必要があります。


 // クリック処理(正解時) 
Collect = GameObject.Find("Collect");
Collect.GetComponent<AudioSource>().Play();

 // クリック処理(ハズレ時) 
Fail = GameObject.Find("Fail");
Fail.GetComponent<AudioSource>().Play(); 

コードはこれだけです。

やっていることは、AudioSourceのPlay()という関数を呼ぶだけなんですね!

とてもわかりやすく用意されていますね!
(私はすぐ忘れるのでメモです )

【Unity】タイマー機能の作成

どうもozaniです。

制限時間を表示する、タイマー機能をテーマに以下のアプリを作成しました。
アプリの紹介記事はこちら!
【1日1本アプリ開発】柿をかわせ!【16本目】

時間を表示するテキストの作成

手始めに、制限時間を表示するテキストを追加します。
Create > UI > textを選択して、テキストを追加します。

今回のアプリでは60秒をカウントするので、初期のテキストに書かれている内容を60秒とします。
これは、InspectorタブのTextに60秒を表すように入力してあげればよいです。

これで、画面上に表示するタイマーのテキストが完成しました。

タイマースクリプトの作成

次に、1秒毎にタイマーテキストの表示を変更する、タイマースクリプトを作成しました。

	
    public class GameMaster : MonoBehaviour
    {
        
        public Text timer_text; // タイマーテキストを設定します。
        int timer_count = 60;  // 初期は残り60秒

        // Use this for initialization
        void Start()
        {
            StartCoroutine(CountTime()); //CountTime()を数秒(今回は1秒)おきに実行
        }

        public IEnumerator CountTime()
        {
            yield return new WaitForSeconds(1f); //1秒待機
            timer_count--; //制限時間を1秒減らす
            timer_text.text = string.Format("Time:{0}", timer_count.ToString()); //タイマーテキストを変更

            StartCoroutine(CountTime()); //CountTime()を実行
        }
    }

タイマー用のテキストに上記スクリプトをつけることで、制限時間を表示するタイマーとなります。

今回のスクリプトは、Unity(C#)のコルーチンという機能を用いて実装しました。
参考:Unity Document(MonoBehaviour.StartCoroutine)
メインの処理とは非同期に、動作・停止を繰り返し行う仕組みみたいです。

使いこなせたら便利なので、コルーチンについての説明は改めてどこかでしたいと思います。

【使用ゲームエンジン】
Unity2018.3.5.f1

【プロジェクト管理】
git(Bitbucket使用)

【1日1本アプリ開発】世界の愛してる!【13本目】

どうもozaniです。

開発13本目のアプリです。

【1日1本アプリ開発】世界の愛してる辞典!【13本目】

世界中の女性とお近づきになりたいと思ったこと、ありませんか。
そんな思いを込めて作成したアプリとなります。

 

・今日のちょっとソース。

シーン間の値の受け渡し

	
   // ラベル文言管理クラス
   class LabelWords
   {
       public static string ILoveYou { get; set; }
       public static string ILoveYouKana { get; set; }
   }
   // ドロップダウン変更イベント
   public class LanguageDropDown : MonoBehaviour
    {
        public void OnValueChanged(Dropdown dropdown)
        {
            switch (dropdown.value)
            {
                case 0:
                    LabelWords.ILoveYou = "愛してるよ";
                    LabelWords.ILoveYouKana = "アイシテルヨ";
                    break;
                case 1:
                    LabelWords.ILoveYou = "I love you";
                    LabelWords.ILoveYouKana = "アイラブユー";
                    break;
                    ……(略)
            }

        }
    }

上記のソースコードは、ドロップダウンを変更したときに動くプログラムです。

Unityでシーン間で値を共有する場合、最も簡単な方法は静的(static)な変数に値を入れてしまうことです。
上記のソースコードの様に、変数にstatic キーワードをつけることでその変数は静的な変数となります。

静的な変数の特徴は、プログラムの開始から終了まで値が保持され続けることです。
普通のstaticではない変数というのは、使い終わった後その値と領域は破棄されます。
今回リリースしたアプリを例にすると、最初のトップのシーンで言語を「英語」と選んでも、普通の変数だとシーンが切り替わるタイミングで破棄され、次の愛してるよのシーンでは何が選択されているのか、わからくなってしまいます。

staticな変数は乱立すると、「え、今これ何入ってるんだっけ?」と複雑怪奇なプログラムになり、思わぬバグの元となりますので、ご利用は控えめに!

【使用ゲームエンジン】
Unity2018.3.5.f1

【プロジェクト管理】
git(Bitbucket使用)

【知り合いに実際にプレイしてもらった感想】

グラフィック :

ボリューム  :

操作性    :

ゲームバランス:

独創性    :

クリアタイム :00分

【1日1本アプリ開発】サルを揃えろ!【11本目】

お初です、ozaniです。

開発11日目です。

【1日1本アプリ開発】サルを揃えろ!【11本目】

今日は簡単なパズルゲームを作成しました!

・今日のちょっとソース。


	
var currentPosIndex = picePosDict.
    Where(x => x.Value.name.Equals(flickPiece.name)).
    FirstOrDefault().Key;

パズルのピースの位置とそのオブジェクトを格納したHashtableをゲーム開始時に作成し、各ピースの位置を管理しました。

上記は、フリックしたピースの位置情報をLINQを使用して取得しているソースコードです。
C#はLINQがあるから大好きだったりします!

LINQを使用しない場合、ソースコードは下記のようなソースコードになるかと思います。

	
var currentPosIndex = 0f;
foreach (var index in picePosDict.Keys)
{
    if(picePosDict[index].name.Equals(flickPiece.name))
    {
        currentPosIndex = index;
        break;
    }
}

上記のコードを上から読んでいくと
「Hashtableの中身を順番にループで見ていき、フリックしたピースと名前が一致するオブジェクトがあれば、そのINDEXを保持してループから抜ける」
となります。

「Hashtableからフリックしたピースの位置をとってくる」ていう意味では、
1つ目のソースコードも、2つ目のソースコードも同義なのですが、
やりたいことをストレートに表現しているのは前者だと思いませんか?

積極的にC#やるなら、積極的にLINQ使っていきましょう!

【使用ゲームエンジン】
Unity 2018.3.5f1

【プロジェクト管理】
git(Bitbucket使用)

これからも、よろしくお願いします。