InputGetKeyDown в OnTriggerStay вызывается несколько раз - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть игра, где, если невидимый ящик касается объекта и нажимает «e», текст будет отображаться в зависимости от того, к какому объекту прикоснулись.Проблема в том, что иногда (это довольно случайно) текст запускается три раза.Я пытался вставить ключ ввода в обновление, я пытался проверить некоторые логические значения, если он запускался более одного раза, я проверил, есть ли более одного сценария, но ничего не работает.

private void OnTriggerStay(Collider other)
{
    if (Input.GetKeyDown(name: "e") && other.tag == "Mar Room")
    {
        switch (other.gameObject.name)
        {
            case "Cushion1":

                other.transform.rotation = Quaternion.Euler(-90, 0, 0);
                other.transform.localPosition = new Vector3(-206.849f, 108.2456f, -48.99983f);
                runSentence("CouchText");
                Debug.Log("I have been called cush");
                items += 1;
                break;
            case "Chair":
                other.transform.rotation = Quaternion.Euler(-90, 0, 90);
                other.transform.localPosition = new Vector3(-182.399f, 108.6756f, -16.16f);
                runSentence("ChairText");
                Debug.Log("I have been called chair");
                items += 1;
                break;
            case "Lamp":
                other.transform.rotation = Quaternion.Euler(-90, 0, 0);
                other.transform.localPosition = new Vector3(-180.779f, 111.3156f, -47.82983f);
                runSentence("LampText");
                items += 1;
                Debug.Log("I have been called lamp");
                break;
            case "Time":
                other.transform.rotation = Quaternion.Euler(0, 90, 0);
                other.transform.localPosition = new Vector3(-178.499f, 110.5756f, -37.59983f);
                runSentence("HourglassText");
                items += 1;
                Debug.Log("I have been called time");
                break;
            case "Art":
                other.transform.rotation = Quaternion.Euler(0, 0, 0);
                other.transform.localPosition = new Vector3(-190.499f, 113.3056f, -51.31983f);
                runSentence("PictureText");
                items += 1;
                Debug.Log("I have been called art");
                break;

            default:
                break;
        }
    }
}

Ответы [ 2 ]

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

Никогда не выполняйте обработку ввода в физической функции

Физические функции выполняются с установленными интервалами, в то время как ввод с клавиатуры выполняется с интервалами рендеринга (которые являются нерегулярными и могут быть длиннее или короче шагов физики, вызывая дублирование или отбрасывание входов).

Вместо этого вам нужно поместить ссылку из физической операции в стандартный цикл Update(), где вы проверяете нажатия клавиш и выполняете там свои действия:

private GameObject nearTo = null

private void OnTriggerStay(Collider other) {
    if (other.tag == "Mar Room") {
        nearTo = other.gameObject;
    }
}

private void Update() {
    if(nearTo != null && Input.GetKeyDown(name: "e")) {
        //do stuff
        nearTo = null; //set to null when we're done
    }
}

Также яне думаю, что Input.GetKeyDown(name: "e") является допустимым кодом, но он мог бы быть отредактирован для нашего удобства, а не для реальной реализации.

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

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

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