Почему метод List.Add не работает? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть игра, разработанная с единством, это код кнопки.Нужно взять публичный список скрипта «BoardScript» и добавить номер в этот список, но по какой-то причине он не работает.Я проверил, что нажатие кнопки работает (как вы можете видеть в коде, который печатает debug.log yes), но нажатие на него не добавляет номер в мой список.В «BoardScript» я просто добавил несколько чисел, чтобы попытаться, и значение успешно добавляется в список, поэтому я предполагаю, что ошибка где-то в этом сценарии, но я не могу понять, что может быть не так.Можете ли вы помочь мне?

   private Button B;
    void Start()
    {
        B = GetComponent<Button>();
        B.onClick.AddListener(Clicker);
    }
    void Clicker()
    {
        BoardScript boardScript = new BoardScript();
        int Two = 2;
        boardScript.UserList.Add(Two);
        Debug.Log("Added);
    }
    // Update is called once

РЕДАКТИРОВАТЬ
Я почти забыл рассказать подробности.Я написал Debug.Log (UserList.Count) и значение 1, даже если я добавил 1 несколько раз, как предполагает сценарий кнопки (это тот же сценарий, но с другим объектом).Итак, как сказал Стив, это код BoardScript, он немного длинный.

private int[] PreList = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    private List<int> ButtonList = new List<int>();
    public List<int> UserList = new List<int>();
    private System.Random Rnd = new System.Random();
    public List<int> EndList = new List<int>();

    void Randomizer()
    {
        PreList = PreList.OrderBy(C => Rnd.Next()).ToArray();
        foreach (var item in PreList)
        {
            Debug.Log(item.ToString());
            if (item == 1)
            {
                OneMethod();
            }
            if (item == 2)
            {
                TwoMethod();

            }
            if (item == 3)
            {
                ThreeMethod();

            }
            if (item == 4)
            {
                FourMethod();

            }
            if (item == 5)
            {
                FiveMethod();

            }
            if (item == 6)
            {
                SixMethod();

            }
            if (item == 7)
            {
                SevenMethod();

            }
            if (item == 8)
            {
                EightMethod();

            }
            if (item == 9)
            {
                NineMethod();

            }
        }
        EndList = PreList.ToList();
    }
     void  OneMethod()
     {
        //yield return new WaitForSeconds(1);
        ButtonList.Add(1);

     }
    void TwoMethod()
    {
        ButtonList.Add(2);

    }
    void ThreeMethod()
    {
        ButtonList.Add(3);

    }
    void FourMethod()
    {
        ButtonList.Add(4);

    }
    void  FiveMethod()
    {
        ButtonList.Add(5);

    }
    void SixMethod()
    {
        ButtonList.Add(6);

    }
    void SevenMethod()
    {
        ButtonList.Add(7);
    }
    void EightMethod()
    {
        ButtonList.Add(8);

    }
    void NineMethod()
    {
        ButtonList.Add(9);
    }
    void Start ()
    {
        Randomizer();
        string[] the_array = ButtonList.Select(i => i.ToString()).ToArray();
        string OrderString = string.Join(", ", the_array);
        GameObject.Find("Order").GetComponent<Text>().text = OrderString;
        UserList.Add(1);
        UserList.Add(5);

    }
    IEnumerator Waiter()
    {
        yield return new WaitForSeconds(10);
    }
    // Update is called once per frame
    void Update()
    {
        string[] the_array = UserList.Select(i => i.ToString()).ToArray();
        string OrderString = string.Join(", ", the_array);
        Debug.Log(OrderString);
        if (UserList.Count == 8)
        {
            if (UserList == ButtonList)
            {
                //Sound
                BehaviourModel B = new BehaviourModel();
                B.Counter++;
                if (B.Counter < 10)
                {
                    SceneManager.LoadScene(B.SceneArray[B.Counter]);
                }
                else if (B.Counter > 10)
                {
                    SceneManager.LoadScene("MainMenuScene");
                }
            }
            else if (UserList != ButtonList)
            {
                UserList.Clear();
                Debug.Log("Fail");
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы можете создать только один экземпляр, например:

private Button B;
BoardScript boardScript = new BoardScript();

, а затем в своем методе void Clicker(): добавить элемент в UserList.

Или: Вы можете создать статическую переменную в своем классе BoardScript и проверить на нулевое значение.Если значение равно NULL, создайте новый экземпляр, иначе верните старый экземпляр.

Следующий код поможет:

private static BoardScript _uniqueBoardScript;

 private BoardScript()
 {}

 public static BoardScript GetInstance()
 {
     if(_uniqueBoardScript==null)
     { 
         _uniqueBoardScript = new BoardScript();
     }
     return _uniqueBoardScript;
 }

и из вашего void Clicker()

{
    BoardScript boardScript = BoardScript.GetInstance();
    int Two = 2;
    boardScript.UserList.Add(Two);
    Debug.Log("Added);
}
0 голосов
/ 25 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...