Нет, не напрямую.
Однако вы можете использовать небольшую хитрость: создайте для него неуниверсальный базовый класс
public abstract class SomeBase : MonoBehaviour { }
public class SomeClass<T1, T2> : SomeBase { }
Теперь вы можете просто использовать
SomeBase[] instances = FindObjectsOfType<SomeBase>();
Однако это возвращает только тип SomeBase
, и вы не получите доступ к внутреннему содержимому SomeClass
.Достаточно для доступа, например, transform
или gameObject
.
Вы можете добавить некоторые свойства abstract
, чтобы позже можно было преобразовать их в правильный тип:
public abstract class SomeBase : MonoBehaviour
{
public abstract Type GetT1 { get; }
public abstract Type GetT2 { get; }
}
public class SomeClass<T1, T2> : SomeBase
{
public override Type GetT1
{
get { return typeof(T1); }
}
public override Type GetT2
{
get { return typeof(T2); }
}
}
Теперь вы можете просто сделать, например,
var test = FindObjectsOfType<SomeBase>();
foreach (var someClass in test)
{
Debug.LogFormat("Instance found on {0}: T1={1}, T2={2}", someClass.name, someClass.GetT1.Name, someClass.GetT2.Name);
}
Для дальнейшей настройки типов предметов к цели SomeClass
Я думаю, вам нужно будет использовать отражение.Есть несколько примеров, например, Как привести универсальный тип во время выполнения в c # или также Привести универсальный тип, не зная T?