Как удалить объекты вне камеры?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Как удалить объекты вне камеры?

Сообщение Looujk 22 июн 2022, 23:49

Как удалить объекты вне камеры?
Есть скрипт который генерирует объекты внутри камеры, но по сути он их копирует из объектов вне поле зрения камеры.
Т.е. если я через триггер удаляю объекты вне камеры, то они перестают появляться в камере (когда скрипт заставляет их появиться) и выдает ошибку:

Скрытый текст:
MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
UnityEngine.Object.Internal_InstantiateSingle (UnityEngine.Object data, UnityEngine.Vector3 pos, UnityEngine.Quaternion rot) (at <f1212ad1dec44ce7b7147976b91869c3>:0)
UnityEngine.Object.Instantiate (UnityEngine.Object original, UnityEngine.Vector3 position, UnityEngine.Quaternion rotation) (at <f1212ad1dec44ce7b7147976b91869c3>:0)
UnityEngine.Object.Instantiate[T] (T original, UnityEngine.Vector3 position, UnityEngine.Quaternion rotation) (at <f1212ad1dec44ce7b7147976b91869c3>:0)


Скрипт на появление объектов привел ниже:


Скрытый текст:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Spawner : MonoBehaviour
{
public GameObject[] Fruits;
public Transform[] spawnPoint;

private int rand;
private int randPosition;
public float StartTimeBtwSpawns;
private float timeBtwSpawns;

void Start()
{
timeBtwSpawns = StartTimeBtwSpawns;
}

void Update()
{
if (timeBtwSpawns <= 0)
{
rand = Random.Range(0, Fruits.Length);
randPosition = Random.Range(0, spawnPoint.Length);
Instantiate(Fruits[rand], spawnPoint[randPosition].transform.position, Quaternion.identity);
timeBtwSpawns = StartTimeBtwSpawns;
}
else
{
timeBtwSpawns -= Time.deltaTime;
}
}
}


Я бы в принципе удалил все излишние объекты, чтоб они появлялись только тогда, когда их видит камера. В противном случае их не должно быть (Чтоб не нагружать систему).
Подскажите как лучше сделать?
Looujk
UNец
 
Сообщения: 7
Зарегистрирован: 21 июн 2022, 00:12

Re: Как удалить объекты вне камеры?

Сообщение krauser0993 23 июн 2022, 03:06

Ничего себе ты замудрил, для этого есть Occlusion culling
krauser0993
UNITрон
 
Сообщения: 284
Зарегистрирован: 05 апр 2019, 15:17

Re: Как удалить объекты вне камеры?

Сообщение Looujk 23 июн 2022, 10:59

krauser0993 писал(а):Ничего себе ты замудрил, для этого есть Occlusion culling

Т.е. нет возможности хранить в библиотеке и доставать в определенное время?
Хорошо, прочитаю что такое Occlusion culling
Но если вдруг кто может помочь со скриптом, было бы круто.
Looujk
UNец
 
Сообщения: 7
Зарегистрирован: 21 июн 2022, 00:12

Re: Как удалить объекты вне камеры?

Сообщение Alkos26Rus 23 июн 2022, 12:29

Looujk писал(а):
krauser0993 писал(а):Ничего себе ты замудрил, для этого есть Occlusion culling

Т.е. нет возможности хранить в библиотеке и доставать в определенное время?

Смотря что в твоем понимании "хранить в библиотеке и доставать в определенное время? ". Камера и так не прорисовывает объекты вне зоны видимости. Естественно эти объекты ни куда не деваются и как были на сцене так и остаются. А в твоем случае, даже когда ты их удаляешь они все равно остаются в памяти готовые для создания, поэтому какой смысл в этом непонятно, плюс даже если ты сделаешь загрузку из ресурсов и удаление с выгрузкой, то у тебя будут такие лаги при повороте камеры, что в этом просто отпадает надобность

Occlusion culling не рендерит предметы которые перекрываются другими объектами, там более сложная система и не везде она нужна
Единица - ноль
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1230
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как удалить объекты вне камеры?

Сообщение Jarico 23 июн 2022, 12:37

Alkos26Rus писал(а):Смотря что в твоем понимании "хранить в библиотеке и доставать в определенное время?

