Как сделать уничтожение объекта в юнити

Добавил пользователь Morpheus
Обновлено: 05.10.2024

Я хочу знать, это правильный способ уничтожить любой объект. потому что он продолжает показывать мне msg, что "Избегайте уничтожения объекта, чтобы избежать потери данных".

И ГЛАВНОЕ. Этот код хорошо работает в редакторе Unity (настройки сборки для Android). Но если я создам и создаю APK из этого. на моем мобильном телефоне Android (redmi 1s), он не работает. Bullete автоматически запускается автоматически (по мере необходимости), но так как любой пульт попадает в метеорит, чем игровые лаги для милисекундов и маркеров прекращается стрельба. И ОДИНОЧНЫЙ КОД РАБОТАЕТ ТЯЖЕСТИ НА ЕДИНСТВЕ.

ОЗНАЧАЕТ, ЧТО Я УБИЛ bulest prefab навсегда, написав Destroy (gameObject).

  • необходимо Объяснение и решение для правильного уничтожения объектов.

Правильный способ уничтожения объектов не уничтожает их :).

Msg Вы получаете консоль внутри Unity - это просто предупреждение, чтобы избежать уничтожения объектов. Основная причина заключается в том, что Destroy и Instantiate являются ОЧЕНЬ дорогими командами, и они часто используются много (например, ваш пример, создавая каждую пулю, а затем уничтожая ее),

Причина, почему это хорошо работает на ПК, состоит в том, что у вас гораздо больше вычислительной мощности аппаратного обеспечения по сравнению с мобильным устройством, а отставание, которое вы получаете на мобильных устройствах, - это время, необходимое для завершения команды Destroy (или Instantiate).

То, как вы можете избежать использования объектов создания и уничтожения, - это использование пула объектов, это простой способ повторного использования небольшого пула объектов.

Вот простой способ, как вы его реализуете: 1. Instantiate пусть скажем 5 пуль при запуске и спрятать их внутри barrell или что-то в этом роде. 2. Пропустите первую пулю из ствола, и когда она ударит что-то, просто переместите ее обратно в бочонок в конце массива. 3. Продолжайте повторное использование пуль

Но вы можете уйти с гораздо меньшим пониманием пула объектов, если это слишком долго, попробуйте найти в Интернете что-то вроде "Объединение объектов Unity3D" и найдите более простой tuorial.

Я новичок в единстве, и на днях мне было интересно, что было бы полезно, если бы я мог создавать некоторые объекты в моей игровой сцене и, по мере их создания, сделать так, чтобы они автоматически удалялись через некоторое время ,

Я думал о том, чтобы автоматически добавлять к ним сценарий Destroy, чтобы они могли быть удалены через некоторое время, используя:

Я не уверен, что это то, что мне нужно, и если я не знаю, как бы я это сделал.

Как я могу сделать это так, чтобы мои объекты автоматически удалялись через некоторое время, в том смысле, что у меня их много?

2 ответа

Довольно легко добавить любой компонент в игровой объект при создании экземпляра, включая классы, используя GameObject.AddComponent () . Если ваш сценарий хорош с самого начала, вы можете сделать это inline . Если вам нужно что-то сделать со своим скриптом после его добавления, вы можете создать ссылки при создании экземпляра.

Добавление класса inline

Настройка встроенной строки выполняется быстрее, но она не дает нам никакой ссылки на игровой объект или уничтожитель объектов, который мы создали. Если они предназначены для самостоятельного запуска, без необходимости установки после того, как они были созданы, мы в порядке. Если вам нужно будет ссылаться, позже, ниже, для создания ссылок.

Добавление и ссылка на класс

Иногда просто создание класса не будет сокращать его. То же самое может произойти для вашего экземпляра игрового объекта. Если мы создадим их inline, как показывает вышеприведенный пример, мы не создаем никаких ссылок для дальнейших манипуляций. Возможно, нам захочется создать ссылку на игровой объект, который мы создадим для последующего использования, или даже добавить его в список всех игровых объектов, которые мы создали из того же класса. Аналогичным образом, мы можем захотеть получить локальную ссылку на добавленный класс ObjectDestroyer , чтобы выполнить дополнительную настройку.

