如何设置触发器以在Unity3D中创建可交互的对象?

时间:2018-12-07 18:47:29

标签: c# unity3d

我正在尝试制作一个脚本,当该脚本放置在具有对撞机的对象上时,它将允许玩家与其进行交互。我想使用触发器来做到这一点。目前,我只希望它在达到某个范围时将“交互”打印到控制台,由于某种原因它没有这样做。我什至试图将其设置为player.position =! null和player.position == null,在两种情况下都不会打印到控制台。

这是可交互的代码

void update(){

        float distance = Vector3.Distance(player.position, transform.position); 
        if (distance <= radius)
        {
            Debug.Log("INTERACT");
        }

} 
public void OnTriggerStay(Collider other) {
    isFocused = true;
    player = other.GetComponent<Transform>();

}

这是玩家与对撞机进行交互的代码

public void OnTriggerStay(Collider interactionCollider){
    interactable = interactionCollider.GetComponent<Interactable>();
    if(Input.GetKeyDown("f")){
        if(interactable!=null){
            Debug.Log("yay");
        }
    }
}

当我击中f并且我在另一个大肠杆菌中时,“ Yay”会打印。

1 个答案:

答案 0 :(得分:0)

您所做的是正确的99%。但是,我建议您在可交互对象而不是播放器上放置交互触发脚本。这将使您可以使用不同的输入键码进行多次交互,而在播放器上只能进行一次交互。

如果要检查一定距离,则更明确的是对撞机/触发器使用Enter和Exit功能。然后,在您的Update()中,您只需要通过简单的布尔比较来检查玩家是否在对撞机/触发器中。

在对撞机/触发器中,输入和退出时,使用作为参数发送的对象变量更为有效。这样就可以简单地选择要比较的内容,不需要不必要的函数调用GetComponent <>();

以下一些示例代码可供参考。

//Flag used to tell if the object can be interacted with or not.
    public bool isInteractable = false;


    void Update()
    {
        //Checks if the player is in the collider and also if the key is pressed.
        if(isInteractable && Input.GetKeyDown(KeyCode.F))
        {
            //personalized code can go in here when activated.
            Debug.Log("Interact");
        }
    }

    /// <summary>
    /// Is called when there is an object that enters the collider's borders.
    /// </summary>
    /// <param name="other"></param>
    private void OnTriggerEnter(Collider other)
    {
        //Compares the tag of the object entering this collider.
        if(other.tag == "Player")
        {
            //turns on interactivity 
            isInteractable = true;
        }
    }
    /// <summary>
    /// Is called when there is an object that leaves the collider's borders.
    /// </summary>
    /// <param name="other"></param>
    private void OnTriggerExit(Collider other)
    {
        //compares the tag of the object exiting this collider.
        if(other.tag == "Player")
        {
            //turns off interactivity 
            isInteractable = false;
        }
    }