スタート画面の作成
スタートシーンを作成します。ProjectウィンドウのScenesフォルダを右クリックしてCreateからSceneを選択します。新規Sceneが作成されるので、StartSceneと名前を付けます。
作成したStartSceneをダブルクリックしてSceneビューの表示を切り替えます。StartSceneに切り替わったら、Hierarchyウィンドウの+ボタンを押してUIからCanvasを選択します。
更にHierarchyウィンドウの+ボタンを押してUIからPanelを選択します。PanelがCanvasの子になったことを確認します。HierarchyウィンドウでPanelを選択し、InspectorウィンドウのRect TransformコンポーネントのScaleでサイズをX、Y、Zそれぞれに2を入力します。PanelのInspectorウィンドウからImageコンポーネントを選択し、Colorの横にある四角のエリアをクリックするとColorウィンドウが開くので任意の色を選択し決定します。
Hierarchyウィンドウの+ボタンを押してUIからText-TextMeshProを選択します。Text(TMP)のInspectorウィンドウで各種設定をします。Rect TransformコンポーネントのPos Xに10、Pos Yに30、Pos Zに0、Widthに200、Heightに40と入力します。TextコンポーネントのTextにゲームタイトルをアルファベットで入力します。Font Sizeに30と入力します。Colorの横にある四角のエリアをクリックするとColorウィンドウが開くので任意の色を選択し決定します。
Hierarchyウィンドウの+ボタンを押してUIからButtonを選択します。ButtonのInspectorウィンドウのRect TransformコンポーネントのPos Xに0、Pos Yに-70、Pos Zに0と入力します。ButtonにUIのTextが子として設定されているので、Buttonの子のTextのInspectorウィンドウのTextコンポーネントにSTARTと入力します。
スクリプトを作成します。Hierarchyウィンドウの+ボタンを押してCreate Emptyを選択して空のゲームオブジェクトを作成し、StartSceneControllerという名称にします。Scriptsフォルダーにスクリプトを作成し、StartSceneControllerという名称にして、StartSceneControllerゲームオブジェクトにアタッチします。
StartSceneControllerゲームオブジェクトのInspectorウィンドウでStartSceneControllerスクリプトがアタッチできているか確認しておきます。
StartSceneControllerスクリプトに以下のコードを記述します。
StartSceneController.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;//追加 public class StartSceneController : MonoBehaviour { public void OnGameStart() { SceneManager.LoadScene("GameScene"); } }
STARTボタンの設定をします。ButtonのInspectorウィンドウを表示し、Buttonコンポーネントを表示します。
On Click()の+ボタンをクリックしてから◉をクリックし、Select Objectウィンドウを表示し検索欄に、StartSceneControllerと入力しSceneタブを選び、StartSceneControllerをダブルクリックします。次にメソッドの呼び出しを設定します。No Functionから、StartSceneControllerを選択し、OnGameStart( )をクリックします。これで、STARTボタンを押すと、StartSceneController.csスクリプト内のOnGameStartメソッドが呼び出されるように設定できました。
OnGameStartメソッドの処理でシーン StartSceneから、シーン GameSceneをロードして実行できるように設定します。Unityの画面上部のメニューからFileを選択し、Build Settingsをクリックします。
Build Settingsウィンドウが表示されるので、ProjectウィンドウのStartSceneをScenes in Buildにドラッグアンドドロップします。
Scenes in BuildにScenes/StartSceneが追加されたのを確認したら、次にGameSceneをドラッグアンドドロップします。
Scenes/StartSceneの下にScenes/GameSceneが追加できているのを確認したら、Build Settingsウィンドウを閉じます。
HierarchyウィンドウにStartSceneが表示されている状態でゲームを実行するとスタート画面からゲームが開始されます。STARTボタンを押してゲームが開始されるか確認してみましょう。
リザルト画面の作成
ProjectウィンドウのScenesフォルダを右クリックしてCreateからSceneを選択します。新規Sceneが作成されるので、ResultSceneと名前を付けます。
作成したResultSceneをダブルクリックしてSceneビューの表示を切り替えます。
ResultSceneに切り替わったら、Hierarchyウィンドウの+ボタンを押してUIからCanvasを選択します。更にHierarchyウィンドウの+ボタンを押してUIからPanelを選択します。PanelがCanvasの子になったことを確認します。HierarchyウィンドウでPanelを選択し、InspectorウィンドウのRect TransformコンポーネントのScaleでサイズをX、Y、Zそれぞれに2を入力します。PanelのInspectorウィンドウからImageコンポーネントを選択し、Colorの横にある四角のエリアをクリックするとColorウィンドウが開くので任意の色を選択し決定します。Hierarchyウィンドウの+ボタンを押してUIからText-TextMeshProを選択します。Hierarchyウィンドウに追加されたText(TMP)を複製しText(TMP)を3つ作成します。Text(TMP)の名称は、Text、Text(TMP)(1)、Text(TMP)(2)になります。
Text(TMP)のInspectorウィンドウで設定します。PosX 0、PosY 80、PosZ 0、Width 230、Height 40と入力します。TextコンポーネントのTextエリアに適切な文書を記載します。(GOAL!!など)ColorエリアでTextに任意の色を設定しておきます。
Text(TMP)(1)のInspectorウィンドウで設定します。PosX -5、PosY 20、PosZ 0、Width 160、Height 30と入力します。TextコンポーネントのTextエリアにTOTAL SCOREと記載します。ColorエリアでTextに任意の色を設定しておきます。
Text(TMP)(2)をScoreTextと名称変更します。ScoreTextのInspectorウィンドウで設定します。PosX 130、PosY 20、PosZ 0、Width 160、Height 30と入力します。TextコンポーネントのTextエリアに0と記載します。ColorエリアでTextに任意の色を設定しておきます。
Hierarchyウィンドウの+ボタンを押してUIからButtonを選択します。ButtonのInspectorウィンドウのRect TransformコンポーネントのPos Xに0、Pos Yに-70、Pos Zに0と入力します。ButtonにUIのTextが子として設定されているので、Buttonの子のTextのInspectorウィンドウのTextコンポーネントにRESTARTと入力します。
スクリプトを作成します。Hierarchyウィンドウの+ボタンを押してCreate Emptyを選択して空のゲームオブジェクトを作成し、ResultSceneControllerという名称にします。Scriptsフォルダーにスクリプトを作成し、ResultSceneControllerという名称にして、ResultSceneControllerゲームオブジェクトにアタッチします。
ResultSceneControllerゲームオブジェクトのInspectorウィンドウでResultSceneControllerスクリプトがアタッチできているか確認しておきます。
GameSceneControllerスクリプトの変数宣言部分を確認します。
GameSceneController.cs (一部抜粋)
public class GameSceneController : MonoBehaviour { public static int score = 0; //変数のグローバル化 private Text scoreText;
ResultSceneControllerスクリプトに以下のコードを記述します。
ResultSceneController.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; using TMPro; public class ResultSceneController : MonoBehaviour { private TextMeshProUGUI scoreText; void Start() { GameObject textObject = GameObject.Find("ScoreText"); scoreText = textObject.GetComponent<TextMeshProUGUI>(); scoreText.text = GameSceneController.score.ToString(); ; } public void OnGameStart() { SceneManager.LoadScene("GameScene"); } }
RESTARTボタンの設定をします。ButtonのInspectorウィンドウを表示し、Buttonコンポーネントを表示します。
On Click()の+ボタンをクリックしてから◉をクリックし、Select Objectウィンドウを表示し検索欄に、ResultSceneControllerと入力しSceneタブを選び、ResultSceneControllerをダブルクリックします。次にメソッドの呼び出しを設定します。No Functionから、ResultSceneControllerを選択し、OnGameStart( )をクリックします。これで、RESTARTボタンを押すと、ResultSceneController.csスクリプト内のOnGameStartメソッドが呼び出されるように設定できました。
OnGameStartメソッドの処理でシーン ResultSceneから、シーン GameSceneをロードして実行できるように設定します。Unityの画面上部のメニューからFileを選択し、Build Settingsをクリックします。
Build Settingsウィンドウが表示されるので、ProjectウィンドウのResultSceneをScenes in Buildにドラッグアンドドロップします。
Scenes/StartSceneの下にScenes/GameScene、その下にScenes/ResultSceneが追加できているのを確認したら、Build Settingsウィンドウを閉じます。
HierarchyウィンドウにResultSceneが表示されている状態でゲームを実行するとリザルト画面からゲームが開始されます。RESTARTボタンを押してゲームが再開されるか確認してみましょう。
ゴール処理の作成
ProjectウィンドウのScenesフォルダにあるGameSceneをダブルクリックしてHierarchyウィンドウの表示をGameSceneに切り替えます。Roadゲームオブジェクトの1つを複製(Duplicate)し適切な場所に配置し、Goalという名称に変更します。
ProjectウィンドウのScriptsフォルダにGoalスクリプトを作成し、Goalゲームオブジェクトにアタッチしておきます。
各スクリプトに必要なコードを追記し変更します。
Controller.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Controller : MonoBehaviour { private float speed = 3f; private float verticalInput = 0f; private Rigidbody CharacterRigidbody; private bool isStop = false; void Start() { CharacterRigidbody = GetComponent<Rigidbody>(); isStop = false; } void Update() { if (isStop) { return; } if (transform.position.y < 0.5) { isStop = true; GameObject gameSceneController = GameObject.Find("GameSceneController"); GameSceneController script = gameSceneController. GetComponent< GameSceneController>(); script.OnFailed(); } else { verticalInput = Input.GetAxis("Vertical"); if (Input.GetKey("right")) { transform.Rotate(0, 10, 0); } else if (Input.GetKey("left")) { transform.Rotate(0, -10, 0); } } } void FixedUpdate() { if (isStop) { return; } if (CharacterRigidbody.velocity. sqrMagnitude < 5f) { Vector3 CharacterForward = CharacterRigidbody.transform. forward; Vector3 moveVector = speed * (CharacterForward * verticalInput); moveVector.y = 0; CharacterRigidbody.AddForce( moveVector, ForceMode.Impulse); } } //追記ここから=====> public void OnStop() { isStop = true; } //======>ここまで }
GameSceneController.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class GameSceneController : MonoBehaviour { public static int score = 0; private Text scoreText; void Start() { GameObject gameScoreText = GameObject.Find("ScoreText"); scoreText = gameScoreText.GetComponent<Text>(); score = 0; } public void OnFailed() { Invoke("OnLoadGameScene", 1.5f); } private void OnLoadGameScene() { SceneManager.LoadScene(" GameScene"); } public void AddScore(int num) { score += num; scoreText.text = score.ToString(); } //追記=====> public void OnGoal() { GameObject Character = GameObject.Find("Character" ); Controller script = Character.GetComponent< Controller>(); script.OnStop(); Invoke("OnLoadResultScene", 1.5f); } private void OnLoadResultScene() { SceneManager.LoadScene(" ResultScene"); } //=====>ここまで }
Goal.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Goal : MonoBehaviour { void OnCollisionEnter(Collision collision) { GameObject controller = GameObject.Find("GameSceneController"); GameSceneController script = controller.GetComponent< GameSceneController>(); script.OnGoal(); } }
ゲームキャラクターを動かしてゴールさせてみましょう。リザルト画面にシーンが遷移したら成功です。
RESTARTボタンを押すとGameSceneに戻ることができます。