实现pin键盘,简化代码?

Kil*_*ert 1 c# unity-game-engine

我在游戏中创建了一个键盘.我创建的游戏对象有10个按钮:0-9.玩家必须输入4位数代码才能打开门.一旦玩家输入第一个数字,它就会显示在键盘的屏幕上.

我已经完成了所有基本代码,但我确信我已经以非常低效的方式完成了这项工作.现在,我已将以下功能附加到我的一个键上,实际上是数字键1:

    public void Key1() {

    if (digit1entered == false) {

        digit1 = 1;
        displaycode.text = digit1.ToString () + digit2.ToString () + digit3.ToString () + digit4.ToString ();
        print ("First digit entered");
        digit1entered = true;
    } else {
        if (digit1entered == true && digit2entered == false) {

            digit2 = 1;
            digit2entered = true;
            displaycode.text = digit1.ToString () + digit2.ToString () + digit3.ToString () + digit4.ToString ();
            print ("2nd digit entered");
        } else {
            if (digit2entered == true && digit3entered == false) {
                digit3 = 1;
                digit3entered = true;
                displaycode.text = digit1.ToString () + digit2.ToString () + digit3.ToString () + digit4.ToString ();
                print ("3rd digit entered");
            } else {
                if (digit3entered == true && digit4entered == false) {

                    digit4 = 1;
                    digit4entered = true;
                    displaycode.text = digit1.ToString () + digit2.ToString () + digit3.ToString () + digit4.ToString ();
                    print ("4th digit entered");

                }
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了使整个键盘工作,我需要创建9个以上的功能,每个功能都有2-0的更新值.这意味着我最终会得到10个相似的函数,除了它们输入的值.这是糟糕的编程,所以我该如何避免呢?哦,如果上面已经开始编程不好,欢迎所有提示;-)

Fat*_*tie 5

这样做非常困难.你挑选了一个真正的挑战.

你的第一个问题是,你必须集中信息流.让我们这样做.

有这样的功能

public void UserClickedButtonNumbered(int digitNumber)
    {
    Debug.Log("that button name is " +digitNumber);
    }
Run Code Online (Sandbox Code Playgroud)

在你的脚本中说出Complex.cs一些对象

有你的十个按钮.在Inspector中,拖动以连接...

在此输入图像描述

请注意,您实际上可以键入一个数字 - 我输入"3".

所以你实际上在你的十个按钮上设置值"0"到"9".

{脚注.你不会在"真正的"项目中这样做,因为它是正交的,会导致设计人员麻烦.我会根据键盘位置或其他东西神奇地查找数字.但这是一个很好的开始!}

所以你实际连接

所有按钮都是相同的脚本和功能.

一旦你有了这个工作,请告诉我们,我们将找出下一部分!


接下来,您需要一个永远不会让字符串超过四个字符的函数.如果你在最后添加一个,它会切掉第一个.

(重要的是:你实际上是通过一个扩展来实现的,这是Unity编程的绝对核心.但它太过于一次解释了.当你有时间研究这个时)

大概你的功能是......

   private string FourOnly(string s)
    {
    while (s.Length > 4 ) s = s.Substring(1);
    return s;
    }
Run Code Online (Sandbox Code Playgroud)

所以现在你可以这样做......

[System.NonSerialized] public string pin = "";

public void UserClickedButtonNumbered(int digitNumber)
    {
    Debug.Log("that button name is " +digitNumber);
    pin = pin + digitNumber.ToString();
    pin = FourOnly(pin);
    Debug.Log("So far, the user entered: " +pin);
    if ( pin == "1313" ) Debug.Log("code unlocked!");
    }
Run Code Online (Sandbox Code Playgroud)

所以你真的完成了.

整个过程只需要四行代码.唷.


最后!您只想在四个"LED显示屏"中显示信息

最后,只需更新LED显示屏.

你真的需要用UnityEvent做到这一点,这让它非常容易.(这里的教程.)但它一下子太多了,所以只需要制作一个非常简单的功能......

public Text led1;  // Text, or whatever your digits are
public Text led2;
public Text led3;
public Text led4;

private void FixLEDs()
 {
 string show = pin + "       "; // just add many spaces on the end
 led1.text = show[0].ToString(); // "show[n]" is a char, not a string
 led2.text = show[1].ToString();
 led3.text = show[2].ToString();
 led4.text = show[3].ToString();
 }
Run Code Online (Sandbox Code Playgroud)

非常简单.所以每次用户触摸任何东西时都要调用它,

这是最终的完整代码:

public void UserClickedButtonNumbered(int digitNumber)
    {
    pin = FourOnly( pin + digitNumber );
    FixLEDs();
    if ( pin == "1313" ) Debug.Log("code unlocked!");
    }
Run Code Online (Sandbox Code Playgroud)

你完成了.去喝酒