はじめに
前回 からの続きです。
今回は、お宝Objectをステージに配置して、それをGetしたらScoreが更新されるようにしていきます。
基本的な操作はこれまでやってきたことの繰り返しなので、要点を書いていきます。
お宝Objectの追加
はしごなどを作った時と同じように行います。
http://qiita.com/mokemokechicken/items/f6d8bf10ce16099fc7c3
大事な点は以下のところです。
- Sphereを作って、適当にMaterialを作成して関連付ける
- Tagに Treasure を追加して、関連付ける
- Colliderは Trigger にチェックを入れる
- TreasureControl.cs を作成して、Sphere に関連付ける。
public class TreasureControl : MonoBehaviour
{
public void HitWithPlayer() {
Destroy(gameObject.transform.parent.gameObject);
Global.stageControler.PlayerGotTreasure();
}
void OnTriggerEnter(Collider other) {
if (other.gameObject.tag == Tag.PLAYER) {
HitWithPlayer();
}
}
}
OnTriggerEnter()
が 何かと衝突したときに呼ばれます。もしそれがPlayerなら、Playerがお宝をGETしたと判定して、HitWithPlayer()
を呼びます。
お宝がGETされたときの処理は、お宝を削除して、Scoreを増やしたりする処理です。
お宝を削除しているのが Destoroy
です。
今回も "空Object" -> "Sphere" という構造を取りました。
このScriptは Sphere の Componentです(ColliderがSphereに付いているのでScriptも同じ場所につけないといけない)ので、親の"空Object"を消すために、gameObject.transform.parent.gameObject
という長い感じになっています。
StageControllerにお宝関係の処理を追加
テキストデータ中のお宝を描画や、描画時に何個このステージにあるかカウントしています。
RoadRunnerは お宝全部取ると、脱出用のはしごが出現するからです。
お宝を取得した時の処理を
public void PlayerGotTreasure() {
numTreasure--;
Global.score += 100;
}
というような感じで追加しています。
Global Object
スコアやStage番号を保持するための、static な Global Classを追加しました。
また、StageControllerにもここからアクセスできるようにしました。
Service Locatorパターン的なイメージです(あくまでイメージ)。
public static class Global
{
public static int stage = 1;
public static int score = 0;
private static StageController stageController_;
public static StageController stageControler
{
get { return stageController_; }
set { stageController_ = value; }
}
}
スコアの表示
スコアの用に画面の同じ場所にずっと表示されているテキストを作りたいときは、 GUI Text というのを使います。
メニュー -> [GameObject] -> [Create Other] -> [Gui Text] として作成します。
- GUI Textの座標は 解像度に関係なく 左下が(0,0), 右上が(1,1) になります。
- Font Size を適当に設定しておきます
- Controll Script を登録します(ScoreControl とします)
Update()
で表示する値を設定するのが一般的?のようです。なんか少し非効率な感じもしますが、こういうものなんですかね。
public class ScoreControl : MonoBehaviour
{
void Update() {
guiText.text = "Score:" + Global.score;
}
}
さいごに
こんな感じになりました。少しゲームっぽくなったかな?