В скрипте объекта должна лежать какая то 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;
}