detect a trigger one time per collision

In my game there are 2 players, Player1-a and Player2, when the players collide, the text on each one of them is changing (Player1-a is Player1 and Player2 is Player2-a). The problem is that it keeps changing texts while the players are colliding (it can switch the texts 2 times for one collision) and i want it to change the texts only one time per collision. And I also need that after a collision it wont be able change texts for 5 seconds because if they will collide again after 1 second it will change the texts again).
This is the player1 collision action:

 void OnTriggerEnter2D(Collider2D other)
     {
         if (other.CompareTag("TriggerOn"))
         {
             if (firstPlayerText.text == "Player1-a")
             {
                 firstPlayerText.text = "Player1";
                 secondsPlayerText.text = "Player2-a";
             }
         }
     }

and this is the collision action of the other player:

 void OnTriggerEnter2D(Collider2D other)
     {
         if (other.CompareTag("TriggerOn2"))
         {
             if (secondsPlayerText.text == "Player2-a")
             {
                 firstPlayerText.text = "Player1-a";
                 secondsPlayerText.text = "Player2";
             }
         }
     }

By the way I also want that after the collision, the player2 with the new text (player2-a) wont be able to move for 5 seconds.

When two objects collide with each other, both receive the collision information.

So, the best practice is to have only one of those patterns :

  • object minds its own business, does things to itself but leaves the other one alone
  • object does things to the other object, but does nothing to itself

Or you can also use if (gameObject.GetInstanceID() < other.gameObject.GetInstanceID()) to do things only on one of the two by comparing their InstanceID which will always be unique. As GetInstanceID() has a cost, you can also do it only when (gameObject.tag == other.gameObject.tag).
Like :

if (gameObject.tag != other.gameObject.tag || gameObject.GetInstanceID() < other.gameObject.GetInstanceID())
{
    // we're different or I was first, I handle collision
}

@UnityCoach Thanks a lot for the answer