Не видит функцию С# Unity

164
29 ноября 2018, 06:50

Я создал скрипт C# в котором есть несколько функций и функция ChooseResolution(). Прицепил его на пустой объект UIManager, который засунул в поле для объектов в обработке клика на кнопку в инспекторе. Пытаюсь выбрать фунцию ChooseResolution для выполнения, но её нету в списке, хотя все остальные функции того скрипта есть. Из-за чего это вообще? Буду рад любой помощи. Скрипт:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIManager : MonoBehaviour {
    public bool MenuActive = false;
    public GameObject[] ArrayMenus = new GameObject[5];
    private GameObject _current_menu;
    private int _index;
    //Resolution
    private string _resolution = "1920x1280" ;
    private GameObject _pre_resolution_button;
    public void MenuOpen()
    {
        if( !MenuActive )
        {
            ArrayMenus[0].SetActive(true);
            MenuActive = true;
            _current_menu = ArrayMenus[1];
        }
    }
    public void MenuClose()
    {
        if(MenuActive)
        {
            for(int i = 0; i < ArrayMenus.Length; ++i )
                if (i == 1) ArrayMenus[1].SetActive(true);
                else ArrayMenus[i].SetActive(false);     
            MenuActive = false;
            _current_menu = null;
        }
    }
    public void OpenNewTab(GameObject Tab)
    {
        _current_menu.SetActive(false);
        Tab.SetActive(true);
        _current_menu = Tab;
    }
    public void Back(GameObject Menu)
    {
        _current_menu.SetActive(false);
        Menu.SetActive(true);
        _current_menu = Menu;
    }
    public void ExitYes()
    {
        if (MenuActive && _current_menu == ArrayMenus[3]) Application.Quit();
    }
    public void ChooseResolution(string Resolution, GameObject Button)
    {
        _resolution = Resolution;
        UnityEngine.UI.ColorBlock colorBlock = new UnityEngine.UI.ColorBlock
        {
            normalColor = new Color(27, 182, 57),
            highlightedColor = new Color(36, 66, 156),
            pressedColor = new Color(22, 44, 106)
        };
        //_pre_resolution_button;
        Button.GetComponent<UnityEngine.UI.Button>().colors = colorBlock;

        //Button;
        _pre_resolution_button = Button;
    }
    public void ApplyResolution()
    {
        //
    }
}

Инспектор:

Answer 1

Базовый инспектор Unity для Button не умеет обрабатывать методы, которые имеют больше двух аргументов. Другими словами, вам придётся либо использовать кнопки, либо отказаться от этого крайне неудобного способа :)

В разработке использовать данный способ подписки на события крайне неудобно:

Во-первых - вы инкапсуляцию нарушаете. Этот метод больше никому, кроме этого класса не нужен по сути, а вы его публичным делаете, вместо того, чтобы оставить приватным.

Во-вторых - во время отладки вы не сможете узнать из какого именно места вызвался код, который вызывается из редактора. Через условных пару месяцев вы можете забыть что и где там добавляли и в итоге будете очень долго искать в чём проблема.

В-третьих - этот вызов происходит через запоминание имени метода и вызова его по нему, что медленнее и к тому же останется даже если вы сделаете метод приватным и не удалите этот вызов у кнопки. Что ещё раз усложнит отладку, если вы вдруг решите что-то переделать.

Лучшим решением тут будет использовать подписку на событие кнопки внутри самого класса. Кнопка обладает событием onClick, которое срабатывает при нажатии на неё. Вы можете подписаться на него прямо из кода, взяв ссылку на кнопку.

В вашем случае, вам было бы лучшее вообще написать отдельный класс конкретно под кнопку-разрешения :)

READ ALSO
Как подключится к серверу WoW? [C#] [закрыт]

Как подключится к серверу WoW? [C#] [закрыт]

Вообщем интересует ответ на вопрос , который уже озвучен в заголовке тредаВозможно есть уже готовая реализация или же если подскажите в какую...

150
Анимация в Unity (прошу критики кода и метода)

Анимация в Unity (прошу критики кода и метода)

есть анимация ходьбы персонажа (Влево, Вправо, Вверх и Вниз) вызываемая при помощи индексов

156
Отправка сообщений Laravel

Отправка сообщений Laravel

У меня проблема, разрабатываю сайт и нужно сделать отправку сообщений на почту админуТолько проблема в том, пользователь должен иметь сам...

139
Как сделать платный доступ к разделам сайта?

Как сделать платный доступ к разделам сайта?

На сайте есть разделы которые должны быть доступны только после оплаты пользователем доступа к нимВ качестве платёжной системы использую...

169