「Unityの教科書」に出てきたルーレットアプリを魔改造する #3

こんにちは、ぬいぐるみです。

前回、「Unityの教科書」に出てきたルーレットアプリを魔改造するという記事で「刺した場所によって表示する結果を変える」という内容を書きました。今回はその続きになります。


目次

今回やること

  • リザルト画面の実装
  • もう一度回すボタンの実装

実装

本に書いてある素材の再配布はよろしくないと思ったのでルーレットの素材を作りました。

前回と同じく「再配布」「直リンク」のみ禁止でお願いします。それ以外の利用は常識の範囲内でどうぞ。

needle.png

roulette.png

新しいシーンの作成

結果画面を表示する「ResultScene」を作っていきます。

「ファイル」→「新しいシーン」→「Basic 2D(Built-in)」

GameSceneから受け取った結果を表示するテキストと、もう一度ボタンを画面に配置します。

ボタンの配色もかえてみました。

いい感じの色にしたいけどどんな色にすれば…と思ったときは配色についてまとめた本が一冊あると便利です。



きれいな色の名前だけではなく、複数の組み合わせで紹介してくれているので「自分色のセンスない…」となることがないです。カラーコードとRGB、CMYKを載せてくれてるのも使いやすいポイントです。

私は今回この本からボタンの色を決めました。きれいな色の組み合わせがたくさん載ってるので見てるだけでも飽きない一冊です。

「ファイル」→「新しいシーン」から、ビルドに含まれるシーンに先程追加したResultSceneにチェックをいれます。

これでシーン間の移動ができるようになりました

ResultSceneにスクリプトをアタッチする

先ほど作成した

ボタンには「ButtonController.cs」を新規作成してアタッチ、

テキストには「TextController.cs」を新規作成してアタッチします。

ButtonController.csはGameSceneに戻る処理、

TextControllerには「前のシーンから結果を持ってきて、画面に表示する」処理をいれました。

「とりあえずこれで動いた!」というプログラムなので他にももっと良い書き方があると思います…。

RouletteControllerには前回Debug.Logに結果を出力する処理を書きましたが、それをResuleSceneに渡してあげる処理、ルーレットが止まったら次のResultSceneに移動する処理を書きます。

ソースコード

ButtonController.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5. using UnityEngine.UI;
  6. public class ButtonController : MonoBehaviour
  7. {
  8.     // Start is called before the first frame update
  9.     void Start()
  10.     {
  11.     }
  12.     // Update is called once per frame
  13.     void Update()
  14.     {
  15.     }
  16.     public void OnClick()
  17.     {
  18.         SceneManager.LoadScene("GameScene");
  19.     }
  20. }

TextController.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class TextController : MonoBehaviour
  6. {
  7.     public Text lastScreenDisplayResult;
  8.     // Start is called before the first frame update
  9.     void Start()
  10.     {
  11.         string rouletteResult = RouletteController.GetRouletteResult();
  12.         lastScreenDisplayResult.text = "結果は「" + rouletteResult + "」です。おめでとう";
  13.     }
  14.     // Update is called once per frame
  15.     void Update()
  16.     {
  17.     }
  18. }

RouletteController.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5. public class RouletteController : MonoBehaviour
  6. {
  7.     float rotSpeed = 0;
  8.     int countClick = 0;
  9.     protected static string rouletteResult = "";
  10.     // Start is called before the first frame update
  11.     void Start()
  12.     {
  13.         Application.targetFrameRate = 60;
  14.     }
  15.     // Update is called once per frame
  16.     void Update()
  17.     {
  18.         if (Input.GetMouseButtonDown(0))
  19.         {
  20.             switch(countClick)
  21.             {
  22.                 case 0:
  23.                     //初回クリック(ルーレット動き出し時の判定)
  24.                     this.rotSpeed = 10;
  25.                     countClick += 1;
  26.                     break;
  27.                 case 1:
  28.                     //2回目クリック(ルーレットを止めるときの判定)
  29.                     countClick += 1;
  30.                     break;
  31.                 default:
  32.                     break;
  33.             }
  34.         }
  35.         if(countClick >= 2)
  36.         {
  37.             //クリックされた後減速する処理
  38.             this.rotSpeed *= 0.80f;
  39.         }
  40.         transform.Rotate(0, 0, this.rotSpeed);
  41.         //止まった場合の処理
  42.         if (rotSpeed < 0.1 && countClick >= 2)
  43.         {
  44.             this.rotSpeed = 0;
  45.             //Transform myTransform = this.transform;
  46.             Vector3 tmp = this.transform.localEulerAngles;
  47.             if(tmp.z < 45)
  48.             {
  49.                 rouletteResult = "結果は1";
  50.                 SceneManager.LoadScene("ResultScene");
  51.             }else if(tmp.z > 45 && tmp.z < 90)
  52.             {
  53.                 rouletteResult = "結果は2";
  54.                 SceneManager.LoadScene("ResultScene");
  55.             }
  56.             else if (tmp.z > 90 && tmp.z < 135)
  57.             {
  58.                 rouletteResult = "結果は3";
  59.                 SceneManager.LoadScene("ResultScene");
  60.             }
  61.             else if (tmp.z > 135 && tmp.z < 180)
  62.             {
  63.                 rouletteResult = "結果は4";
  64.                 SceneManager.LoadScene("ResultScene");
  65.             }
  66.             else if (tmp.z > 180 && tmp.z < 225)
  67.             {
  68.                 rouletteResult = "結果は5";
  69.                 SceneManager.LoadScene("ResultScene");
  70.             }
  71.             else if (tmp.z > 225 && tmp.z < 270)
  72.             {
  73.                 rouletteResult = "結果は6";
  74.                 SceneManager.LoadScene("ResultScene");
  75.             }
  76.             else if (tmp.z > 270 && tmp.z < 315)
  77.             {
  78.                 rouletteResult = "結果は7";
  79.                 SceneManager.LoadScene("ResultScene");
  80.             }
  81.             else if (tmp.z > 315 && tmp.z < 360)
  82.             {
  83.                 rouletteResult = "結果は8";
  84.                 SceneManager.LoadScene("ResultScene");
  85.             }
  86.         }
  87.     }
  88.     public static string GetRouletteResult()
  89.     {
  90.         return rouletteResult;
  91.     }
  92. }

保存したあと、Buttonのを選択して、インスペクターの「クリック時」が最初はなにもないので、「+」ボタンを押して、そのあとButtonをドラッグします。

Textを選択して、インスペクターの「Last Screen Display...」にドラッグします。

結果

動いて止めて、リザルト画面に行って結果が表示できるようになりました!

終わり

シーン間の移動はUnityの教科書の「6-10 シーン間の遷移方法を学ぼう」でより丁寧に解説していますので、この記事を読んだだけではわからない場合は買うのを全力でおすすめします!

Unity初心者が一冊持っておくと良い本です。


参考リンク

【Unity入門】Buttonの作り方!押された判定はどう取るの?

応援
応援ポチっとよろしくです。 ブログランキング・にほんブログ村へ
スポンサーリンク
広告




広告




★役に立った!と思ったらシェアをお願いします。★

  • このエントリーをはてなブックマークに追加

★フォローはこちら★

スポンサーリンク
広告




コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です