/// <summary>
        /// Removes the agent from the group.
        /// </summary>
        /// <param name="agent">An agent to remove.</param>
        public void RemoveFromGroup(AvoidanceModifier agent)
        {
            if (agent == null)
            {
                return;
            }

            agents.Remove(agent);
            if (agents.Count == 0)
            {
                agents = null;
            }
        }
        /// <summary>
        /// Calculates the avoidance acceleration direction for the agent.
        /// </summary>
        /// <param name="agent">The agent to the avoidance acceleration direction.</param>
        /// <returns>The avoidance acceleration direction for the agent.</returns>
        public Vector3 CalculateAvoidanceDirection(AvoidanceModifier agent)
        {
            Vector3 avoidanceMove  = Vector3.zero;
            int     avoidanceCount = 0;

            Vector3 agentPosition = agent.transform.position;
            float   agentBot      = agentPosition.y;
            float   agentTop      = agentBot + agent.Height;

            foreach (var obstacle in agents)
            {
                if (obstacle != agent)
                {
                    Vector3 obstaclePosition = obstacle.transform.position;
                    float   obstacleBot      = obstaclePosition.y;
                    float   obstacleTop      = obstacleBot + obstacle.Height;

                    if ((obstacleBot >= agentBot && obstacleBot <= agentTop) ||
                        (obstacleTop >= agentBot && obstacleTop <= agentTop))
                    {
                        if (Distance_XZ(agentPosition, obstaclePosition)
                            < agent.Radius + obstacle.Radius)
                        {
                            avoidanceCount++;
                            avoidanceMove += agentPosition - obstaclePosition;
                            //Debug.DrawLine(agentPosition, obstaclePosition, Color.magenta, 1);
                        }
                    }
                }
            }

            if (avoidanceCount > 0)
            {
                avoidanceMove  /= avoidanceCount;
                avoidanceMove.y = 0;
                return(avoidanceMove.normalized);
            }

            return(avoidanceMove);
        }
        /// <summary>
        /// Adds the agent to the group.
        /// </summary>
        /// <param name="agent">An agent to add.</param>
        public void AddToGruop(AvoidanceModifier agent)
        {
            if (agent == null)
            {
                Debug.LogWarning("You are trying to add null to avoidance group.");
                return;
            }

            if (agents == null)
            {
                agents = new List <AvoidanceModifier>();
            }

            if (agents.Contains(agent))
            {
                Debug.LogWarning($"{this.name}: this group already contains this agent({agent.gameObject.name}). Request will be ignored.");
            }
            else
            {
                agents.Add(agent);
            }
        }