超初心者のゲーム開発記~Unity~

超初心者がUnityでゲーム(目標はAndroidアプリ )を開発していくブログです!

【Unity 2Dローグライク】公式チュートリアルをやってみる 最終回~スマートフォンに対応する

こんにちは!ヤギです!

Unityの2Dローグライクの
公式チュートリアルをやってみる 遂に最終回になります!
※前回(part.14)の記事はこちら
www.yagigame.com

記事概要

今回の記事では、スマートフォンに対応する方法についてご説明していきます。
※最終回に対応する公式チュートリアルの章は、Adding Mobile Controlsです!
unity3d.com

※この記事は、ひよこのたまご様の記事をリスペクトしています。
hiyotama.hatenablog.com

タッチパネルで操作する~スワイプ操作~

まず初めに、スマートフォンに対応するためにビルド設定を変えます。
1. File > Build Settings > iOSもしくはAndroidを選択し、Switch Platformをクリックします。
f:id:yagigame:20181110025649p:plain
2. タッチパネルでスワイプすることでプレイヤーを操作できるように、Player.csを修正します。
※ソース内に解説を記載いたしました!ご参照くださいませ!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; //シーンの読み込みに必要
using UnityEngine.UI; //part.13で追加

//MovingObjectクラスを継承する
public class Player : MovingObject
{
    //ここから最終回で追加
    //タッチ場所の初期化
    private Vector2 touchOrigin = -Vector2.one;
    //ここまで最終回で追加

    //ここからpart.14で追加
    //効果音
    public AudioClip moveSound1;
    public AudioClip moveSound2;
    public AudioClip eatSound1;
    public AudioClip eatSound2;
    public AudioClip drinkSound1;
    public AudioClip drinkSound2;
    public AudioClip gameoverSound;
    //ここまでpart.14で追加

    //ここからpart.13で追加
    public Text foodText; //食料を表示するテキスト
    //ここまでpart.13で追加

    public int wallDamage = 1; //壁へのダメージ量
    public int pointsPerFood = 10; //食べ物の回復量
    public int pointsPerSoda = 20; //ソーダの回復量
    public float restartLevelDeray = 1f; //ステージ移動時の時間

    private Animator animator; //アニメーション用変数
    private int food; //食料


    // Use this for initialization
    //MovingObjectクラスのStartを継承する
    protected override void Start()
    {
        //animatorのコンポーネントを設定
        animator = GetComponent<Animator>();
        //foodをステージ間で引き継げるように、GameManagerから設定
        food = GameManager.instance.playerFoodPoints;
        //ここからpart.13で追加
        //foodTextを初期化
        foodText.text = "Food: " + food;
        //ここまでpart.13で追加
        //GameObjectのStartを呼び出す
        base.Start();
    }

    //PlayerのfoodをGameManageに保存する
    public void OnDisable()
    {
        GameManager.instance.playerFoodPoints = food;
    }

    protected override void AttemptMove<T>(int xDir, int yDir)
    {
        //移動するたびに食料が減る
        food--;
        //ここからpart.13で追加
        //減らした食料をUIに表示する
        foodText.text = "Food: " + food;
        //ここまでpart.13で追加
        //MovingObjectのAttemptMoveを呼び出す
        base.AttemptMove<T>(xDir, yDir);

        RaycastHit2D hit;

        //ここからpart.14で追加
        //動いた時の効果音を鳴らす
        if (Move(xDir, yDir, out hit))
        {
            SoundManager.instance.RandomizeSFx(moveSound1, moveSound2);
        }
        //ここまでpart.14で追加

        //ゲームオーバーか確認
        CheckIfGameOver();
        //プレイヤーのターン終了
        GameManager.instance.playerTurn = false;
    }

    //プレイヤーが壁にぶつかった場合、壁をチョップする
    protected override void OnCantMove<T>(T component)
    {
        //Wallスクリプトを使えるように設定
        Wall hitWall = component as Wall;
        //壁にダメージを与える
        hitWall.DamageWall(wallDamage);
        //チョップするアニメーションを呼び出す
        animator.SetTrigger("PlayerChop");
    }

