the problem with OnTriggerStay is that if you intersect with multiple triggers , you have that called twice every frame
but okay let's do a very simple approach. let's assume you set up your trigger properly, and you set up obects so that you don't collide with multiple at once
but also, isn't the condition inverted? you say you want it to go up when you're not on the paint?
public class PlayerAge : MonoBehaviour
{
public float freshAge;
public GameObject paint;
public GameObject Circle;
private bool isOnPaint;
private void FixedUpdate() {
if (isOnPaint == false) {
freshAge += Time.deltaTime;
} else { freshAge = 0f; }
isOnPaint = false;
}
public void OnTriggerStay2D(Collider2D collision)
{
Debug.Log("FRESH");
isOnPaint = collision.gameObject.name == "paint")
}
}
https://docs.unity3d.com/Manual/ExecutionOrder.html
so in OnTriggerStay, you set a flag for if you stand on the paint or not,
FixedUpdate, which should run before your TriggerStay calls, can check this flag every frame and operate accordingly, then you can make it on a per frame basis, and you don't need OnTriggerStay to be called for your logic. because in FixedUpdate, the logic will run every physics frame. you only use the triggerStay to set if you are on the paint or not