◎ HowToMake全部見せます企画 ~Unity版~ ◎


6ページ目

§15 残っているのは何だ?
いろいろ作ってきて、何が残ってるのかわからなくなってきた。
あと付けたいのは
・ゲーム中にターゲットが何かを表示する
・時間の計測
・プレイ中の時間の表示
・ツイートボタンの実装
・残りのターゲットの追加
こんなもんかな。

ではまた明日。
ちなみに、ここまでの経過時間は8時間半くらい。
明日起きて半日くらいでゲームは完成させたいですね。



§16 ターゲットの表示
おはようございます。9時間睡眠でバッチリでございます。
では続きをしましょう。
§13でランダム指定に使った数字に合わせてターゲットの数字を表示したい。

先にプレハブにしておいた「preA」を使いたいけど、
あれを貼ったら重力で落ちていってしまったので、
新たにただの画像のプレハブを
「exA」「exB」「exC」と名付けて作る。
これをif文を駆使して数字に合わせて貼ってもらおう。
TargetCtrlのターゲットを決めた文の下にスクリプトを書く。
if (TGT == 0) {
Instantiate (exA, new Vector3 (-2.0f, -8.75f, 0.0f), Quaternion.identity);
} else if (TGT == 1) {
Instantiate (exB, new Vector3 (-2.0f, -8.75f, 0.0f), Quaternion.identity);
} else if (TGT == 2) {
Instantiate(exC, new Vector3(-2.0f, -8.75f, 0.0f),Quaternion.identity);
}
貼り付ける場所は、実際に一個置いてみてこんなもんかな、という場所を指定している。
これならうまくいくでしょ。
再生。よし、数字に合わせて違うターゲット画像が出てきた。OKOK。




§17 プレイ中の時間の計測
まず、時間をいつからいつまで測るのか、という問題があるんだけど、
面倒臭いので、
TargetCtrlのvoid Hajime()が呼ばれた時からZanAが0になるかお手付きするかの時までにしようと思う。
(理想を言えば、スタートボタンを押す→ターゲットを周知→カウントダウンでゲームスタート(時間計測開始)にしたいけど、
そんなめんどくさい機能は全部出来上がって時間に余裕があったら付けるべき)
(まずは完成させることが大事)
時間をはかるのにうってつけなtime関数があるのでそれを使います。
TargetCtrlに以下のものを追加

float timer = 0.0f;

void Update(){
timer += Time.deltaTime;
}

これで、毎フレームごとに時間を計測してくれる。
あ、でも、これだとゲームを読み込んだ瞬間からずーーーっと時間を計測することになるので、
bool型を使って条件付けをする。

private bool gameplay = false;

void Update () {
if (gameplay == true) {
timer += Time.deltaTime;
}
}

それで、ゲームが終わるところ(クリアとお手付き)に
gameplay = false;
を書き込めば、タイマーを止めてくれるわけだ。

確認するのがめんどくさいから、ついでに表示の仕組みも作ろう。

表示はUIだから、また新しくcanvasを作る。
「これを消せ!」とかいう親切表示を一緒に足して、
文字が固定の部分「経過時間  秒」と、文字が変数の部分「XXX.X」の二つに分けてTextを作る。

これで、XXX.Xのところにtimerの数字が飛んで来れば出来上がりだよね。



timer表示用に、新しく「Stimer」というスクリプトを作成。
まず、そのStimerの上のところ、具体的には3行目に、
using UnityEngine.UI;
という一文を入れます。
これがないとスクリプトからUIを制御できない。

まてよ。
時間の計測をTargetCtrlで行うと、数値のやり取りが大変面倒臭いことになるぞ。
と気付くまで20分くらい現実逃避してたので、慌ててさっきTargetCtrlに書いたTimer関連をStimerへ引っ越し。

ちょっと説明がややこしいので
出来上がったスクリプトをご覧ください

//時間はfloat型
private float timer = 0.0f;
//下のタイマーONOFF機能用bool
private bool tim = false;
//タイマーを表示するにはstringじゃないといけないのでそのために
private string timtxt;
//どのオブジェクトを指定するか(using UI時専用)
[SerializeField]
private Text txtTime;

// Update is called once per frame
void Update () {
if (tim == true) {
timer += Time.deltaTime;
//UIのTextに表示するにはstring型じゃないとだめ
//ついでに小数点2桁にしてもらう呪文"F"を入れておく
timtxt = timer.ToString("F");
txtTime.text = timtxt;
}
}

//この関数をTargetCtrlからSendMessageで呼び出してもらう
//呼び出すたびにタイマーがONとOFFを行き来する
void SetTimer(){
if (tim == false){ tim = true;}
else {tim = false;}
}


SerializedFieldに書いたものはここに出るから、
変数を反映してもらいたいTextを貼り付けること。


TargetCtrlからは上で書いたタイマー機能を全消しして、
void timctrl (){
GameObject ST = GameObject.FindGameObjectWithTag("Hyouji");
ST.SendMessage ("SetTimer");
}
という新しいvoidを用意。
gameplay = false;を書き込んだところに、代わりに
timevtrl();
と書くと、そのタイミングで void timectrl()を実行し、
実行するたびに(タグでHyoujiを探してから)メッセージを送ってくれる。
まぁいいかな。そんなに頻繁に呼ぶ関数でもないし。


動かしてみる。

スタートボタンを押すと同時にタイマーが動き出し、ゲームが終わると止まる。しかも小数点二ケタ表示。
最高じゃん!
もうゲームはできたも同然だな!(六回目)

今朝からここまでで二時間半。
合計で11時間半、ということは、朝から始めても夜までにはこれくらいできる予定、かなぁ。
あんまり根詰めない方が良いけどね。






←前へ 目次 次へ→