OnTriggerStay中的InputGetKeyDown被多次调用

时间:2018-09-17 04:10:02

标签: c# unity3d unityscript

我有一个游戏,如果一个不可见的盒子正在触摸一个物体,然后按“ e”,则将根据所触摸的物体显示文本。问题是somethimes(有点随机),它将使文本运行3次。我已经尝试过将inputkey更新,我已经尝试了一些布尔值来测试它是否已经运行了不止一次,我已经检查了是否有多个脚本在执行此操作,但是没有任何效果。

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 :(得分:2)

从不进行物理功能中的输入处理

物理功能以设置的间隔运行,而键盘输入以渲染帧间隔运行(这是不规则的,可能比“物理”步骤长或短,导致输入重复或掉落)。

您需要将物理操作的引用保留到标准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")是有效的代码,但是为了方便起见,可能已对其进行了编辑,而不是实际的实现。

答案 1 :(得分:1)

如果您可能与多个触发器进行交互,则可能遇到一个问题,即在触发器上停留可以被多次调用。 GetKeyDown对于正在查看的整个帧保持为真,因此,如果您将物理刻度设置为比帧速率更高的速率,您还将收到多个呼叫。