I want to do this: The player enter on a BoxCollider (Trigger) and while stay there for 2 seconds will won the level.
I should use OnCollisionStay or OnTriggerEenter, and Time.detaTime? I really don’t know what is the appropiate way.
All of the OnCollisionXXX() methods get triggered by the physics engine with the same interval as FixedUpdate()
gets called. So which ever way you do it you should use FixedUpdate()
and Time.fixedTime
to increment your time variable.
If the contact gets broken up before the time limit, you have to detect that in the OnCollisionExit()
anyways, so it might be easier to use the Enter() and Exit() methods.
I haven’t tested at what time exactly each of the Trigger methods get called (do Enter() and the first Stay() happen in the same FixedUpdate() or one after the other ? Same with the last Stay() an Exit() ? ) But with the default Time.fixedTime of 0.02 seconds… there’s a maximum of 0.04 second difference between the methods you propose. Probably doesn’t matter much in that sense.
public float necessaryTime = 2f;
float elapsed;
void OnTriggerStay(Collider other)
{
if (other.tag == "Player")
{
elapsed += Time.fixedDeltaTime;
if (elapsed > necessaryTime)
{
WinLevel();
}
}
}
void OnTriggerExit(Collider2D other)
{
if (other.tag == "Player")
{
elapsed = 0;
}
}