我正在尝试制作一个脚本,当该脚本放置在具有对撞机的对象上时,它将允许玩家与其进行交互。我想使用触发器来做到这一点。目前,我只希望它在达到某个范围时将“交互”打印到控制台,由于某种原因它没有这样做。我什至试图将其设置为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”会打印。
答案 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;
}
}