Unity Update方法相同的键输入两次

时间:2017-04-11 20:14:17

标签: c# unity3d

我正在创建一个统一的对话系统,用户可以从中选择,并通过文本字段获取响应或获取更多选项供选择。

起初我有3个选项。这三个选项属于一个脚本,另外两个选项属于另一个同时运行的选项。每个选项都有一个int索引(第一个选项= 0,第二个选项= 1等)。我已经这样做,如果我按下选项1,索引变为3转到第四个选项。 由于我已将所有内容放入Update以等待用户输入密钥,因此每当用户按Enter键时,它都会从两个脚本执行,因此它会立即输入两个语句。

当我选择选项1时,发生了什么,即时获得选项4的响应,因为当我按下输入时,它会从两个脚本执行

我怎样才能这样做,当我按下输入选项1时,它会忽略另一个声明。屏幕截图如下。

        if (Input.GetKey (KeyCode.Return)) {

            if (indexConversation == 0) {
                Debug.Log("first Option");


               // GameObject.Find("Scripts2").SetActive(true);

                telResponse.text = "Response 1"; 
                Conv1Controller.Conv1showConversation = true;
                indexConversation = 3;
                Debug.Log (indexConversation);

            } else if (indexConversation == 1) {

                Debug.Log("second Option");
                telResponse.text = "Response 2";
                StartCoroutine(responseTwoFollowedbySix ());
            }

            else if (indexConversation == 2) {

                Debug.Log("third Option");
                telResponse.text = "Response 3";
                StartCoroutine(responseThreeFollowedbyFourFollowedbySeven ());
            }

            showConversation = false;

        }

另一个脚本(选项4和5)

  if (Input.GetKey(KeyCode.Return))
        {
            if (DialogueController.indexConversation == 3)
            {
                Debug.Log("Fourth Option");
                telResponse.text = "Response 4";


            }


            if (DialogueController.indexConversation == 4)
            {

                Debug.Log("Option 5");
                telResponse.text = "Response 5";
            }

            //Conv1showConversation = false;


        }

2 个答案:

答案 0 :(得分:0)

考虑到您的第一个脚本有一个indexConversation变量,而您的第二个脚本似乎是使用DialogueController.indexConversation引用它,我觉得这个变量是public static int变量。在这种情况下,你可以简单地做这样的事情:

第一个脚本

[SerializeField]
private YOUR_OTHER_SCRIPT_CLASS otherScript;

if (Input.GetKey(KeyCode.Return))
{
    showConversation = false;
    switch(indexConversation)
    {
        case 0:
            Debug.Log("first Option");
            telResponse.text = "Response 1"; 
            Conv1Controller.Conv1showConversation = true;
            indexConversation = 3;
            Debug.Log (indexConversation);
            break;

        case 1:
            Debug.Log("second Option");
            telResponse.text = "Response 2";
            StartCoroutine(responseTwoFollowedbySix ());
            break;

        case 2:
            Debug.Log("third Option");
            telResponse.text = "Response 3";
            StartCoroutine(responseThreeFollowedbyFourFollowedbySeven ());
            break;

        default:
            otherScript.ReturnKeyPressed();
            break;
    }
    showConversation = false;
}

在这里,我添加了一个变量来引用您的其他脚本,并使用switch指令来避免许多ifelse if。 此外,如果indexConversation的值不是1,2或3,则要求您的其他代码执行某些操作。

其他剧本

public void ReturnKeyPressed()
{
    switch(DialogueController.indexConversation)
    {
        case 3:
            Debug.Log("Fourth Option");
            telResponse.text = "Response 4";
            break;

        case 4:
            Debug.Log("Option 5");
            telResponse.text = "Response 5";
            break;

        default:
            break;
    }
}

在此脚本中,不再有if (Input.GetKey(KeyCode.Return)),因为输入检测将在第一个脚本中进行,并在需要时发送到此脚本。

<强> P.-S

  • 正如@Programmer所说,除了调试之外,你不应该使用OnGUI()。这个方法非常繁重,因为每帧调用很多次(没用),你可以使用Unity UI System轻松使用UI。
  • 正如@Nabren建议的那样,如果你的系统比这个简单的情况更复杂,你应该真正改变它的方式,并有一个输入管理器类来获取输入并将它们发送到适当的脚本。

希望这有帮助,

答案 1 :(得分:0)

您应该考虑将对话存储到具有响应链接的模型中,并且响应可以链接到特定的“FollowUp”对话。这样,您可以将脚本编写为尽可能不可知。你只需给它一个响应,它知道如何处理它。每个响应都将获得自己的“ResponseView”脚本,该脚本接收响应模型并可以为按键事件添加按钮侦听器或键侦听器,然后在接收到正确的输入后,将使用其当前响应模型加载下一个对话。在代码中编写特定方法来告诉您的响应他们需要去哪里非常非常脆弱,根本无法很好地扩展。