Cou氏の徒然日記(2022)

ほのぼの日記ブログです。

Unityで遊ぼう その7 (Game Over判定)

coublood.hatenablog.com

 

前回、適当に球転がしのプロジェクトを作りましたが、よくよく考えれば、落ちたときのエラー処理って何もしていないな・・・とちょっと思いました。

エラー判定としては、ボールの座標が一定座標以下になったらエラーとする・・・今回の場合なら「y座標 (高さ) がマイナスになったらGame Over」とすればいいかなとも思いましたが、ちょっとやってみたいと思ったのが、以下。

 

f:id:coublood:20200501031946p:plain

メインフロアの下に大きな透明のフロアを作り、そこに接触したらGame Overと判定。

十分に大きなフロアを作れば、少なくとも今回の場合は、確実に当たりますからね。

(仮にもっとボールが高速で吹っ飛ぶような設定なら、横方向にも壁を作ればいいですし。)

 

まずは透明のフロアの作成ですが・・・

あれ?どうやって透明にすればいいんだ?という問題が。

 

■ オブジェクトを透明化する方法

調べてみると、以下で行けました。

  1. 「Rendaring Mode」を「Opaque(不透明)」から「Fade」に変える
  2. 「RGBA」の「A(Alpha値:透明度)」を「0(透明)」にする

f:id:coublood:20200501032516p:plain

 

接触判定

あとはこのフロアと接触した場合の判定処理を追加。

衝突検知時には 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!";
        }
    }
}

 

docs.unity3d.com


Unityで遊ぼう その7

 

うん、うまくいきましたね。