【问题标题】:Why the counter variable reset to 0? [duplicate]为什么计数器变量重置为0? [复制]
【发布时间】:2020-09-23 21:01:32
【问题描述】:
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;

public class SecurityKeypadKeys : MonoBehaviour
{
    public TextMesh text;

    private int counter = 0;

    private void Start()
    {
        
    }

    private void OnMouseDown()
    {
        string[] digits = Regex.Split(transform.name, @"\D+");
        foreach (string value in digits)
        {
            int number;
            if (int.TryParse(value, out number))
            {
                counter++;
                if (counter < 8)
                {
                    text.text += number.ToString();
                }
            }
        }
    }
}

我使用了一个断点,发现如果我按下一个数字 1 的按钮并按下它 8 次,那么它将停止将下一个数字 1 写入文本,但是如果我点击数字 2,它将写入到文本另外 2 个数字的 8 倍。

但我希望玩家只能输入 8 个数字,无论是 12345678 或 88888888 或 0000000 还是 56498611,然后如果玩家继续输入,它将不会在文本中添加更多数字。

问题是脚本附加到 10 个立方体上,就像按钮一样。所以每次我点击另一个立方体(按钮)时,它都会将计数器重置为 0。

【问题讨论】:

  • 当您可能打算使用静态字段时,您正在使用实例字段。通过将counter 更改为private static int counter = 0;,将static 字段设为static。请参阅此处了解更多信息:What does `static` mean in c#?

标签: c# unity3d


【解决方案1】:

根据您的问题,我假设您对每个按钮都有不同的 SecurityKeypadKeys 实例。每个实例都有自己的计数器,初始化为 0,但写入相同的 text.text。这意味着每个数字都可以被按下 8 次。

要纠正这个问题,您有两个选择:

  1. 在计数器声明中添加静态关键字。 private static int counter = 0; 这将只允许输入 8 个数字,除非您在类中添加其他方法来重置计数器。
  2. 在所有按钮之间共享同一个类实例,而不是为每个按钮创建一个新实例。 var keypad = new SecurityKeypadKeys(); 这个方法可以让你在每次需要 8 个数字时创建一个新实例,而无需重置方法。

另一方面,我建议将计数器增量移到 if 语句中。否则,如果函数被调用的次数足够多,int 可能会重载回 -2147483648,从而重新启用要添加的更多数字。

if (counter < 8)
{
    counter++;
    text.text += number.ToString();
}

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多