为什么List.Add方法不起作用?

时间:2018-09-24 23:59:08

标签: c# unity3d

我有一个统一开发的游戏,这是一个按钮的代码。它应该使用脚本“ BoardScript”的公共列表,并在此列表中添加一个数字,但是由于某种原因,它不起作用。 我已经检查了Button单击是否起作用(如您所见,在代码中显示了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。 因此,正如史蒂夫所说,这是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 :(得分:4)

每次单击按钮都会创建一个BoardScript的新实例。您应该将boardScript变量作为变量存储在类或单独的组件中,以确保数据能够持久保存。

答案 1 :(得分:2)

您只能创建一个实例,例如:

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);
}