В скрипте объекта должна лежать какая то public переменная in_zone, которая по умолчанию false. Также объект надо как-то узнавать, например по тэгу, но можно придумать много других способов. Например скрипт у объекта называется object_skript. Тогда в скрипте зоны:
List<GameObject>  objects;
void OnTriggerEnter(Collider other)
{
    if(other.tag == "object") //Можно выбрать любой тэг
    {
        if(!other.GetComponent<object_skript>().in_zone) // проверка не в зоне ли уже объект
        {
            other.GetComponent<object_skript>().in_zone = true; // объект попал в зону
            objects.Add(new GameObject());
            objects[objects.Count - 1] = other.gameObject; // Добавление в лист нового компонента
        }
    }
}
Ну и дальше там можно смотреть на objects.Count и сравнивать его с чем надо. Также если где-то будет удаление объектов из листа, то в листе будут возникать позиции с null, тогда добавление в лист лучше написать так:
bool x = true;
for(int i = 0; i < objects.Count;)
{
   if(objects[i] == null)
   {
       x = false;
       objects[i] = other.gameObject;
       other.GetComponent<object_skript>().in_zone = true;
       break;
   }
   ++i;
}
if(x)
{
   other.GetComponent<object_skript>().in_zone = true;
   objects.Add(new GameObject());
   objects[objects.Count - 1] = other.gameObject;
}