The logic is that randomly each agent if he is at distance from other agent less then 2 stop moving rotate smooth facing to the other agent wait 3 seconds then both to rotate smooth back facing the next waypoint and keep moving to the waypoint. There is also a possible that agent that is close to other agent less then 2 distance will not stop and rotate facing to it. The idea is to make random meetings between random agents. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class AgentControl : MonoBehaviour { public List<Transform> points = new List<Transform>(); public bool randomMeeting = false; public float threshold = 3f; public float strength = 5f; private float speed; private int destPoint = 0; private NavMeshAgent agent; private GameObject[] agents; void Start() { agents = GameObject.FindGameObjectsWithTag("Agent"); agent = GetComponent<NavMeshAgent>(); var agentsDestionations = GameObject.FindGameObjectsWithTag("Waypoint"); for (int i = 0; i < agentsDestionations.Length; i++) { points.Add(agentsDestionations[i].transform); } // Disabling auto-braking allows for continuous movement // between points (ie, the agent doesn't slow down as it // approaches a destination point). agent.autoBraking = true; agent.speed = Random.Range(10, 50); speed = agent.speed; GotoNextPoint(); } void GotoNextPoint() { // Returns if no points have been set up if (points.Count == 0) return; // Set the agent to go to the currently selected destination. agent.destination = points[destPoint].position; // Choose the next point in the array as the destination, // cycling to the start if necessary. destPoint = (destPoint + 1) % points.Count; } void Update() { RandomMeeting(); // Choose the next destination point when the agent gets // close to the current one. if (!agent.pathPending && agent.remainingDistance < 2f) { GotoNextPoint(); } } private void RandomMeeting() { if (randomMeeting) { GameObject randomAgent = agents[Random.Range(1, agents.Length)]; if (Vector3.Distance(agent.transform.position, randomAgent.transform.position) <= threshold) { StartCoroutine(Meeting(randomAgent)); } } } IEnumerator Meeting(GameObject randomAgent) { var targetRotation = Quaternion.LookRotation(randomAgent.transform.position - transform.position); var str = Mathf.Min(strength * Time.deltaTime, 1); transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str); yield return new WaitForSeconds(3); } } I added the RandomMeeting method. But it's far away from the behaviour I want.