衝突時の処理をアイテム側に移行したサンプル

2023年9月26日

コード

BasketController

using UnityEngine;

public class BasketController : MonoBehaviour
{
    // オブジェクトがこのバスケットに触れたらアイテムを取得する
    void OnTriggerEnter(Collider other)
    {
        other.GetComponent<ItemGetter>().TouchBasket();
    }

    // マウスの左ボタンがクリックされたときに実行される
    void Update()
    {
        // マウスの位置からRayを作成して、オブジェクトがあるかどうかを調べる
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, Mathf.Infinity))
            {
                // Rayが当たった地点の座標を四捨五入して、バスケットの位置に設定する
                float x = Mathf.RoundToInt(hit.point.x);
                float z = Mathf.RoundToInt(hit.point.z);
                transform.position = new Vector3(x, 0, z);
            }
        }
    }
}

このスクリプトは、BasketControllerという名前のコンポーネントとして、Unityのゲームオブジェクトにアタッチされます。このスクリプトは、バスケットの位置をマウスクリックで変更するためのものです。また、バスケットにアイテムが入った時に、アイテム取得処理を実行するためのコードも含まれています。

ItemGetter

using UnityEngine;

public class ItemGetter : MonoBehaviour
{
    public AudioClip appleSE; // 収穫したリンゴの効果音
    public AudioClip bombSE; // 収穫した爆弾の効果音

    GameObject director; // ゲームディレクターの参照を格納する変数

    public AudioSource aud; // アイテム取得時に再生するオーディオソース

    private void Start()
    {
        // ゲームオブジェクト "GameDirector" を検索して、参照を取得する
        this.director = GameObject.Find("GameDirector");
    }

    public void TouchBasket()
    {
        if (gameObject.CompareTag("Apple")) // アイテムがリンゴの場合
        {
            // リンゴ収穫時の効果音を再生する
            AudioSource.PlayClipAtPoint(appleSE, transform.position);
            // ゲームディレクターにリンゴの収穫を通知する
            this.director.GetComponent<GameDirector>().GetApple();
        }
        else // アイテムが爆弾の場合
        {
            // 爆弾収穫時の効果音を再生する
            AudioSource.PlayClipAtPoint(bombSE, transform.position);
            // ゲームディレクターに爆弾の収穫を通知する
            this.director.GetComponent<GameDirector>().GetBomb();
        }

        // アイテムを削除する
        Destroy(gameObject);
    }
}

このコードは、Unityのスクリプトで、果物や爆弾のアイテムを取得するための処理を定義しています。ItemGetterクラスは、アイテムがバスケットに入ったときに呼び出されるTouchBasket()メソッドを持ちます。TouchBasket()メソッドでは、アイテムがリンゴか爆弾かによって、収穫時の効果音を再生したり、ゲームディレクターにアイテムの収穫を通知したりする処理を行います。

クラス図

オリジナル

リファクタリング