Вы можете создавать ссылку только на объект игры или создавать ссылку только на класс, который вы добавляете к игровому объекту. Если ссылаться только на объект игры, вы можете создать его встроенный, как в приведенном выше примере.

Я ссылался на свой GameObject, но не на мой класс! Oh Noeeeeeee!

Конечно, вы можете обнаружить, что вам нужно получить доступ к вашему ObjectDestroyer , прикрепленному к игровому объекту, но не создать (или иначе потерял) ссылку на него. Аналогично приведенным выше примерам мы можем использовать GetComponent<>() , чтобы захватить ссылку после начального создания.

Последнее, что касается типов, поскольку вы запускаете в него

Поскольку вы используете тип T , используя приведенные выше примеры, я счел разумным дать быстрое объяснение, чтобы избежать потенциальной путаницы. Когда вы видите указанный T (например, GetComponent () или List () ), это просто означает, что этот метод или класс generic . Это означает, что вы можете заменить T на множество других типов, и это сработает.

Это сложнее, но для новичка все, что вам нужно знать, это то, что GetComponent () можно записать как GetComponent () , если вы хотите получить прикрепленный коллайдер, или как GetComponent () , если вы хотите получить прикрепленное Rigidbody или даже GetComponent () , если вы хотите получить прикрепленный класс с именем DooHickey .

Существуют ограничения на то, как вы можете использовать генерики, но в общем смысле приведенные выше примеры не должны приводить вас в заблуждение. Просто знайте, что если вы попробуете GetComponent () и играобъект не содержит такой компонент, он вернет null .

Просто прикрепите этот скрипт к вашему gameObject /prefab и установите для переменной lifeTime, как долго вы хотите, чтобы этот объект жил:

Похожие вопросы

Популярные теги

Уроки Unity5, gamedev

Unity 5 tutorials, destructible objects, destructible glass, devgam, gamedev, unity

Создание разрушаемого стекла в Blender

Заходим в Blender, выделяем куб и начинаем делать форму стекла. Для этого нажмите S и X,Y или Z, чтобы масштабировать по одной из осей. Должно получиться что-то подобное.

уроки unity5, unity 5, devgam, gamedev, scripting, разрушаемый объект

Создание разрушаемого стекла, разрушаемость в unity, уроки, видеоуроки, для начинающих

Текстурированием и созданием материалов мы займемся позже. Сейчас мы должны сохранить модель в формате FBX.

devgam, gamedev, геймдев

Вернемся к Блендеру, откроем панель инструментов (слева), нажав горячую клавишу T. Слева есть несколько вкладок: Tool, Create, Relations, Animation, Physics, Grease Pencil. Перед тем, как использовать Cell Fracture, нам нужно создать эффект пробития стекла пулей. Для этого нам нужен Grease Pencil. Заходим в эту вкладку, ставим галочку Continuous Drawing, в Data Source выбираем Object, в Stroke Placement > Surface. Затем нажимаем Draw. Если что-то не понятно, то выделите так, как на этом скриншоте.

devgam tutorials, tutorial, unity tutorials, туториал юнити

Теперь нам нужно нарисовать два круга, как на скриншоте ниже.

Разрушаемость в играх, unity уроки для начинающих, геймдев, создание игр

Теперь можно приступить к разбитию стекла. Заходим в Cell Fracture (Tool > Cell Fracture). В открывшемся меню мы видим огромное количество функций, но мы будем работать только с теми, что выделены на фото ниже.

Unity 5 для начинающих, уроки unity 5

Source Limit отвечает за количество деталей, на которые мы разобьем модель. Noise - рандомизатор разрушений, от нуля до единицы. Material отвечает за то, какой материал будет в разрушенной модели, то есть в тех местах, где будет разлом. По умолчанию стоит 0, то есть тот материал, который вы сейчас используете. Если параметр Margin стоит не равный нулю, то в конечной модели у нас будут щели, поэтому выставляем Margin=0. В окне сцен рекомендуется поставить галочку в Next Layer, чтобы разрушенная модель была на новом слое. В итоге мы должны получить вот такие значения: Source Limit=50, Noise=0,25, Material=0, Margin=0,0 и самое главное - Grease Pencil.

Grease Pencil, Blender, Unity 5, Unity, Blender3d

Теперь жмем OK и дожидаемся конечного результата.

Blender Cell Fracture, Unity 5

На этом этапе мы получили разрушенную модель, теперь нам нужно экспортировать ее в Unity 5. Также, как и в первый раз, заходим в File > Export > FBX.
Открываем Unity, создаем новый проект или открываем старый. Импортируем модели в Юнити, перенося их в папку Assets.

Настраиваем сцену в Unity

Сейчас мы должны настроить нашу сцену. Выделяем нашу модель, в окне Inspector добавляем Box Collider и Rigidbody. Также создаем материал, называем как вам угодно, пусть будет GlassMat. На фото ниже отмечены те настройки, которые нам понадобятся для создания прозрачного стекла.

Unity Scene, Destruction in Unity

Прозрачность в Blender, Transparent Unity 5, Прозрачность Unity

Поменяем Rendering Mode на Transparent, Metallic=0,3, Smoothness=0,8. Нажмите на выбор цвета и поставьте такие значения: R=214, G=250, B=256, A=50. Последний параметр отвечает за прозрачность объекта, можете выставить больше или меньше, как вы считаете нужным. Должен получиться материал, похожий на этот:

Material Unity 5, Unity 5 materials, gamedev, unity

На сцене для примера мы должны поставить 3 одинаковых целых стекла, над ними 3 сферы, на каждой должен висеть Rigidbody и SphereCollider. Данные три сферы будут разбивать наши стекла. Можно, конечно, добавить что-то другое, но смысл будет один и тот же. Перейдем к разрушенной модели. Модель состоит из множества осколков, которые не имеют не коллайдеров, ни Rigidbody. Выделив все части, добавим RigidBody и MeshCollider в окне Inspector. Теперь все готово к тесту.

Скрипт разбивания в Unity 5

Код можно будет скачать с GoogleDrive здесь, изучите его сами, мы расскажем вам только то, как им нужно пользоваться.
Скрипт содержит несколько переменных: Broken Prefabs, Collision Sounds, Breaking Sounds, Apply Collision Forcem Apply Hp, Max Hp, Current Hp, Apply Explosion Force и т.д. В Broken Prefabs можно вставить несколько сломанных версий, выбираться будут рандомно. Со звуками также, можно выбрать несколько. Обязательно ставим Apply Collision Force, Collision Force=1, можно добавить жизни объекту и так далее. Очень интересными будут последние переменные: Explosion Force и Radius. Можно поэкспериментировать с ними. Вот результат, который должен у нас получиться:

Unity tutorial

Unity breaking tutorial, broken glass, devgam, gamedev, unity

Редакция Devgam

Благодарим наших читателей и подписчиков за проявленный интерес. Поделитесь постом в социальных сетях.

[Unity-25] Несколько способов заставить игровые объекты исчезать или скрываться в Unity

Эта статья модифицирована на основе блогов других блогеров.

Интеллектуальная рекомендация


Анализ протокола Zigbee: механизм маршрутизации

Функция метода Java setAccessible

В Java значение поля в классе сущности может быть получено посредством отражения. Если для метода setAccessible поля не задано значение true, проверка безопасности доступа будет выполняться при вызове.


Header Server Hot развертывание подробное подробное описание (по обновлению действий / на рамках деактивации)