Он наверное хочет сделать пул объектов

Alkos26Rus писал(а):Камера и так не прорисовывает объекты вне зоны видимости.

Вне зоны видимости не работают анимации (если не указан параметр Always Animate) и не отрисовываются меши

Alkos26Rus писал(а):А в твоем случае, даже когда ты их удаляешь они все равно остаются в памяти готовые для создания, поэтому какой смысл в этом непонятно, плюс даже если ты сделаешь загрузку из ресурсов и удаление с выгрузкой, то у тебя будут такие лаги при повороте камеры, что в этом просто отпадает надобность.

В памяти остаются данные но ссылки на них пропадают и со временем эта память переписывается другими данными.
Удалять объекты и не нужно, их можно просто выключать перемещая в пул, и вытаскивая из пула активировать
VK Group: _https://vk.com/salavan_dev
Discord: Конь! Чаю!#9382
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
RakNet: _https://github.com/redheadgektor/RakNet_Networking
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Старожил
 
Сообщения: 975
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Как удалить объекты вне камеры?

Сообщение Alkos26Rus 23 июн 2022, 14:05

Jarico писал(а):В памяти остаются данные но ссылки на них пропадают и со временем эта память переписывается другими данными.

Ну я к тому что он использует прямые ссылки а не загружает из ресурсов, все объекты на которые используются прямые ссылки уже загружены в память на этапе загрузке сцены.

Jarico писал(а):Удалять объекты и не нужно, их можно просто выключать перемещая в пул, и вытаскивая из пула активировать

Я думаю даже если просто использовать SetActivate то даже это приведет к большим лагам, когда будешь крутить камерой, ведь речь идет наверно о большом количестве объектов на сцене, иначе если их мало, то чел бы и не замарачивался. Так что это все хрень как по мне, камера и так не прорисовывает объекты вне зоны видимости, а удалять или деактивировать объекты это бессмысленное занятие. Если речь идет например об открытом мире, то лучше поделить мир на регионы и подгружать сцены асинхронно по мере продвижения персонажа
Единица - ноль
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1230
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как удалить объекты вне камеры?

Сообщение Jarico 23 июн 2022, 18:57

Alkos26Rus писал(а):
Jarico писал(а):Удалять объекты и не нужно, их можно просто выключать перемещая в пул, и вытаскивая из пула активировать

Я думаю даже если просто использовать SetActivate то даже это приведет к большим лагам, когда будешь крутить камерой

0 лагов... Есть только в OnEnable или OnDisable нет "тяжёлых" функций
VK Group: _https://vk.com/salavan_dev
Discord: Конь! Чаю!#9382
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
RakNet: _https://github.com/redheadgektor/RakNet_Networking
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Старожил
 
Сообщения: 975
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Как удалить объекты вне камеры?

Сообщение Alkos26Rus 23 июн 2022, 23:21

Jarico писал(а):
Alkos26Rus писал(а):
Jarico писал(а):Удалять объекты и не нужно, их можно просто выключать перемещая в пул, и вытаскивая из пула активировать

Я думаю даже если просто использовать SetActivate то даже это приведет к большим лагам, когда будешь крутить камерой

0 лагов... Есть только в OnEnable или OnDisable нет "тяжёлых" функций

0 лагов при использовании SetActivate в реал тайме и с большой частотой, так как игрок постоянно крутит камерой? Серьезно? Конечно речь не о OnEnable или OnDisable, а о том что объекты помимо того что сами имеют какое то количество полигонов, так еще могут иметь иерархию из дочерних объектов и колайдеры, включение и отключение которых приведет к фризам. SetActivate была всегда медленной функцией, конечно если речь идет не о пустом объекте
Единица - ноль
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1230
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как удалить объекты вне камеры?

Сообщение Jarico 24 июн 2022, 16:32

Alkos26Rus писал(а):SetActive была всегда медленной функцией, конечно если речь идет не о пустом объекте

Порой мне кажется что ты живёшь в 2000-х годах раз уж относишь SetActive к медленным функциям...
VK Group: _https://vk.com/salavan_dev
Discord: Конь! Чаю!#9382
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
RakNet: _https://github.com/redheadgektor/RakNet_Networking
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Старожил
 
