i-school - ColliderTestクラス

学習内容


 ここでは、スクリプトを利用して、コライダーのオンオフ切り替えテストを行います。

 コライダーはオブジェクトに衝突用の当たり部分を与えます。
コライダーを持つオブジェクト同士がぶつかると、そこで衝突が発生します。(いわゆる、当たり判定と呼ばれるものです。)
 
 この機能はゲームオブジェクトにアタッチされている各コライダー系のコンポーネントによって付与されます。

 今回の学習では、スクリプトを利用して、コライダーコンポーネントのスイッチのオンオフを切り替える制御を実装し、制御できているかをテストします。


スクリプトを作成する


 それでは先ほどのRendererTestとおなじように、Projects内のAsset → Scripts をダブルクリックして開き
その中で Create → C# Scriptを選択します。名前はColliderTestにします。

 ColliderTestファイルをダブルクリックしてVisual Studioを開いて、コードを書いていきましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// コライダーのテスト用クラス
/// コンポーネントの取得とオン/オフ、コンポーネントの持つプロパティの変更を行う
/// </summary>
public class ColliderTest : MonoBehaviour
{    
    [Header("コライダー(接触判定)のオンオフ用")]
    public BoxCollider boxCollider;

    void Start()
    {

    }

    void Update()
    {
        // ボタンを押す度にBoxColliderコンポーネントの状態をオン・オフ切り替える
        if (Input.GetKeyDown(KeyCode.A)) {

            // [変数名.enabled]で現在のコンポーネントの状態を確認できる。trueならオンの状態
            if (boxCollider.enabled == true) {
                // オフに切り替える
                boxCollider.enabled = false;
            } else {
                // ifの条件でないなら、こちらの処理を実行 = falseの場合
                boxCollider.enabled = true;
            }
        }
    }
}


 コードを書き終わったら、読み直すくせをつけましょう。

 スクリプトをセーブ(ctrl + Shift + s キー)し、コンパイルエラーがなければ、このファイルもCubeオブジェクトにアタッチしましょう。
アタッチ後はCube のインスペクターを確認し、ちゃんとColliderTestコンポーネントが追加されているか、確認します。
もしもアタッチできないようであれば、Consoleを確認しましょう。エラーが出ている可能性が高いです。


ゲームを実行して確認する


 無事にアタッチができたら、ゲームを実行し、設定したボタンを押してみましょう。
ヒエラルキーにある Cube ゲームオブジェクトを選択しておくことで、インスペクター上から、BoxCollider コンポーネントのオンオフの制御切り替えが確認ができると思います。

 BoxCollider コンポーネントの左側にあるチェックボックスのチェックが、入ったり外れたりすれば制御成功です。


スクリプトを書き換えて、同じ処理をスマートに記述する


 スクリプトを修正し、オンオフの切り替え部分を、よりスマートに記述する方法を学習しましょう。

 bool 型の変数に限り、! 演算子を利用することで、現在の状態を反転させる処理を記述できます。
この機能を活用すると、true => false となり、false => true と反転させることが出来ます。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// コライダーのテスト用クラス
/// コンポーネントの取得とオン/オフ、コンポーネントの持つプロパティの変更を行う
/// </summary>
public class ColliderTest : MonoBehaviour
{    
    [Header("コライダー(接触判定)のオンオフ用")]
    public BoxCollider boxCollider;

    void Start()
    {

    }

    void Update()
    {
        // ボタンを押す度にBoxColliderコンポーネントの状態をオン・オフ切り替える
        if (Input.GetKeyDown(KeyCode.A)) {

            // [変数名.enabled]で現在のコンポーネントの状態を確認できる。trueならオンの状態
            //if (boxCollider.enabled == true) {
                // オフに切り替える
                //boxCollider.enabled = false;
            //} else {
                // ifの条件でないなら、こちらの処理を実行 = falseの場合
                //boxCollider.enabled = true;
            //}

            // 1行で書く場合(上記の内容と同じ処理になる)
            boxCollider.enabled = !boxCollider.enabled;
        }
    }
}

 従来の処理はコメントアウトし、新しい処理を1行追加してください。

 スクリプトを修正したらセーブをします。


 ゲームを実行して、いままでと同じように制御が行えるかを確認してください。


コンポーネント内の別の機能を制御する


 スクリプトを修正し、今度は、IsTrigger プロパティについて、ボタンを押すたびにオンオフが切り替わる機能を実装してみましょう。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// コライダーのテスト用クラス
/// コンポーネントの取得とオン/オフ、コンポーネントの持つプロパティの変更を行う
/// </summary>
public class ColliderTest : MonoBehaviour
{    
    [Header("コライダー(接触判定)のオンオフ用")]
    public BoxCollider boxCollider;

    void Start()
    {

    }

    void Update()
    {
        // ボタンを押す度にBoxColliderコンポーネントの状態をオン・オフ切り替える
        if (Input.GetKeyDown(KeyCode.A)) {

            //オンオフに切り替える
            boxCollider.enabled = !boxCollider.enabled;
        }


////* ここから処理を追加します  */////


        // ボタンを押す度にBoxColliderコンポーネントの持つIsTriggerプロパティのオン・オフを切り替える
        if (Input.GetKeyDown(KeyCode.S)) {

            if (!boxCollider.isTrigger) {   // boxCollider.isTrigger == falseと同じ
                // オフならオンにする
                boxCollider.isTrigger = true;
            } else {
                // オンならオフにする
                // if-else文なので、必ずどちらかの分岐に入る
                boxCollider.isTrigger = false;
            }
        }  


////* ここまで  */////


    }
}



ゲームを実行して確認する


 ヒエラルキーにある Cube ゲームオブジェクトを選択して、ゲームを実行します。
指定されたボタンを押すたびに、BoxCollider コンポーネント内にある IsTrigger プロパティのチェックが外れたり、入ったりすれば制御成功です。

コンポーネント内の別の機能を制御する


 スクリプトを修正し、今度は、IsTrigger プロパティについて、ボタンを押すたびにオンオフが切り替わる機能を実装してみましょう。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// コライダーのテスト用クラス
/// コンポーネントの取得とオン/オフ、コンポーネントの持つプロパティの変更を行う
/// </summary>
public class ColliderTest : MonoBehaviour
{    
    [Header("コライダー(接触判定)のオンオフ用")]
    public BoxCollider boxCollider;

    void Start()
    {

    }

    void Update()
    {
        // ボタンを押す度にBoxColliderコンポーネントの状態をオン・オフ切り替える
        if (Input.GetKeyDown(KeyCode.A)) {

            //オンオフに切り替える
            boxCollider.enabled = !boxCollider.enabled;
        }


        // ボタンを押す度にBoxColliderコンポーネントの持つIsTriggerプロパティのオン・オフを切り替える
        if (Input.GetKeyDown(KeyCode.S)) {

            //if (!boxCollider.isTrigger) {   // boxCollider.isTrigger == falseと同じ
                // オフならオンにする
                //boxCollider.isTrigger = true;
            //} else {
                // オンならオフにする
                // if-else文なので、必ずどちらかの分岐に入る
                //boxCollider.isTrigger = false;
            //}     


      boxCollider.isTrigger = !boxCollider.isTrigger;

        }
    }
}

 先ほどと同じように if / else 文の部分をコメントアウトし、新しい処理を追加します。

 isTrigger プロパティも bool 型であるため、このように書き換えることが出来ます。


ゲームを実行して確認する


 ゲームを実行して、今まで通りに IsTrigger プロパティのオンオフが行えるかを確認してください。