Unity C#で別のクラスのメソッドを実行する方法/GetComponentの使い方

corgi IT

頻繁に使用している「コンポーネントを取得する」gameObject.GetComponentですが、アセットしたスクリプトもコンポーネントである以上、GetComponentで取得することが可能です。
さらに続けてメソッド名も記述することで、他のクラス内のpublicなメソッドを実行することが可能です。

スポンサーリンク

成果物

shot2
「弾」が敵に当たった時「敵」のスクリプトのメソッドを実行する、というものを作ります。
同じスクリプトさえセットされていれば、プレハブがプレハブに当たった場合なども有効です。

他のクラスのメソッドを実行

別のクラスのpublicなメソッドを実行
オブジェクト.GetComponent<呼び出すスクリプト名>().呼び出すメソッド名();
dest1
例として、弾が敵に当たると処理を行う場合で考えます。
弾はトリガーをONにしたコライダーが設置されており、弾と敵それぞれにスクリプトが設置されています。
dmg1
先に敵のほうのスクリプトを開き、
dmg2
弾が当たった時の挙動を、public void メソッド名()として記述します。publicにすることで、他のクラスからも呼び出し可能なメソッドになります。
ここでは仮にDestroyを記述し、弾が当たったら消滅するものとします。
dmg3
弾側のスクリプトではOnTriggerEnter2D(Collider2D コライダーの名前)で当たった時のメソッドを作り、コライダー.gameObject.GetComponent<呼び出すスクリプト名>().呼び出すメソッド名();のように記述します。
ただしこれだとプレイヤーキャラが撃った瞬間プレイヤーキャラに当たって呼び出されてしまう(プレイヤーキャラはスクリプト「target」をアタッチしてないので、エラーになる)ので、
dmg4
実行前にif (コライダー.gameObject.GetComponent<呼び出すスクリプト>()){}を挟みます。これだけで、「このスクリプトを持っている場合は実行」という意味になります。
shot1
この時点での実行結果。弾が壁は無視して、敵だけ消滅させていることが確認できます。

その他当たった時の処理

dmg5
たとえば敵ごとにlifeというintを作っておいて、
dmg6
インスペクターやスクリプトでそれぞれ値を設定し、
dmg7
ライフがなくなったら消滅、といったやりかたが手ごろかと思います。
dmg8
その他色々盛り込んでいきます。
//Unity C#
//弾
public class 弾 : MonoBehaviour
{
    void OnTriggerEnter2D(Collider2D trigger)
    {
     //目標のスクリプトがアタッチされてるオブジェクトにだけ実行
        if (trigger.gameObject.GetComponent<相手のクラス名>())
        {
       //呼び出し
            trigger.gameObject.GetComponent<相手のクラス名>().メソッド名();
            Destroy(this.gameObject);
        }
        
    }
}

//敵
public class 相手のクラス名 : MonoBehaviour
{
    public void メソッド名()
    {
        life = life - 1;
        this.GetComponent().color += new Color(0, -0.3f, -0.3f, 0);
        this.transform.Translate(targeting.x * -0.2f, targeting.y * 0.1f, 0);
        if (life == 0)
        {
            Destroy(this.gameObject);
        }
        this.GetComponent().color = Color.white;
    }
やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。

コメント