前回、適当に球転がしのプロジェクトを作りましたが、よくよく考えれば、落ちたときのエラー処理って何もしていないな・・・とちょっと思いました。
エラー判定としては、ボールの座標が一定座標以下になったらエラーとする・・・今回の場合なら「y座標 (高さ) がマイナスになったらGame Over」とすればいいかなとも思いましたが、ちょっとやってみたいと思ったのが、以下。
メインフロアの下に大きな透明のフロアを作り、そこに接触したらGame Overと判定。
十分に大きなフロアを作れば、少なくとも今回の場合は、確実に当たりますからね。
(仮にもっとボールが高速で吹っ飛ぶような設定なら、横方向にも壁を作ればいいですし。)
まずは透明のフロアの作成ですが・・・
あれ?どうやって透明にすればいいんだ?という問題が。
■ オブジェクトを透明化する方法
調べてみると、以下で行けました。
- 「Rendaring Mode」を「Opaque(不透明)」から「Fade」に変える
- 「RGBA」の「A(Alpha値:透明度)」を「0(透明)」にする
■ 接触判定
あとはこのフロアと接触した場合の判定処理を追加。
衝突検知時には OnCollisionEnter() 関数が呼び出されるので、この中で衝突先のオブジェクト名を取得して、その内容によって処理を分岐すればできました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BallRollingGame : MonoBehaviour
{
public GameObject GameStatusText;
public GameObject GoalFloor;
public GameObject ErrorFloor;
// Start is called before the first frame update
void Start()
{
Text gameStatusText = GameStatusText.GetComponent();
gameStatusText.text = "Start!";
}
// Update is called once per frame
void Update()
{
// 省略 //
}
// Collision Detection
void OnCollisionEnter(Collision collision)
{
Text gameStatusText = GameStatusText.GetComponent();
if (collision.gameObject.name == "ErrorFloor")
{
gameStatusText.text = "Game Over";
}
else if (collision.gameObject.name == "GoalFloor")
{
gameStatusText.text = "Goal!";
}
}
}
うん、うまくいきましたね。