Help us understand the problem. What is going on with this article?

GetComponentでinterfaceを使いたい場合

More than 5 years have passed since last update.

特定のコンポーネントを取得したい場合、GetComponentを使うと思います。
で、その時に特定のinterfaceを実装しているものを取得したい場合の話。

例えばIHogeを実装しているコンポーネントを取得したい場合、以下のように書きたくなります。

InterfaceTest.cs
using UnityEngine;
using System.Collections;

public class InterfaceTest : MonoBehaviour
{   
    void Start ()
    {
        var hoge = GetComponent<IHoge>();   
        if (hoge != null) {
            hoge.Hoge();        
        }
    }   
}

interface IHoge
{
    void Hoge();
}

しかしGetComponent()は「where T : UnityEngine.Component」となっているようで、
以下のようなエラーが出ます。

Assets/InterfaceTest.cs(9,28): error CS0309: The type `IHoge' must be convertible to `UnityEngine.Component' in order to use it as parameter `T' in the generic type or method `UnityEngine.Component.GetComponent<T>()'

このエラーはジェネリックメソッドを使わずに、GetComponent(Type)を呼び出すと回避出来ます。

public class InterfaceTest : MonoBehaviour
{   
    void Start ()
    {
        var hoge = GetComponent(typeof(IHoge)) as IHoge;

        if (hoge != null) {
            hoge.Hoge();        
        }
    }   
}

気持ち的にはジェネリックを使いたいですが...

momomo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away