    //プレイヤーが、Exit、Food、Sodaと接触した場合に呼び出す
    private void OnTriggerEnter2D(Collider2D other)
    {
        //Exitと接触した場合
        if (other.tag == "Exit")
        {
            //ステージ移動の時間分待ってから、次のツテージに移動する
            Invoke("Restart", restartLevelDeray);
            enabled = false;
        }
        else if (other.tag == "Food")
        { //食料と接触した場合
            //食料を回復
            food += pointsPerFood;
            //ここからpart.13で追加
            //増えた食料をUIに表示する
            foodText.text = "+" + pointsPerFood + " Food: " + food;

            //ここからpart.14で追加
            //食べた時の効果音を鳴らす
            SoundManager.instance.RandomizeSFx(eatSound1, eatSound2);
            //ここまでpart.14で追加

            //ここまでpart.13で追加
            //食料を削除
            other.gameObject.SetActive(false);
        }
        else if (other.tag == "Soda")
        {
            //食料を回復
            food += pointsPerSoda;
            //ここからpart.13で追加
            //増えた食料をUIに表示する
            foodText.text = "+" + pointsPerFood + " Food: " + food;

            //ここからpart.14で追加
            //飲んだ時の効果音を鳴らす
            SoundManager.instance.RandomizeSFx(drinkSound1, drinkSound2);
            //ここまでpart.14で追加

            //ここまでpart.13で追加
            //ソーダを削除
            other.gameObject.SetActive(false);
        }
    }

    //プレイヤーがExitに到達した場合、次のステージを呼び出す
    private void Restart()
    {
        //シーンを呼び直す
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex, LoadSceneMode.Single);
    }

    //プレイヤーが敵に攻撃された場合、食料を減らす
    public void LoseFood(int loss)
    {
        //攻撃を受けたアニメーションを呼び出す
        animator.SetTrigger("PlayerHit");
        //食料を減らす
        food -= loss;
        //ここからpart.13で追加
        //減らした食料をUIに表示する
        foodText.text = "-" + loss + " Food: " + food;
        //ここまでpart.13で追加
        //ゲームオーバーか判定
        CheckIfGameOver();
    }

    // Update is called once per frame
    void Update()
    {
        //プレイヤーのターンではない場合、何も実行しない
        if (!GameManager.instance.playerTurn)
        {
            return;
        }

        //左右の移動
        int horizontal = 0;
        //上下の移動
        int vertical = 0;

        //ここから最終回で追加
        //プラットフォームを判定
#if UNITY_STANDALONE || UNITYWEB_PLAYER

        //左右の移動量を受け取る
        horizontal = (int)Input.GetAxisRaw("Horizontal");
        //上下の移動量を受け取る
        vertical = (int)Input.GetAxisRaw("Vertical");

        //上下左右のいずれかに移動を制限する
        if (horizontal != 0)
        {
            vertical = 0;
        }
#else
        //タッチされた場合
        if(Input.touchCount > 0){
            //最初にタッチされた情報を取得
            Touch myTouch = Input.touches[0];

            //タッチ開始時
            if(myTouch.phase == TouchPhase.Began){
                //タッチした場所を取得
                touchOrigin = myTouch.position;
            }

            //指を離した時かつ指の場所が0以上の場合
            if(myTouch.phase == TouchPhase.Ended && touchOrigin.x > 0){
                //指を離した場所を取得
                Vector2 touchEnd = myTouch.position;
                //横方向の移動量を取得
                float x = touchEnd.x - touchOrigin.x;
                //縦方向の移動量を取得
                float y = touchEnd.y - touchOrigin.y;
                //横と縦の移動量が大きい方に移動する
                if(Mathf.Abs(x) > Mathf.Abs(y)){
                    horizontal = x > 0 ? 1 : -1;
                }else{
                    vertical = y > 0 ? 1 : -1;
                }
            }
        }
#endif
        //ここまで最終回で追加
        //左右上下のいずれかに移動する場合
        if(horizontal != 0 || vertical != 0){
            //プレイヤーの侵攻方向に壁があるか確認
            AttemptMove<Wall>(horizontal, vertical);
        }
	}

    //食料が0いかになった場合、ゲームオーバーにする
    private void CheckIfGameOver(){
        if(food <= 0){

            //ここからpart.14で追加
            //ゲームオーバーの時の効果音を鳴らす
            SoundManager.instance.PlaySingle(gameoverSound);
            SoundManager.instance.musicSource.Stop();
            //ここまでpart.14で追加

            //GameManagerのGameOverを呼び出す
            GameManager.instance.GameOver();
        }
    }
}

スクリプトの補足説明

タッチパネルをタッチした情報は、以下の機能で取得していきます!

  • Input.TouchCount:タッチされた回数を取得
  • Input.touches[i]:i番目にタッチされた情報を取得
  • Input.touches[i].position:タッチされた場所を取得

ゲームを実行してみよう!

PCにUSBでスマートフォンを接続し、Build and Runで実行してみましょう!
スワイプ操作でプレイヤーを動かすことができると思います!
f:id:yagigame:20181110034308p:plain

感謝

今回の記事で、【Unity2Dローグライク】公式チュートリアルをやってみるは完結となります。
長い間読んでいただきありがとうございました!

これからも、当ブログをよろしくお願いいたします!