タイムトライアル機能を追加してゲーム性を強化
前回の記事では,
不要なラベル表示を消す
現状ゲームを実行すると,
Try to kill the bear! Use Fire1 to shoot bullets Use Fire2 to toggle aiming with bazooka
と表示されます。
Fire1ボタンで弾を撃て
Fire2ボタンでバズーカを構えろ
という意味の英語です。不要なので削除します。
さて,
私ならこういう場合,
このように,
Bazooka.
void OnGUI()
{
GUILayout.Label("Try to kill the bear!");
GUILayout.Label("Use Fire1 to shoot bullets");
GUILayout.Label("Use Fire2 to toggle aiming with bazooka");
}
Unityの標準UI機能では,
GUILayout.
スコアカウント処理を追加する
GameControl.
int score = 0;
続けて以下のコードを追加します。
public void AddScore() {
score++;
}
bool FinishedGame() {
return GameObject.FindWithTag("Teddy") == null;
}
AddScoreメソッドではフィールド定義したscoreを1加算しています。
FinishedGameメソッドはゲームが終了したかの判定をしています。GameObject.
でTeddyタグの付いているオブジェクトが一つもない場合trueを返しています。つまり,
続いて,
void OnCollisionEnter(Collision collision) {
if (avatar != null) {
if (hitFlag == false && collision.collider.tag == "Bullet") {
hitFlag = true;
GameObject exp = (GameObject)Instantiate(detonator.gameObject, transform.position, Quaternion.identity);
//今回追加
var gameCotroll = GameObject.Find("GameControl");
gameCotroll.transform.GetComponent<GameControl>().AddScore();
var currentState = avatar.GetCurrentAnimatorStateInfo(0);
var nextState = avatar.GetNextAnimatorStateInfo(0);
if (!currentState.IsName("Base Layer.Dying") && !nextState.IsName("Base Layer.Dying")) {
avatar.SetBool("Dying", true);
Destroy(this.gameObject, 3.0f);
}
}
}
}
OnCollisionEnterはクマが何かと接触した際に呼び出されるメソッドです。今回追加した2行で,
var gameCotroll =
GameObject.
でHierarchyのGameControlオブジェクトを取得して,gameCotroll.
で取得してAddScoreメソッドを呼び出しています。
タイム測定処理を追加する
GameControlクラスに以下のフィールドを追加します。
float elapsedTime;
続けてUpdateメソッドを以下のように編集します。
void Update () {
if (!FinishedGame()) {
elapsedTime += Time.deltaTime;
}
}
Updateメソッドは毎フレームごとに呼び出されるメソッドです。フレームとは画面を描画する単位です。fps
今回追加したコードはif (!FinishedGame()) {
でゲームが終了していない場合,elapsedTime += Time.
で経過時間を加算しています。Time.
は前のフレームから現在のフレームまでに経過した時間を返します。これをUpdateメソッドの中で毎回加算していくことで,