【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をクリックします。
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で実行してみましょう!スワイプ操作でプレイヤーを動かすことができると思います!
感謝
今回の記事で、【Unity2Dローグライク】公式チュートリアルをやってみるは完結となります。長い間読んでいただきありがとうございました!
これからも、当ブログをよろしくお願いいたします!