dasukoのブログ

現役エンジニアのブログです。

【Unity】TryGetComponentが便利

はじめに

C#ではTry◯◯みたいなメソッドがあり、取得できたのみ処理したい場合に

簡潔に書くことができます。

詳しくはこちらを見てみるといいと思います。

文字列が数値を表しているかどうかを確認する方法 - C# プログラミング ガイド | Microsoft Docs

intとかlongのTryParseが代表的かなと思います。

パースに成功すればtrueが返り、失敗した場合にはfalseが返ります。

DictionaryのTryGetValueなんかも使う人が多いのではないでしょうか

docs.microsoft.com

TryGetComponentとは

公式ドキュメントはこちらです。

Component-TryGetComponent - Unity スクリプトリファレンス

公式ドキュメントの説明としてはこんな感じですね

Gets the component of the specified type, if it exists.

 

他のTry◯◯メソッドのように、GetComponentをして取得できればtrue、取得できなければfalseを返します。

使い方としては、こんな感じです。

using UnityEngine;

public class TryGetComponentTest : MonoBehaviour
{
    void Start()
    {
        if (TryGetComponent(out Rigidbody rigidbody))
        {
            // Rigidbodyが取得できた場合
            rigidbody.velocity = new Vector3(0f, 0f, 1f);
        }
    }
}

outで指定した引数に結果が帰ってきます。

以下のように、取得できなかった場合にAddComponentするような実装も考えられると思います。

using UnityEngine;

public class TryGetComponentTest : MonoBehaviour
{
    void Start()
    {
        Rigidbody rigidbody;
        if (!TryGetComponent(out rigidbody))
        {
            rigidbody = gameObject.AddComponent<Rigidbody>();
        }

        rigidbody.velocity = new Vector3(0f, 0f, 1f);

    }
}

あとは、以下のように衝突したオブジェクトがEnemyクラスの場合はダメージを与える!みたいな処理が簡潔に書けるようになりますね!

using UnityEngine;

public class Player : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.TryGetComponent(out Enemy enemy))
        {
            // 敵の場合はダメージを与える!
            enemy.Damage();
        }
    }
}

public class Enemy
{
    public void Damage()
    {
        // Damage
    }
}

まとめ

TryGetComponentは便利!という話でした。

個人的には、多くの場合そのコンポーネントが取得できることを意図しているので、

取得できなかった場合はAddComponentしてくれるような拡張メソッドを作った方が使い勝手はいいかなと思います。

参考

Component-TryGetComponent - Unity スクリプトリファレンス

文字列が数値を表しているかどうかを確認する方法 - C# プログラミング ガイド | Microsoft Docs

docs.microsoft.com