Приветствую вас знатоки. Подскажите кто знает. Как в unity передавать в метод массив любого типа?
К примеру есть простой код.. Какую сигнатуру метода надо прописать чтобы можно было передавать методу не только Image[],но и Text[], по отдельности.
Image[] imageBoxOpen = new Image[3];
Text[] textCollect = new Text[2];
private void OnEnable()
{
Metod(imageBoxOpen,1);
}
private void Metod(Image[] all ,int index)
{
foreach (var item in all)
{
item.gameObject.SetActive(false);
}
}
Нагуглил решение, но не понимаю его. Подскажите в чем туплю..
public void Test()
{
Metod2(imageBoxOpen,2);
}
private void Metod2 <T>(T[] all, int index) // Методу все нравиться
{
foreach (var item in all)
{
item.gameObject.SetActive(false); // А тут доступа к gameobject нет ошибка.
}
}
Ошибка CS1061 'T' does not contain a definition for 'gameObject' and no accessible extension method 'gameObject' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)
Ответы (2 шт):
Метод надо дополнить скорее всего так:
private void Metod2 <T>(T[] all, int index) where T : UnityEngine.UIElementsModuleLeave {
}
По поводу UnityEngine.UIElementsModuleLeave
надо уточнить в документации, от кого конкретно унаследованы Image
и Text
и подставить самый верхний уровень наследования туда
А вызывать надо так:
Metod2<Text>(textCollect, 111);
или
Metod2<Image>(imageBoxOpen, 111);
Ограничение универсального типа не позволяет использовать, как аргумент типы не наследуемые от указанного и соответственно происходит привидение T
типа к указанному. gameObject
это свойство Component
.
private void SetActive<T>(IEnumerable<T> collection, bool active) where T : Component
{
foreach (T e in collection)
e.gameObject.SetActive(active);
}
SetActive(_images, false);
Подобно тому, как class
, который ни от кого явно не наследуется, наследуется от object
, без явного указателя where
, T
тоже имеет object
тип, у которого естественно нет свойства gameObject
.
Но Generic
ТУТ ВООБЩЕ НЕ НУЖЕН! В where
обычно указывается не типы классов, а new()
, struct
, INumber
и т.д. в то время как у тебя Image
и Text
с общим предок, свойство которого и используется.
private void SetActive(IEnumerable<Component> components, bool active)
{
foreach (Component c in components)
c.gameObject.SetActive(active);
}
В случаях, когда используется List<T>
, то можно воспользоваться методом ForEach
.
_images.ForEach(i => i.gameObject.SetActive(false));