Поиск…


Синтаксис

  • public static Object PrefabUtility.InstantiatePrefab (Object target);
  • public static Object AssetDatabase.LoadAssetAtPath (string assetPath, тип типа);
  • public static Object Object.Instantiate (Object original);
  • public static Object Resources.Load (строка пути);

Вступление

Prefabs - это тип актива, который позволяет хранить полный GameObject с его компонентами, свойствами, прикрепленными компонентами и сериализованными значениями свойств. Существует много сценариев, где это полезно, в том числе:

  • Дублирование объектов в сцене
  • Совместное использование общего объекта в нескольких сценах
  • Возможность модифицировать сборку один раз и иметь изменения применительно к нескольким объектам / сценам
  • Создание дублирующих объектов с незначительными изменениями, при этом общие элементы можно редактировать из одного базового сборника
  • Инициирование GameObjects во время выполнения

В Unity есть эмпирическое правило, в котором говорится, что «все должно быть Prefabs». Хотя это, вероятно, преувеличение, оно поощряет повторное использование кода и создание GameObjects многоразовым способом, который одновременно эффективен как с точки зрения памяти, так и с хорошим дизайном.

Создание сборных

Чтобы создать сборку, перетащите игровой объект из иерархии сцен в папку « Активы » или вложенную папку:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

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

После создания может быть удалена сборная сборка. В этом случае имя ранее связанного с ним игрового объекта становится красным:

введите описание изображения здесь

Инспектор по сборке

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

введите описание изображения здесь

против

введите описание изображения здесь

Жирные свойства означают, что их значения отличаются от значений prefab. Вы можете изменить любое свойство созданного экземпляра, не влияя на исходные значения prefab. Когда значение изменяется в экземпляре prefab, оно становится полужирным, и любые последующие изменения одного и того же значения в prefab не будут отображаться в измененном экземпляре.

Вы можете вернуться к исходным значениям prefab, нажав кнопку Revert , которая также будет иметь изменения значения, отраженные в экземпляре. Кроме того, чтобы вернуть индивидуальное значение, вы можете щелкнуть его правой кнопкой мыши и нажать « Восстановить значение» до «Prefab» . Чтобы вернуть компонент, щелкните его правой кнопкой мыши и нажмите « Вернуть в Prefab» .

Нажатие кнопки « Применить» перезаписывает значения свойств prefab с текущими значениями свойств игрового объекта. Нет кнопки «Отменить» или подтверждения, поэтому обращайтесь с этой кнопкой осторожно.

Кнопка выбора подчеркивает связанную сборку в структуре папок проекта.

Создание экземпляров

Существует два способа создания экземпляров: во время разработки или времени выполнения .

Время создания проекта

Создание экземпляров prefabs во время разработки полезно для визуального размещения нескольких экземпляров одного и того же объекта (например, размещение деревьев при разработке уровня вашей игры ).

  • Чтобы визуально создать экземпляр prefab, перетащите его из представления проекта в иерархию сцен.

    введите описание изображения здесь

  • Если вы пишете расширение редактора , вы также можете создать экземпляр prefab, программируя вызов PrefabUtility.InstantiatePrefab() :

    GameObject gameObject = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath("Assets/MainCamera.prefab", typeof(GameObject)));
    

Исполнение времени выполнения

Создание экземпляров prefabs во время выполнения полезно для создания экземпляров объекта в соответствии с некоторой логикой (например, размножение противника каждые 5 секунд ).

Чтобы создать экземпляр сборника, вам нужна ссылка на объект prefab. Это можно сделать, если в вашем MonoBehaviour (и установить его значение с помощью инспектора в редакторе Unity) можно MonoBehaviour public GameObject поле public GameObject :

public class SomeScript : MonoBehaviour {
   public GameObject prefab; 
}

Или, поместив prefab в папку Resource и используя Resources.Load :

GameObject prefab = Resources.Load("Assets/Resources/MainCamera");

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

GameObject gameObject = Instantiate<GameObject>(prefab, new Vector3(0,0,0), Quaternion.identity);

Примечание. В режиме исполнения термин Prefab не существует.

Вложенные сборные

В настоящее время в Unity недоступны вложенные сборники. Вы можете перетащить один prefab в другой и применить это, но любые изменения в дочернем сборнике не будут применены к вложенному.

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

using UnityEngine;

public class ParentPrefab : MonoBehaviour {

    [SerializeField] GameObject childPrefab;
    [SerializeField] Transform childPrefabPositionReference;

    // Use this for initialization
    void Start () {
        print("Hello, I'm a parent prefab!");
        Instantiate(
            childPrefab, 
            childPrefabPositionReference.position, 
            childPrefabPositionReference.rotation, 
            gameObject.transform
        );
    }
}

Родительский сборник:

Родительский сбор

Детский сборник:

Детский сбор

Сцена до и после старта:

Перед запуском введите описание изображения здесь



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow