unity3d
Prefabs
Поиск…
Синтаксис
- 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
);
}
}
Родительский сборник:
Детский сборник:
Сцена до и после старта: