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


5ページ目

※Faildのつづりがまだ間違ってたので修正しました※

§12 クリア後の画面を作る
ターゲットの残量がゼロになったら、クリアおめでとう! とか出したい。
めんどくさいけど、ここからはUIを使おう。

1.UIでテキストを貼り付ける
左のところで右クリック→UI→text。
すると、CanvasとTextとEventSystemというのが出てきた。不審者だ!!!
すみません違います。CanvasとEventSystemがないとUIが動かないんです。
Canvasをリネームして「GameClear」にする。
Textを選択すると、シーンビューからはみ出して白い四角ができてるけど気にしない。
UIの調整はGameビューでやる。
Gameビューを見ると、シーンビューにはいない「New Text」という文字が。
これだッ!!!
左のTextを選択したら、右のText(Script)のTextの欄に表示したい文を書く。
なぜかMacだと日本語が入力できない。
適当に「ゲームクリア!」と入れておこう。

だせぇ。まぁいいや。
FontSizeを36にすると画面から文字が消えるんですが
落ち着いて上のRect Transformの幅と高さを変更しましょう。
Pos XとPos Yを0にして、これで中心に文字が表示されるはず。
ではGameClearをプレハブにして、シーンから削除。
EventSystemは残したままに。

TargetCtrlに、
「ゲームをクリアしたら」=「ZanAがゼロになったら」→GameClearを表示してね
と書けばよい。
void clA()に追記する分はこれ。

//もし残量がゼロになったら
if (ZanA == 0) {
Instantiate (GC, new Vector3 (0.0f, 0.0f, 0.0f), Quaternion.identity);
}

うむ。できた。
クリア画面もできたとなるとゲームが出来上がったも同然である!(四回目)


2.ボタンの設置
クリアしたらもう一度初めからプレイするためのボタンが必要。F5アタック、ダメ絶対。
クリア画面にボタンを追加したいので、GameClearのプレハブをもう一度シーンに配置する。
左のところのGameClearを右クリック→UI→Buttonで、ボタンを作成。
Gameビューにボタンが出現した。

左のButtonにある横向きの▲をクリックすると下向きになり、Textが現れる。
このTextに、ボタンに表示する文字を書く。
ついでに、ツイートするボタンも、ボタンだけ作っておく。
文字とボタンの配置を適当に整えて、とりあえずOK。
プレハブにボタンの追加とかを反映させておく。


3.ボタン用のスクリプトを作成する
ボタンで使うスクリプトは全部まとめて書こうと思うので、
Buttonというスクリプトを作成。
StartもUpdateも使わないから消して、すっきりさせよう。

必要な種類のvoidを先に書いておこう。

// must public
public void Retry(){
}

public void ClearTweet(){
}

public void FaildTweet(){
}

ボタンに動作を与えたい場合、関数はpublicじゃないといけない。
よく忘れて「さっき書いた関数が無い!」とかいうことになるので注意。

ツイートの部分はあとでいいとして、
リトライの部分は
Application.LoadLevel ("001");
にする。001の部分は、読み込みたいシーンの名前にする。
リトライするときは、このシーンをもう一度読み込むことになるので、
このシーンの名前である001と入れる。""で囲むのを忘れないように。

4.ボタンにスクリプトをくっつける
スクリプト「Button」を「GameClear」に加える。
「Retry」の右下に「On Click()」と書いてあるところの下の+を押して、
Runtime Onlyの下の選択のところで、二重丸みたいなやつをクリック。
小さなwindow「Select Object」が出てくるので、さっきスクリプトを付けたGameClearを選択。
Runtime Onlyの右のNo Functionをクリックして「Button」→Retry()。
これで読み込みなおしてくれるはず。

プレハブに変更を反映して、シーン上のプレハブを削除して、再生だ!

OKOK。やり直しもできる。
いやー、まったく、これでゲームはできたようなもんですな! がはは!(五回目)
もうこれでいいかな……。
いや、だめか。
もう少し頑張りましょうかね。



§13 ゲーム開始ボタンを作る
開始ボタンを押すと、
 ターゲットの種類が決まって
 ターゲットが落ちてくる
という仕組みが必要。

まずは新しくボタンを配置。Canvasの名前を「GameStart」にして、プレハブ化。

スクリプト「Button」に開始時の命令をかこう。
TargetCtrlに「target配置して!」と依頼を出さないといけないので、
一番初めに
public GameObject TC;
を追加。
それから、スタートのボタンを押した時のvoid GS()を追加。
//ゲーム開始時
public void GS(){
TC.SendMessage ("Hajime");
Debug.Log ("はじまった");
//ゲームが始まったらこのボタンは消えてほしいので
Destroy (this.gameObject);
}
これを§12でやったようにGameStartにスクリプトを付けて、TCの欄にシーン上にあるTargetCを付けて、
ボタンにGC()を付ける。


試しに再生してみよう。
よし、これで何回も繰り返しゲームができるようになったぞ。

ここまでで、再開から3時間。まだ6時間しかたってないじゃん! やったぜ。



§14 ランダムターゲット指定と判定
1.ターゲット指定
ゲーム開始ボタンを押すと、ランダムでAかBかCかターゲットが決まる、ということだった。
えーっと、だから
TargetCtrlのvoid Hajime()にランダムを書いて、その数字によってターゲットをA,B,Cどれになったか決めればいいんだ。
int TGT = Random.Range(0, 2);
Debug.Log ("ターゲット数字:" + TGT);
こんなかんじ。0か1か2であってほしいので、ランダムの数字は整数のint。
再生してみると、ちゃんとデバッグになんか出てる。OK。


2.ターゲット判定
指定ターゲットとあってるかどうかの判定を考える。
Aがクリックされるとvoid clA()が実行される。
この時にターゲット番号が0の時とそれ以外の時を判断するようにしてもらおう。
1.でvoidの中でTGTを初出ししたけど、これだとほかのvoidから見れない気がするので、
Startの上に int TGT = 3; と書いておいた。
3なのは、初めはどれもターゲットじゃない、ということにしたかったから。
それから、void clA()に戻る。
頭に
if (TGT != 0) {
//ゲームFaild処理
} else {
//残量を減らす処理
を付ける。
いきなり謎の記号を書いてるんですが、「A != B」っていうのは「AがBでない」という意味らしいです。便利~。


Faildの時の処理を考えないといけないんだけどとりあえずゲームオーバーって表示させればいいかな。
GameClearのプレハブをシーンに配置して、名前を「GameFaild」に変更して、プレハブ化。
テキストを失敗した用に変更して反映すれば出来上がり。

さっそく試してみる。
……。
予想していた通り、上に文字が出ても下のターゲット消せますなぁ。むむむ。
ただ、全部消してもGameClearは出ないみたいだけど。唯一の救い。
GameFaildのCanvas内にImagを置いても、透かして下のオブジェクトは消せてるみたいだな…。

ということで、Faildになったら「ターゲットからスクリプトを外す」という機能を追加しよう


3.追加機能
やりたいことの流れは、
<ゲームがFaildになる→TargetCtrlからSprefAにSendMessage→SprefAのスクリプトをDestroy>
である。
スクリプト「SprefA」に
void OnFaild(){
Destroy (this);
}
と書く。このDestroy(this);のthisは、スクリプト自身を指す。
だからゲームオブジェクトを消したいときはDestroy(this.gameObject);になるわけです。
次に、スクリプト「TargetCtrl」のうちのゲームFaildの処理のところに
preA.SendMessage("OnFaild");
と書いてvoidを実行させれば……
ん、エラーだ。「SendMessageの受け口がない」んだって。
頭に書いてあるpublic GameObject preA;じゃダメなのかな~。

では、Faildになった時にタグでFindさせてからメッセージを送りましょう。
複数のやつに一度にいろいろさせたいときは
・FindGameObjectsWithTag()
・配列にしてforeachで指令を出す
ってやるようなので
見本(http://myoujing.wpblog.jp/2014/06/760/#cooperation03)に倣って
まずプレハブ「preA」にタグ「preA」を作ってセットして、
//preAAという配列としてpreAのタグがついたGameObjectを取り込む
GameObject[] preAA = GameObject.FindGameObjectsWithTag ("preA");
//AにpreAAの中身を一個ずつ入れて{}の中身を実行してくれ
foreach (var A in preAA) {
A.SendMessage ("OnFaild");
}
と書き込む。
再生。
おおお……ゲーム終了後、クリックしてもターゲットが消えない。最高。
(ちなみにSendMessageで送るOnFaildのつづりが間違ってて30分くらいロスした。泣きたい)
(SendMessageのつづり間違えは本当によくあるので、もっとはじめに疑うべきだった)
(こんなところでforeach文を習得することになるとは……)






←前へ 目次 次へ→