- Home /
My trigger is called twice
Hey, I have a problem. In my game you have a player (Character controller with capsule collider) that picks up objects like logs to build stuff in a crafting table. The crafting table has got a trigger and with an onCollisionEnter that detects what kind of object is. Example: if it is a log it will increase the array log index and when the object leaves the trigger area, with an OnCollissionExit it decreases the array index of the log. Then the player interacts with the crafting table and it checks what materials are near the crafting and it crafts what is possible. The problem is that the onTriggerEnter and onTriggerExit behaves strangely, sometimes it launches twice so the counter does not work. I want it to launch only once:
void OnTriggerEnter(Collider other) {
switch (other.tag)
{
case "PickUp":
object[0]++;
Debug.Log(object[0]);
break;
}
}
void OnTriggerExit(Collider other){
switch (other.tag) {
case "PickUp":
object [0]--;
Debug.Log(object[0]);
break;
}
}
Answer by DRsabadash · Mar 17, 2017 at 08:01 AM
A usual approach is to set a boolean value to check whether or not the collider has been activated, and flipping it once it has so it can not activate multiple times. (bool b = true, OnColliderEnter only executes code if b = true, then sets it to false in the code so it cannot run twice, OnColliderExit sets it back to true so the collider can be re-collided with) For some reason, setting a boolean check for colliders can sometimes cause the boolean value to either flip, or to turn on/off the OnTriggerEnter/OnTriggerExit methods while remaining in the trigger area, like opening a door and closing it repeatedly while in the trigger area, or flipping the boolean value so it closes when you approach and opens when you walk away.
using a simple variable iterator prevents the actual method from being called repeatedly, guaranteeing only one execution per collision.
//previous code in class
//using a door opening and closing as an example
[SerializeField] private GameObject device;
private int i = 0;
void OnTriggerEnter(Collider other){
DoorScript door = device.GetComponent<DoorScript>();
if (i == 0) {
if (door != null) {
door.Operate ();
i++;
}
}
}
void OnTriggerExit(Collider other){
DoorScript door = device.GetComponent<DoorScript>();
if (i == 1) {
if (door != null) {
door.Operate ();
i = 0;
}
}
}
/* All DoorScript contains is a function Operate() and a boolean for if the door is open, and an if/else statement in Operate() for moving door to open if bool is false (set to closed) and moving door to closed if bool is true (set to open)
Your answer
Follow this Question
Related Questions
OnTrigger event when colliders are already touching eachother 1 Answer
OnCollisionEnter and OnTriggerEnter not working 1 Answer
Detect when a trigger has entered a collider 1 Answer
How can i look for collisions of the bulidngs in may array ? how can i use OnTRiggerEnter/exit ? 0 Answers
Trigger Spawning? 1 Answer