【Unityの練習ゲーム作り 第一弾!】
ガラケーアプリでもヒットした、昔ながらの「糸通しゲーム」をUnityで作っています。
その1 大まかな設計を考えました
その2 糸と針の動作を実装しました
その3 当たり判定を追加しました
今回は 糸が針を通過した回数をカウントするUIと、ゲームオーバー画面,スタート画面を作っていきます。
針の通過をカウント
糸が針を通過した回数をカウントする方法はいくつか考えられます。
- 針が等速で生成,動いていることを利用し、時間経過でカウント
- 針のゲート部分に当たり判定をもつオブジェクトを追加し、衝突でカウント
- 針が特定の位置に到達したら、カウント
応用が効き、かつ実装が簡単そうな 最後の方法をとることにします。
ただ、そのまま実装すると糸と針が衝突後(ゲームオーバー後)もカウントされてしまいます。そこで、その3「ゲームオーバー条件を追加」で使用した flg
もカウント条件に入れましょう。
針の動きをコントロールするHariControllerと、全体を管轄するGameManagerです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class HariController : MonoBehaviour { private GameObject gameManager; private GameObject itoController; void Start () { gameManager = GameObject.Find("GameManager"); itoController = GameObject.Find("ito"); } void Update () { //フレームごとに等速で移動 transform.Translate(-0.05f,0,0); //画面外に出たらオブジェクトを破壊する if(transform.position.x < -10.0f){ Destroy(gameObject); } //針が特定位置に到達したら、糸が通過したと見なす if(transform.position.x < -3.65f && transform.position.x > -3.7f && itoController.GetComponent<ItoController>().getFlg()==0 ){ gameManager.GetComponent<GameManager>().ThreadeHari(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { private int score = 0; public GameObject textScore; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } //ゲームオーバー public void GameOver(){ Debug.Log("game over"); } //糸が針通過でスコア更新 public void ThreadeHari(){ score += 1; RefreshScoreText(); } //スコア更新 public void RefreshScoreText(){ textScore.GetComponent<Text>().text = "Score:" + score; } } |
ItoControllerには、flg
のゲッターを追加してあります。
1 2 3 4 |
// flgゲッター public int getFlg(){ return flg; } |
こんな感じ。無事 カウントできています。
一点問題が発生!
HariControllerのUpdate()
内で、ItoConrollerにあるflg
を参照し続けています。↓この部分です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void Update () { //フレームごとに等速で移動 transform.Translate(-0.05f,0,0); //画面外に出たらオブジェクトを破壊する if(transform.position.x < -10.0f){ Destroy(gameObject); } //針が特定位置に到達したら、糸が通過したと見なす if(transform.position.x < -3.65f && transform.position.x > -3.7f && itoController.GetComponent<ItoController>().getFlg()==0 ){ gameManager.GetComponent<GameManager>().ThreadeHari(); } } |
ゲームオーバー後、糸オブジェクトは破壊されます。そのため、”存在しない”糸オブジェクトの、flg
を参照し エラーが発生してしまうのです・・・。
そこで、flg
はGameManagerに管理してもらいましょう。セッターとゲッターをGameManagerに追加しました。
HariContorllerはgetFlg
から読み込み、ItoControllerからはsetFlg
に書き込みます。これでOKです。
1 2 3 4 5 6 7 8 9 |
//flgセッター public void setFlg(int f){ this.flg = f; } // flgゲッター public int getFlg(){ return flg; } |
ゲームオーバー画面
ゲームオーバー時に「再スタートボタン」、「スタート画面に戻るボタン」を表示します。
単純なゲーム故 テンポが大事だと思うので、余計な表示演出は無いほうが良いでしょう。
・・・
UIのButtonを2つ並べ、ゲームオーバーで表示をActiveにするようにしました。ボタンにはロードシーンを組み込んでいます。そのため、using UnityEngine.SceneManagement
をお忘れなく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using UnityEngine.SceneManagement; (略) //ゲームオーバー public void GameOver(){ //Debug.Log("game over"); StartCoroutine(buttonActve()); } private IEnumerator buttonActve(){ //1秒待つ yield return new WaitForSeconds(1); buttonRestart.SetActive(true); buttonStartScene.SetActive(true); } public void PushButtonRestart(){ SceneManager.LoadScene("GameScene"); } public void PushButtonStartScene(){ SceneManager.LoadScene("StartScene"); } |
こんな感じになりました。
メイン画面
適当にロゴを作って、完成!!
ゲームとしては、これで完成です!
その5はゲームを面白くするレベルデザインを考えます。