【GW企画】7日間でUnity製のカジュアルゲームを作る【5日目】

←【4日目】

「GW10連休を活かしUnityでカジュアルゲームを作ってリリースする企画」の5日目

5日目の計画

・BGM実装
・SE実装
・UI実装 / スコア実装
・ハイスコア実装
・ゲームオーバー画面
・ゲームスタート画面
・スタート / オーバー時のカメラ移動

5日目にやったこと

BGMの実装

BGMはFortniteやApexlegendsの実況配信しているTanaka90さんの冒頭のBGMでよく使われているノンビリ系の曲を使いたいと決めていた。
調べていたら『甘茶の音楽工房』さんの日々是好日ということがわかり、利用させていただいた。
・『甘茶の音楽工房』/日々是好日
・参考記事)音をつける
音をつける実装自体はアタッチするだけだったので難なく実装完了。

SEの実装

効果音はおなじみの「効果音ラボ」さんから拝借しました。
・効果音ラボ
SEはアタッチして任意のタイミングで発動する必要があったので、発生箇所に実行コードを挿入。
・参考記事)音声コンポーネント(音声ファイル)が複数の場合
private AudioSource sound01;
private AudioSource sound02;

AudioSource[] audioSources = GetComponents();
sound01 = audioSources[0];
sound02 = audioSources[1];

sound01.PlayOneShot(sound01.clip);
sound02.PlayOneShot(sound02.clip);

フォントの実装

デフォルメ化されたUnity-chanの元気な感じのイメージに合いそうなフォントを探す。・MODI工場 めもわーる
http://modi.jpn.org/font_memoir.php

MODI工場 めもわーる
MODI工場さんのめもわーるフォント

・参考記事)フォント
https://docs.unity3d.com/ja/current/Manual/class-Font.html

スコア機能の実装

パンケーキがお皿に乗る度にカウントがあがるように実装。
UI系の画面エラーで躓いたとき、UIの仕様宣言が抜けてることが多かったので要注意。
using UnityEngine.UI;
・参考記事)【Unity】スコアの表示:「はじめてのUnity」のブロック崩しを改造しながら学ぶ
・参考記事)Unity シーン間で変数を共有する方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Score : MonoBehaviour
{
    public GameObject score_object = null; // Textオブジェクト
    public static int score_num = 0; // スコア変数(staticで別ファイルからも参照できるようにする)
    //スコア加算する(呼び出しはプレイヤーから)
    public static int getScore()
    {
        score_num += 1;
        return score_num;
    }
    // 初期化
    void Start()
    {
    }
    // 更新
    void Update()
    {
        // オブジェクトからTextコンポーネントを取得
        Text score_text = score_object.GetComponent();
        // テキストの表示を入れ替える
        score_text.text = "Score:" + score_num;
        //score_num += 1; // とりあえず1加算し続けてみる
    }
}

ハイスコアの実装

ユーザーの最高得点が画面に残り続けるようにするための実装。

・参考記事)[Unity] ハイスコアの実装 & アプリを終了しても記録を残す方法
https://qiita.com/flight_77/items/74c4d1eac18f9fd3cdef

・参考記事)【Unity】値を保持したいとき
http://cocodrips.hateblo.jp/entry/2012/11/07/000321

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Score : MonoBehaviour
{
    //コンポーネントから追加できる書き方
    public GameObject score_object = null; // Textオブジェクト
    public GameObject highscore_object = null; // Textオブジェクト
    //スコアの変数
    public static int score_num = 0; // スコア変数(staticで別ファイルからも参照できるようにする)
    //ハイスコア
    private int highscore_num; //ハイスコア用変数
    private string key = "HIGH SCORE"; //ハイスコアの保存先キー
    //スコア加算する(呼び出しはプレイヤーから)
    public static int getScore()
    {
        score_num += 1;
        return score_num;
    }
    // 初期化
    void Start()
    {
        //保存しておいたハイスコアをキーで呼び出し取得し保存されていなければ0になる
        highscore_num = PlayerPrefs.GetInt(key, 0);
    }
    // 更新
    void Update()
    {
        //★通常スコアの処理
        // オブジェクトからTextコンポーネントを取得
        Text score_text = score_object.GetComponent();
        // テキストの表示を入れ替える
        score_text.text = "Score:" + score_num;
        //score_num += 1; // とりあえず1加算し続けてみる
        //★ハイスコアの処理
        // オブジェクトからTextコンポーネントを取得
        Text highscore_text = highscore_object.GetComponent();
        // テキストの表示を入れ替える
        highscore_text.text = "HighScore:" + highscore_num;
        //ハイスコアより現在スコアが高い時
        if (score_num > highscore_num)
        {
            //ハイスコア更新
            highscore_num = score_num;
            //ハイスコアを保存
            PlayerPrefs.SetInt(key, highscore_num);
        }
        //ハイスコアのリセット
        //PlayerPrefs.DeleteAll();
    }
}

ゲームオーバー画面の実装

ゲームオーバーした際にResourcesフォルダに格納してあるゲームオーバー用のCanvasのPrefabを生成する形で実装。

Button作成時の流れが間違ったこと多かったのでメモ
①Buttonを作成する
②Button用のスクリプトをアタッチする
③該当ButtonのOn Click()コンポーネントに追加し、同Buttonをアタッチした上でOn Clickの呼び出し設定を行う

Unity Button設定

・記事参考)ゲームオーバー処理を作る
▼プレイヤー側でのCanvasPrefabの生成

    // --------------------------------------------------------------------
    // ★ゲームオーバーの処理
    // --------------------------------------------------------------------
    public void GameOver()
    {
        //ゲームオーバー画面表示
        GameObject Canvas_GameOver =  Instantiate(Resources.Load("Canvas_GameOver")) as GameObject;
    }

トップ画面の実装

シーン移動のコードを実装したものの、ビルドセッティングでScene追加をしなかったためうまく動作しなかった。・参考記事)[Unity]LoadScene()でシーンが切り替わらない時の対処法
https://qiita.com/TERRAIN_JP/items/af4ea27ee7eab1208f53

オープニングのカメラ回転の実装

オープニングに動きがなくて寂しかったので机の周りを周回するようなカメラワークを追加してみた。

・参考記事)GameObjectを中心にカメラを回転させる
https://stepism.sakura.ne.jp/unity/wiki/doku.php?id=wiki:unity:tips:079

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Camera : MonoBehaviour
{
    public float fRotateSpeed = 10.0f;
    void Update()
    {
        
            // 移動量
            float fValue = fRotateSpeed * Time.deltaTime;
            // 回転
            transform.Rotate(0, fValue, 0, Space.World);
    }
}

5日目の振り返り

1日かけてUI実装が完了した。
基本的なコンポーネントへのアタッチを忘れたエラーが頻発したり、利用機能の宣言をしていないなどの初歩的なミスにハマって長く時間を取られてしまった…。
UI/スコア/サウンドが入ってくると完成に近づいた感じがしてきた。

→【GW企画】7日間でUnity製のカジュアルゲームを作る【6日目】

タイトルとURLをコピーしました