unityゲームプログラミング 脳トレゲームを作る2 -Game説明を入れる-
前回音を入れてこれで一旦完成でいいかなと思ったが、めちゃくちゃ肝心なことを忘れていた。
ゲームの説明を何もしていなかった。
ゲーム作成者の自分だから青色を記憶してタップするゲームだとわかるが、初めての人だったら何がなんだかわからない。
GameStart押したら3つの色の違う玉が出てきて1秒後に真っ白になった。タップしてみたらよくわからないがGameOverというパターンになる。
ということでゲーム説明を作る。
ゲーム説明を作る
以前simagameでチュートリアルを作っているので、作り方はある程度頭の中にあるが、ホワイトボードを使って思考整理しておく。
大きく分けて2つのことでゲーム説明を作る。
- 紙芝居式の説明を作る
- Skipボタンで配置し、Skipですぐにゲームスタートできるようにする
簡単簡単。
まずは紙芝居式にゲーム説明するための画像を作る。
このゲームのルールはシンプル。
- ゲームスタート
- 色違いの球が出てくる
- 青色の玉を覚える
- 一定時間で全て白色になる
- 白色になったら全ての青色をタップ
- 全てタップ出来たらクリア
- クリアしたら次のステージに、2~6を繰り返す
- 一度でも青色以外の玉をタップするとゲームオーバー
ゲーム画面をスクリーンショットして、skitchという無料ソフトで文字を入れる。
一応ゲームの解像度と同じ大きさにした。
こんな感じで4枚の説明画像を作った。
愚直にInvokeを使って一定時間ごとに画像を出したり消したりする。
愚直に作ってみたが…
愚直にとりあえずやってみたけど、めんどくさすぎる。
3秒ごとに画像を切り替えはできるが、スキップボタン実装はこれにまたifで変数skipFlagでFlagOnになっていたら即Destroyさせればいいけど、また長くなる。
勉強と思って作り直す。
Imageで一つPrefabを作ってそこにspriteを配列で組み込んで、Time.deltaTimeで画像を切り替えていくことにする。
それならSkip実装はImageタップされたら秒数足して連続タップでも、一瞬でも飛ばせるようにできる。
それで行こう。
- GameSceneが始まったらExplainPrefabをInstant化
- ExplainPrefabで説明画像を管理
- 終わったらGameManagerから玉出現
- ExplainPrefabManagerを別途に作る
だいぶ短くなった
配列を使ってどう配列の中身を変えようかと考えた。
- Time.deltaTimeはfloat
- 配列は数字int型ならいける
- C#としてfloatからint型に変換出来る
⇨ int i = (int)float変数名; - floatからint型に変えると小数点以下切り捨て
ということが色々調べていじったらわかった。
さっきはだいぶ長々と書いていたが、
public class ExplainManager : MonoBehaviour { ~中略~ void Update () { nowTime += Time.deltaTime; explainTime = nowTime / changeImageTime; spriteNo = (int)explainTime; if (explainImage.Length > spriteNo) { GetComponent<Image> ().sprite = explainImage[spriteNo]; } else if (explainImage.Length == spriteNo) { Destroy (this.gameObject); } } }
あんな繰り返し長ったらしいのが、短くなった。
ってかはてなブログでめっちゃ簡単に色付きのコードを載っけることが出来た。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ExplainManager : MonoBehaviour { public Sprite[] explainImage = new Sprite[5]; float nowTime = 0f; float explainTime = 0f; float changeImageTime = 3.0f; int spriteNo = 0; int startFlag = 0; void Start () { Button skipButton = transform.FindChild ("SkipButton").GetComponent<Button> (); skipButton.onClick.AddListener (SkipExplain); } void Update () { nowTime += Time.deltaTime; explainTime = nowTime / changeImageTime; spriteNo = (int)explainTime; if (explainImage.Length > spriteNo) { GetComponent<Image> ().sprite = explainImage[spriteNo]; } else if (explainImage.Length <= spriteNo && startFlag == 0) { startFlag ++; Invoke ("StartGame", 0.5f); Destroy (this.gameObject, 0.6f); } } void SkipExplain () { nowTime += changeImageTime; } void StartGame () { GameObject manager = GameObject.Find ("GameManager"); manager.GetComponent<MainGameManager> ().StartSetCircle(); } }
Skipボタンも実装した。一回押すと説明画像ちょうど一つ分skipできる。
ゲームバランス調整
ステージ1ごとに青玉が一つづつ数が増えていたので、ステージ10を超えてくるとだいぶ鬼畜ゲーと化していたので、5の倍数ステージごとに青玉が増えるように変えた。
また、その他の色の玉の数も青玉に合わせて変わるように変えた。
白色切り替えも1⇨2秒に変更。
一旦これでandroidにリリースする。
ゲームタイトル何にしよう。
一旦リリース、追加したい要素
- 成長要素
- レベル要素
- エフェクト
- タイトル画面をもっとかっこよく
- 横向きしないように
他にも成長要素やレベル要素を意味がなくても入れたい。
縦向き固定はめちゃくちゃ簡単だった。
参考記事:
Unity : モバイル画面の方向を固定、あるいは変化を検出 - いんでぃーづ
前回の記事