Сцены: Общие серверы (такие какtomcat,jbossПодождите, после запуска мы также должны дополнительно изменить код Java или код JSP. В общем, это вступит в силу после изменения перезагрузки. Но если тепло.

Перейти вниз


  • Игровой объект
  • Поиск объекта, его компонентов
  • Работа с компонентами
  • Положение игрового объекта
  • Работа с физическими объектами
  • Коллайдеры и триггеры
  • Трассировка лучей
  • Контроллер персонажа
  • Ввод с клавиатуры и мыши
  • Камера
  • Да будет свет!

  • Регулярные события в Юнити
  • Нерегулярные события
  • События ввода и гуи
  • Физические и триггерные события
  • Еще есть события сервера и события отладки. Но о них здесь не написано!

Последний раз редактировалось: raingo (Вс Янв 28, 2018 4:51 pm), всего редактировалось 1 раз(а)

Вернуться к началу
Перейти вниз

автор raingo Вс Янв 28, 2018 4:02 pm

Игровой объект

Создание нового игрового объекта с именем MyGameObject. Созданный объект будет доступен по ссылке myObject.
Код: var myObject = new GameObject("MyGameObject");
Уничтожение объекта:
Код: Destroy(myObject);
Уничтожение объекта через минуту, после его создания:
Код: Destroy(myObject, 60);
Получение имени объекта:
Код: string name = myObject.name;
//или
Debug.Log(myObject); //используется встроенная функция ToString(), возвращает имя
Работа с transform (обязательный компонент всех объектов):
Код: Transform myTransform = myObject.transform;
Аналогично с тегом, слоем, состоянием:
Код: myObject.tag = "Player";
myObject.layer = 2;
gameObject.SetActive(false);
Создаем объект уже после загрузки сцены в реальном времени:
Код:
GameObject thePrefab; //оригинальный объект

void Start () GameObject instance = new GameObject(); //вновь созданный

instance = Instantiate(thePrefab, //копируем префаб в instance
transform.position, //в позицию префаба
transform.rotation) as GameObject; //с ротацией префаба
>

Последний раз редактировалось: raingo (Вс Янв 28, 2018 4:18 pm), всего редактировалось 6 раз(а)

Вернуться к началу
Перейти вниз

автор raingo Вс Янв 28, 2018 4:04 pm

Поиск игрового объекта


Поиск объекта по его имени:
Код: var myObject = GameObject.Find("MyObject");
Поиск объекта по тегу, возвращает единственный объект:
Код: var myObject = GameObject.FindWithTag("MyTag");
Возвращает список всех объектов с указанным тегом:
Код: var objectList = GameObject.FindGameObjectsWithTag("MyTag");
Проверка на наличие у объекта требуемого тега. Возвращает true, если у указанного объекта имеется тег MyTag:
Код: var isCompare = GameObject.CompareTag("MyTag");

Поиск компонента


Возвращает компонент component, привязанный к объекту GameObject, либо null, если объект не содержит данного компонента. Может использоваться, например, для доступа к другим скриптам, привязанным к объекту.
Код: var objectComponent = GameObject.GetComponent ();
Возвращает все имеющиеся у объекта компоненты типа componentType.
Код: var objectComponents = GameObject.GetComponents ();
Ищем первый дочерний или родительский компонент:
Код: var HingeJoint hinge = gameObject.GetComponentInChildren ();
var hinge = gameObject.GetComponentInParent ();
Аналогично с массивом:
Код: var HingeJoint[] hingeJoints = gameObject.GetComponentsInChildren ();
var hinge = gameObject.GetComponenstInParent ();

Поиск по типу


Поиск объекта по типу:
Код: var GUITexture texture = FindObjectOfType(GUITexture);
Возвращает все объекты по типу:
Код: var HingeJoint[] hinges = FindObjectsOfType(HingeJoint) as HingeJoint[];

Последний раз редактировалось: raingo (Вс Янв 28, 2018 4:18 pm), всего редактировалось 1 раз(а)

Вернуться к началу
Перейти вниз

автор raingo Вс Янв 28, 2018 4:10 pm

Работа с компонентами

Получение доступа к скрипту, который лежит на этом же объекте:
Код: test2 tt = GetComponent ;
tt.one = 5;

Если скрипт на другом объекте, сначала нужно найти этот объект:
Код: test1 tt = Find("nameObject").GetComponent ();
tt.one = 5;

Компонент Transform добывается проще, т.к. используется часто:
Код: Transform tratata = Find("nameObject").transform;

Привязать компонент myComponent к объекту GameObject и получить ссылку:
Код: myComponent component = gameObject.AddComponent("myComponent") as myComponent;
myComponent component = gameObject.AddComponent (); //равноценно

Отвязать:
Код: Destroy(GetComponent ());

В остальном работа с компонентами аналогична манипуляциями игровыми объектами.

Вернуться к началу
Перейти вниз

автор raingo Вс Янв 28, 2018 4:13 pm

Положение игрового объекта

Обязательный компонент transform игрового объекта содержит в себе данные о положении объекта в игровом мире. Рекомендуется использовать transform только если нет физического тела

Возвращает глобальные координаты объекта в игровом мире. Возвращаемая величина имеет тип Vector3, который представляет из себя список из 3 координат — x, y и z:
Код: Vector3 pos = GameObject.transform.position;
int x = pos.x;
Текущий угол поворота объекта, основанный на кватернионах. Возвращает объект типа Quaternion:
Код: Quaternion target = transform.rotation;
Масштабирование объекта возможно только в локальных координатах (что естественно):
Код: transform.localScale += new Vector3(0.1F, 0, 0);
Тоже самое, что и в случае глобальных координат, но с локальными. Локальные координаты рассчитываются относительно родительского объекта. В случае отсутствия родительского объекта локальные координаты совпадают с глобальными:
Код: transform.localPosition = new Vector3(0, 0, 0);
Текущий поворот объекта, основанный на кватернионах, но относительно родительского объекта:
Код: Quaternion target = transform.localRotation;
Поворот объекта в углах Эйлера. Метод также возвращает координаты в виде объекта Vector3:
Код: Vector3 eulerAngle = GameObject.transform.eulerAngles;
Vector3 localEulerAngle = GameObject.transform.localEulerAngles;

Перемещение


Переместить объект в точку 0, 10, 0 игрового мира:
Код: transform.position = Vector3(0, 10, 0);
Двигаем наш объект в указанном направлении со скоростью 1 юнит в секунду в заданной системе координат. Также принимает в качестве координат объект класса Vector3:
Код: transform.Translate(Vector3.up * Time.deltaTime);
transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
transform.Translate(Time.deltaTime, 0, 0, Camera.main.transform);

Ротация


Вращаем наш объект в указанную сторону со скоростью 1 градус в секунду. Принимает в качестве координат объект типа Vector3. Метод deltaTime объекта Time содержит время в секундах, затраченное на выполнение предыдущего кадра:
Код: GameObject.transform.Rotate(Vector3.left * Time.deltaTime);
Тоже самое, что и предыдущий пример, но вращение объекта относительно координат родителя:
Код: GameObject.transform.localRotate(Vector3.left * Time.deltaTime);
Сброс угла поворота объекта:
Код: GameObject.transform.rotation = Quaternion.identity;
GameObject.transform.localRotation = Quaternion.identity;
Поворачивает объект лицом к заданной точке (трансформу или вектору):
Код: Transform target;
transform.LookAt(target);
transform.LookAt(Vector3.zero);
Вращение вокруг оси, проходящей через точку:
Код: Vector3 point;
Vector3 axis = Vector3.up;
transform.RotateAround(point, axis, 20 * Time.deltaTime);

Вернуться к началу
Перейти вниз

автор raingo Вс Янв 28, 2018 4:17 pm

Работа с физическими объектами

Компонент rigidbody объекта GameObject хранит в себе его физические свойства. Прежде, чем использовать rigidbody, его необходимо добавить к игровому объекту.

Последний раз редактировалось: raingo (Вс Янв 28, 2018 4:47 pm), всего редактировалось 1 раз(а)

Вернуться к началу
Перейти вниз

автор raingo Вс Янв 28, 2018 4:19 pm

Трассировка лучей

Один из самых часто используемых в разработке на Unity3D объект, это Ray. Данный объект позволяет выпустить луч из указанной точки, в указанном направлении, и вернуть некоторые свойства объектов, которых он смог достичь.

Создаем объект класса RaycastHit, который содержит информацию об объекте, с которым столкнулся луч:
Код: RaycastHit hit;
Отправляем луч длиной в 50 юнитов из позиции rayPosition в направлении rayVector, и заносим объект, с которым столкнулся луч в переменную hit:
Код: Physics.Raycast(rayPosition, rayVector.forward, hit, 50);
Получаем дистанцию до объекта, с которым столкнулся луч. Дистанция не может быть больше, чем протяженность луча:
Код: float distance = hit.distance;
Иногда бывает необходимо получить имя объекта, с которым произошло столкновение луча. Наиболее простой способ это сделать:
Код: string objectName = hit.collider.gameObject.name;
Для получения тега объекта используем следующий способ:
Код: string Tag = hit.collider.tag;
Получение ссылки на "просвеченный" лучом объект
Код: GameObject Target;
Target = hit.collider.gameObject;

Вернуться к началу
Перейти вниз

автор raingo Вс Янв 28, 2018 4:23 pm

Регулярные события в Юнити

Каждый раз, когда создается пользовательский класс ему автоматически прописываются два события, в теле которых и ведется вся работа движком

пример вновь созданного кода:

Код: using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour

// Use this for initialization
void Start ()

// Update is called once per frame
void Update ()

Все эти события наследуются от MonoBehaviour. В Юнити множество разных дефолтных функций, отвечающих на самые разные запросы, от рендера, до ввода и гуи. По сути функции Awake() и Start() не являются регулярными, но я внес их сюда для более облегченного понимания порядка вызовов. Они логически связаны и при написании игры используются в единой структуре.

Данная функция вызывается до начала всех остальных скриптов. При первой загрузки сцены. Обычно используется для установки определенных параметров и инициализации переменных:
Код: Awake()
Вызывается один раз перед прорисовкой первого фрейма. До Update, но после выполнения Awake():
Код: Start()
FixedUpdate не зависит от Update(), и может вызываться как чаще него так и реже (обычно вызывается реже, если FPS достаточно высок). Это событие может быть вызвано несколько раз в кадре, если FPS низкий а может быть и вообще не вызвано между кадрами, если FPS высокий. Все физические расчеты движка и обновление происходит сразу после FixedUpdate(). При применении расчетов движения внутри FixedUpdate(), вам не нужно умножать ваше значение на Time.deltaTime. Это потому, что FixedUpdate() вызывается из таймера, независимого от частоты кадров. Все расчеты физики следует проводить именно в ней.
Код: FixedUpdate()
Вызывается один раз за кадр. Это основное событие для прорисовки кадра.
Код: Update()
Вызывается один раз в кадре, после завершения Update(). Любые расчеты, которые осуществляются в Update() будет завершены, при вызове LateUpdate(). Основным использованием LateUpdate() обычно является слежение за камерой. Если Вы осуществите движение Вашего персонажа в событии Update(), то движения камеры и расчётов её месторасположения можете вести в событии LateUpdate(). Это будет гарантировать, что персонаж прошел полностью перед камерой, и закрепил свое расположение.
Код: LateUpdate()

Рендеринг


Данная функция вызывается перед определением списка объектов, которые будут рендериться в кадре.
Код: OnPreCull()
Данная функция вызывается лишь один раз для каждой камеры при первом рендеринге игрового объекта.
Код: OnWillRenderObject()
Данная функция вызывается перед рендерингом сцены в кадре.
Код: OnPreRender()
Данная функция вызывается в момент рендеринга текущего игрового объекта в сцене.
Код: OnRenderObject()
Данная функция вызывается после рендеринга сцены в кадре.
Код: OnPostRender()

Читайте также: