【Unity】接触時、接触してきた相手のメソッドを実行する

2024年3月28日

今は、アイテムをゲットした時のサウンドは、バスケットから鳴らしています
アイテムごとの音源の管理をバスケット側が担っているからですね。
アイテムが少数で増やす予定もない場合、この仕様で構いません。
しかし、アイテムの追加がある場合などゲームに拡張性を持たせることが考えられる場合、アイテム側にその機能を実装した方が良さそうです。なるべく現行の仕様に大きな変更を加えない方法で実現してみましょう。

サンプル解答

アイテムをコントロールする側にPlaySoundメソッドを作成してそちらでサウンドの再生を担当してもらいます

バスケットにアタッチされるスクリプト

using UnityEngine;

public class BasketController : MonoBehaviour
{
    GameObject director;

    void Start()
    {
        Application.targetFrameRate = 60;
        this.director = GameObject.Find("GameDirector");
    }

    void OnTriggerEnter(Collider other)
    {
        other.GetComponent<ItemController>().PlaySound();

        if (other.gameObject.tag == "Apple")
        {
            this.director.GetComponent<GameDirector>().GetApple();
        }
        else
        {
            this.director.GetComponent<GameDirector>().GetBomb();
        }
        Destroy(other.gameObject);
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, Mathf.Infinity))
            {
                float x = Mathf.RoundToInt(hit.point.x);
                float z = Mathf.RoundToInt(hit.point.z);
                transform.position = new Vector3(x, 0, z);
            }
        }
    }
}

other.GetComponent<ItemController>().PlaySound();

このコードは「other オブジェクトから ItemController コンポーネントを取得し、そのコンポーネントに含まれる PlaySound() メソッドを呼び出す」ものです。アイテムに関連する特定のアクションによってサウンドを再生することができます
other引数にはバスケットに接触したゲームオブジェクトのコライダーが代入されます

各アイテムにアタッチされるスクリプト

using UnityEngine;

public class ItemController : MonoBehaviour
{
    public AudioClip SE;

    public float dropSpeed = -0.03f;

    void Update()
    {
        transform.Translate(0, this.dropSpeed, 0);
        if (transform.position.y < -1.0f)
        {
            Destroy(gameObject);
        }
    }
    public void PlaySound()
    {
        AudioSource.PlayClipAtPoint(SE, transform.position);
    }
}

AudioSource.PlayClipAtPointメソッド

特定の位置でサウンドエフェクト(SE変数で表される)を再生します
このメソッドが実行されるとシーン上に1つのゲームオブジェクトが自動的に作成されたのち、AudioSouceコンポーネントがアタッチされます
なので、スクリプトをアタッチしているゲームオブジェクトがDestroyされても、サウンドが途切れない効果があります
また、サウンド再生が完了すると自動的に作成されたゲームオブジェクトは破棄されます

それぞれのPrefabに再生したい音源を登録します

再生したいSEをapplePrefabとbombPrefabのItemControllerスクリプトのインスペクターにドラッグ&ドロップしてアウトレット接続します

次のキャプチャーはapplePrefabの場合になります
同様にbombPrefabについても登録します

C#,Unity

Posted by hidepon