Как удалить клон префаба в unity
Перейти к содержимому

Как удалить клон префаба в unity

  • автор:

Префабы (Prefabs)

Довольно удобно работать с GameObject в сцене, добавляя компоненты и изменяя их значения на нужные вам в инспекторе. Однако, это может создать ряд проблем в таких случаях, когда вы работаете над созданием NPC, объектом или предметом, который многократно встречается в сцене. Вы, конечно, можете просто скопировать эти объекты для создания дубликатов, но все они будут редактироваться независимо друг от друга. Обычно вы желаете, чтобы все экземпляры отдельно взятого объекта имели одинаковые значения свойств, чтобы при редактировании одного такого объекта в сцене вам не пришлось повторно вносить те же изменения и во все остальные копии.

К счастью, в Unity можно создавать префабы . Это особый тип ассетов, позволяющий хранить весь GameObject со всеми компонентами и значениями свойств. Префаб выступает в роли шаблона для создания экземпляров хранимого объекта в сцене. Любые изменения в префабе немедленно отражаются и на всех его экземплярах, при этом вы можете переопределять компоненты и настройки для каждого экземпляра в отдельности.

Важно: Когда вы перетаскиваете файловый ассет (например, меш) в сцену, будет создан новый экземпляр такого объекта и все такие экземпляры изменятся при изменении оригинального ассета. Однако, хоть его поведение и похоже, но ассет — это не префаб, так что у вас не выйдет добавить к нему компоненты или использовать любые другие описанные ниже свойства префабов.

Использование префабов

Вы можете создать префаб, выбрав Asset > Create Prefab и перетащив объект со сцены в “пустой” префаб, появившийся в проекте. После чего можно создавать экземпляры префаба просто перетаскивая его из окна Project на сцену. Имена объектов-экземпляров префабы, будут подсвечиваться синим в окне Hierarchy (имена обычных объектов имеют чёрный цвет).

Как уже упоминалось выше, изменения в префабе автоматически применятся ко всем её экземплярам, однако вы можете изменять и отдельные экземпляры. Это полезно например в случае, когда вы желаете создать несколько похожих NPC, но с внешними различиями, чтобы добавить реалистичности. Чтобы было чётко видно, что свойство в экземпляре префаба изменено, оно показывается в инспекторе жирным шрифтом (если к экземпляру префаба добавлен совершенно новый компонент, то все его свойства будут написаны жирным шрифтом).

Mesh Renderer на экземпляре префаба с переопределённым свойством Cast Shadows

Также, вы можете создавать экземпляры префабов из кода во время выполнения приложения. Прочтите страницу руководства про создание экземпляров префабов для дополнительной информации.

Редактирование префаба из его экземпляров

Инспектор экземпляра префаба содержит три кнопки, которые у обычных объектов отсутствуют: Select (Выделить), Revert (Отменить) и Apply (Применить).

Кнопка Select выделяет файл префаба, из которого был получен данный экземпляр. Это позволяет быстро найти и отредактировать оригинальный префаб, применяя изменения ко всем его экземплярам. Однако, вы также можете сохранить переопределённые свойства из экземпляра в сам оригинальный префаб с помощью кнопки Apply (изменённые значения положения и вращения трансформации не применяются по очевидным причинам). Это позволяет эффективно редактировать все экземпляры через любой из них, и это быстрый и правильный способ вносить глобальные изменения. Если вы экспериментируете с переопределением свойств, но в итоге решаете, что изначальные свойства (заданные в префабе) для вас предпочтительнее, то вы можете отменить все сделанные переопределения с помощью кнопки Revert, вернув экземпляр в изначальное состояние.

Почему Удаляется новый заспавненый объект?

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

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemSpawn : MonoBehaviour < public GameObject[] clothes; //объекты, кторые надо спавнить public Transform objspawn;// координата для спавна public float spawnrate;//частота спавна public float speed;// скорость движения объекта public int rand;//рандом для clothes public GameObject duplObj; //клон clothes public int i; void Start() < //спавн объектов через заданное время spawnrate InvokeRepeating("SpawnObj", 1f, spawnrate); >void Update() < i = rand; >void SpawnObj() < //сам спавн rand = Random.Range(0, clothes.Length); //тут создается клон объекта duplObj= Instantiate(clothes[i], objspawn.position, transform.rotation); >>

ItemMovement.cs, который прикреплен к объекту

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemMovement : MonoBehaviour < ItemSpawn itemSpawn; void Start() < itemSpawn = GameObject.Find("Main Camera").GetComponent();//для определения нахождения скрипта на объекте > private void FixedUpdate() < transform.Translate(itemSpawn.speed * Time.deltaTime, 0, 0);//движение объекта >//Здесь происходит уничтожение клона, если он соприкасается с объектом, у которого тег Destroy private void OnTriggerEnter2D(Collider2D collis) < if (collis.gameObject.tag == "Destroy") < Destroy(itemSpawn.duplObj); >> >
  • Вопрос задан более трёх лет назад
  • 132 просмотра

Как удалить клон префаба созданный в скрипте. Unity

Хочу что бы при стрельбе на сцене появлялся префаб выстрела, и через промежуток времени он исчез, но получается, как я понял, что я указал ссылку на префаб, и когда я создаю его в сцене он не создает сам префаб с ссылкой, а клонирует его, помогите исправить.Код который относится к снаряду, в методе Attack создал объект и через некоторое время его удаляю, но он не удаляется В иерархии видно что создался клон префаба

Отслеживать

user302909

задан 13 янв 2020 в 14:11

danil2283376 danil2283376

43 1 1 серебряный знак 10 10 бронзовых знаков

Код желательно приводить картинкой, а не скриншотом. Префаб к скрипту вы откуда цепляете, со сцены или с вкладки Project?

Как передать данные префаба из 1 класса в другой?

Задача. При нажатии на карту будет создаваться 3 д персонаж из префаба.

public class PickCardInfo : MonoBehaviour < public GameObject card3DPerson; // здесь храниться префаб который будет создаваться void OnMouseDown ()< // при клике нужно предать данные префаба во 2 класс Destroy (gameObject); >// Use this for initialization void Start () < >// Update is called once per frame void Update () < >> 

2 Класс он должен принимать данные из 1 класса и вносить их в массив. Потом массив будет создавать данные префабы.

public class SpawnPointController : MonoBehaviour < //массив для 4 точек спавна 3д моделей героев // сюда должны добавляться данные префаба с 1 класса public GameObject[] spawnPointArrey = new GameObject[4]; // Use this for initialization void Start () < >// Update is called once per frame void Update () < >> 

Отслеживать

задан 30 сен 2019 в 15:59

Hztrons World Hztrons World

1 3 3 бронзовых знака

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Если PickCardInfo и SpawnPointController на одном GameObject, то в PickCardInfo можно получать ссылку на SpawnPointController через gameObject.GetComponent() . Если нет, то нужна ссылка, как писал kitsoRik. Новые экземпляры префаба создаются так:

GameObject NewPerson = Instantiate(card3DPerson); gameObject.GetComponent().spawnPointArrey[n] = NewPerson; 

Отслеживать

ответ дан 30 сен 2019 в 20:10

6,906 3 3 золотых знака 7 7 серебряных знаков 25 25 бронзовых знаков

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *