发生碰撞/触发时检测按键按下

时间:2018-10-07 18:16:31

标签: c# unity3d

我有一个对象,我正在尝试让玩家输入触发器并按下键,交换相机。

我的代码:

public class Canhao : MonoBehaviour
{
    public Camera cameraPlayer;
    public Camera CameraCanhao;


    private void Start()
    {
        cameraPlayer.gameObject.SetActive(true);
        CameraCanhao.gameObject.SetActive(false);
    }

    private void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.CompareTag("Player") || Input.GetKeyDown(KeyCode.C))
        {
            if(cameraPlayer.gameObject.activeSelf)
            {
                cameraPlayer.gameObject.SetActive(false);
                CameraCanhao.gameObject.SetActive(true);
            }
        }

    }

但是他不遵守按下C键的条件,而只是在玩家进入扳机时才切换相机。我忘记了什么?

2 个答案:

答案 0 :(得分:3)

不要检查物理回调函数中的输入。在true函数中将标记设置为OnTriggerEnter,然后在false函数中将标记设置为OnTriggerExit。然后,您可以在Update函数中检查该标志。您还应该在Update函数中检查“ C”键是否被按下,因为每帧都会被检查一次。

最后,要检查在按下“ C”键时是否存在触发器,请使用&&而不是||。当您使用||时,这意味着if语句将在任何条件为true时都将验证为true,但是您都希望两者都为true应该使用&&

public Camera cameraPlayer;
public Camera CameraCanhao;
bool triggered = false;

private void Start()
{
    cameraPlayer.gameObject.SetActive(true);
    CameraCanhao.gameObject.SetActive(false);
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.C) && triggered)
    {
        if (cameraPlayer.gameObject.activeSelf)
        {
            cameraPlayer.gameObject.SetActive(false);
            CameraCanhao.gameObject.SetActive(true);
        }
    }
}

private void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Player"))
    {
        triggered = true;
    }

}

private void OnTriggerExit(Collider other)
{
    if (other.gameObject.CompareTag("Player"))
    {
        triggered = false;
    }
}

请注意,如果这对您不起作用,请确保将Debug.Log放在OnTriggerEnterOnTriggerExit内,以确保它们被调用。如果未调用它们,请确保在对撞机上启用了“是触发器”,并且还向对撞机附加了Rigidbody

答案 1 :(得分:1)

您要放置TRIGGER || KEYPRESS您必须替换||与&&。

if(other.gameObject.CompareTag("Player") && Input.GetKeyDown(KeyCode.C))