Сообщения: 975
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Как удалить объекты вне камеры?

Сообщение Alkos26Rus 24 июн 2022, 18:56

Jarico писал(а):
Alkos26Rus писал(а):SetActive была всегда медленной функцией, конечно если речь идет не о пустом объекте

Порой мне кажется что ты живёшь в 2000-х годах раз уж относишь SetActive к медленным функциям...

Просто делаю игры под телефоны и немного шарю что медленно а что нет. Активация\деактивация большого объекта приведет к подвисанию, если чел задумал оптимизировать свою игру, то постоянное отключение/включение объектов не лучшая идея. Пул объектов лучше только когда он заменяет создание/спавн объектов в реалтайме, но когда объекты уже стоят на сцене зачем их трогать и делать из них какой то бесполезный пул? Кароче, чел не написал толком какая у него задача, может он хочет бесконечный мир, тогда да нужен пул из объектов, а если это просто ограниченная локация то пул тут нафиг не сдался, только ухудшит ситуацию
Единица - ноль
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1230
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как удалить объекты вне камеры?

Сообщение Saltant 24 июн 2022, 22:49

Alkos26Rus писал(а):
Jarico писал(а):
Alkos26Rus писал(а):SetActive была всегда медленной функцией, конечно если речь идет не о пустом объекте

Порой мне кажется что ты живёшь в 2000-х годах раз уж относишь SetActive к медленным функциям...

Просто делаю игры под телефоны и немного шарю что медленно а что нет.

Ща уже телефоны быстрее моего компа предыдущего работают))) Вот у меня планшет самсунг 2013 года, супер мощный топовый на тот момент. У меня игра WebGL юнити идет на 35-45фпс а у моего друга на смартфончике в 120 фпс жарит :D
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 1880
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
Skype: saltant1989
  • Сайт

Re: Как удалить объекты вне камеры?

Сообщение Alkos26Rus 25 июн 2022, 14:34

Saltant писал(а):
Alkos26Rus писал(а):
Jarico писал(а):
Alkos26Rus писал(а):SetActive была всегда медленной функцией, конечно если речь идет не о пустом объекте

Порой мне кажется что ты живёшь в 2000-х годах раз уж относишь SetActive к медленным функциям...

Просто делаю игры под телефоны и немного шарю что медленно а что нет.

Ща уже телефоны быстрее моего компа предыдущего работают))) Вот у меня планшет самсунг 2013 года, супер мощный топовый на тот момент. У меня игра WebGL юнити идет на 35-45фпс а у моего друга на смартфончике в 120 фпс жарит :D

Ну 120фпс в принципе мало у какого смартфона доступно, в основном 60 потолок, как бы там ни было нормальные масштабные игры(с открытым миром например) которые идут плавно без падения фпс, это игры крупных компаний, которые очень замарачиваются над оптимизацией. А вот игра какого нибудь Васи Пупкина, сделанная на юнити, обычно похоже на лагающее гавно с 20фпс и даже хороший смартфон не спасет и перегреется через 10 минут
Единица - ноль
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1230
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как удалить объекты вне камеры?

Сообщение Saltant 25 июн 2022, 17:57

Alkos26Rus писал(а):
Saltant писал(а):
Alkos26Rus писал(а):
Jarico писал(а):
Alkos26Rus писал(а):SetActive была всегда медленной функцией, конечно если речь идет не о пустом объекте

Порой мне кажется что ты живёшь в 2000-х годах раз уж относишь SetActive к медленным функциям...

Просто делаю игры под телефоны и немного шарю что медленно а что нет.

Ща уже телефоны быстрее моего компа предыдущего работают))) Вот у меня планшет самсунг 2013 года, супер мощный топовый на тот момент. У меня игра WebGL юнити идет на 35-45фпс а у моего друга на смартфончике в 120 фпс жарит :D

А вот игра какого нибудь Васи Пупкина, сделанная на юнити, обычно похоже на лагающее гавно с 20фпс и даже хороший смартфон не спасет и перегреется через 10 минут

Вывод - нефиг играть в игры Васи Пупкина слепленные на коленке из готовых ассетов :ymdevil:
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 1880
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
Skype: saltant1989
  • Сайт


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 31