ぼくの息抜き

ぼくの息抜き

気ままな二人が記事を書くことで息抜きしていくブログ

CSS MenuMaker

unityゲームプログラミング 脳トレゲームを作る2 -Game説明を入れる-

f:id:bokunoikinuki:20180622160424p:plain

前回音を入れてこれで一旦完成でいいかなと思ったが、めちゃくちゃ肝心なことを忘れていた。

ゲームの説明を何もしていなかった。

ゲーム作成者の自分だから青色を記憶してタップするゲームだとわかるが、初めての人だったら何がなんだかわからない。

GameStart押したら3つの色の違う玉が出てきて1秒後に真っ白になった。タップしてみたらよくわからないがGameOverというパターンになる。

ということでゲーム説明を作る。

ゲーム説明を作る

以前simagameでチュートリアルを作っているので、作り方はある程度頭の中にあるが、ホワイトボードを使って思考整理しておく。

f:id:bokunoikinuki:20180622161009j:plain

大きく分けて2つのことでゲーム説明を作る。

  • 紙芝居式の説明を作る
  • Skipボタンで配置し、Skipですぐにゲームスタートできるようにする

簡単簡単。

まずは紙芝居式にゲーム説明するための画像を作る。

このゲームのルールはシンプル。

  1. ゲームスタート
  2. 色違いの球が出てくる
  3. 青色の玉を覚える
  4. 一定時間で全て白色になる
  5. 白色になったら全ての青色をタップ
  6. 全てタップ出来たらクリア
  7. クリアしたら次のステージに、2~6を繰り返す
  8. 一度でも青色以外の玉をタップするとゲームオーバー

ゲーム画面をスクリーンショットして、skitchという無料ソフトで文字を入れる。

一応ゲームの解像度と同じ大きさにした。

f:id:bokunoikinuki:20180622162222p:plain

こんな感じで4枚の説明画像を作った。

愚直にInvokeを使って一定時間ごとに画像を出したり消したりする。

愚直に作ってみたが…

f:id:bokunoikinuki:20180622172126p:plain

愚直にとりあえずやってみたけど、めんどくさすぎる。

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 : モバイル画面の方向を固定、あるいは変化を検出 - いんでぃーづ

前回の記事