Введение. В игровом дизайне все объекты, которые необходимо использовать, можно разместить в сцене с помощью редактора. Но часто невозможно заранее создать все необходимые объекты, такие как пули, созданные монстры и тому подобное. Они либо создаются в любое время в зависимости от действий игрока, либо в определенные моменты в зависимости от игрового процесса, и нет возможности заранее определить, когда они появятся.
Создание объектов динамически с помощью скриптов , то есть создание объектов во время игры, является базовым навыком.В данной статье будет подробно объяснен основной метод реализации этой функции
1. Сборные
Prefab — это шаблон объекта. При разработке игр объекты обычно задаются как prefab. Подробнее см. в этой статье: Начало работы с Unity
2. Создайте объекты
Для создания объектов с помощью префабов вам нужно использовать метод создания экземпляров Instantiate(). Он принимает ссылку на префаб в качестве шаблона, а возвращаемое значение всегда является ссылкой на вновь созданный объект. Если префаб передается как тип GameObject, возвращаемый результат также является типом GameObject.
В реальном использовании иногда необходимо указать положение, ориентацию и родительский объект вновь созданного объекта, поэтому метод Intantiate() также имеет несколько перегруженных форм, разница в том, что параметры разные. Здесь показаны три перегруженные формы
перегруженная форма |
параметр 1 |
параметр 2 |
параметр 3 |
параметр 4 |
Укажите только родительский объект |
сборный |
Тип Transform родительского объекта, null означает отсутствие родительского объекта, размещенного в корневом узле сцены. |
|
|
Укажите местоположение и ориентацию |
сборный |
Пространственное положение, мировая система координат, тип Vector3 |
Ориентация, тип кватерниона |
|
указать позицию, ориентацию и родителя |
сборный |
Пространственное положение, мировая система координат, тип Vector3 |
Ориентация, тип кватерниона |
Тип Transform родительского объекта, null означает отсутствие родительского объекта, размещенного в корневом узле сцены. |
Префабы также могут быть представлены компонентами. Поскольку компонент может представлять смонтированный компонент, если компонент в префабе используется в качестве шаблона, метод Instantiate по-прежнему будет создавать объект и возвращать компонент с тем же именем в новом объекте. Это сохраняет функциональность прежней, но немного не выполняет операции компонента.
Вот пример создания объекта скриптом
с помощью UnityEngine;
открытый класс TestInstantiate: MonoBehaviour
{
общедоступный префаб GameObject;//устанавливаем общедоступный для назначения в редакторе
пустое начало ()
{
GameObject objA=Instantiate(prefab,null);//Создаем объект в корневом узле сцены
GameObject objB=Instantiate(prefab,transform);//Создаем объект как подобъект объекта, где находится текущий скрипт
GameObject objC=Instantiate(prefab,new Vecrtor3(3,0,3),Quaternion.identity);//Создаем объект, определяем положение и ориентацию
}
}
Использование сценариев для создания объектов также используется, когда необходимо разместить точную графику.Ниже приведен пример использования сценариев для создания 10 объектов и размещения их в круге.
с помощью UnityEngine;
открытый класс TestInstantiate: MonoBehaviour
{
публичный префаб GameObject;
пустое начало ()
{
для (целое я = 0; я <10; я ++)
{
Vector3 pos=new Vector3(Mathf.Cos(i*(2*Mathf.PI)/10),0,Mathf.Sin(i*(2*Mathf.PI)/10);//использовал sin и cos в определении в системе координат ху
поз=поз*5;//радиус=5
Instantiate(prefab,pos,Quaternion.identity);
}
}
}
3. Создайте компоненты
Обычно используется метод GameObject.AddComponent(), следующий код сначала получает объект Cube, а затем добавляет к нему компонент Rigidbody
с помощью UnityEngine;
открытый класс TestInstantiate: MonoBehaviour
{
пустое начало ()
{
GameObject go=GameObject.Find("Куб");
go.AddComponent<Rigidbody>();
}
}
4. Разрушение объектов или компонентов
Объекты или компоненты могут быть уничтожены с помощью метода Destroy(), поэтому примеры здесь не будут расширяться.
Но здесь важно отметить: после выполнения операции Destroy объект не будет уничтожен сразу, а будет уничтожен в подходящее время позже. Это гарантирует, что в этом кадре работа объекта не вызовет ошибок.
В отдельных случаях, если требуется немедленное уничтожение, Unity предоставляет метод DestroyImmediate().
5. Регулярно создавайте и уничтожайте объекты
Отложенное создание объектов и отложенное уничтожение объектов — обычные требования в играх.
Отложенное создание обычно используется для ожидания окончания анимации и регулярного обновления монстров. Отложенное уничтожение объектов используется для того, чтобы пули и трупы исчезали через равные промежутки времени.
Задержки должны быть точно рассчитаны по времени, например, выполнение в секундах в будущем. Вот пример простого метода Invoke. Этот метод имеет два параметра, первый параметр — это имя метода, представленное в виде строки, а второй параметр представляет отложенное событие в секундах.
Метод Invoke может задерживать вызов метода, но требует, чтобы метод не имел параметров и возвращаемого значения.
В следующем примере метод Invoke используется для записи динамического эффекта, который генерирует объект каждые 0,5 секунды.
Использование UnityEngine;
открытый класс TestInvoke: MonoBehaviour
{
общедоступный префаб Gameobject;
целочисленный счетчик=0;
пустое начало ()
{
Вызов ("Создать префаб", 0.5f);
}
аннулировать CreatPfab()
{
Vector3 POs=new Vector3(Mathf.Cos(счетчик*(2*Mathf.PI)/10),0,Mathf.Sin(счетчик*(2*Mathf.PI)/10));
позиция*=5;
Instantiate(prefab,pos,Quaternion.identity);
счетчик++;
если(счетчик<10)
{
Вызов ("Создать префаб", 0.5f);
}
}
}
Отложенное уничтожение также может быть реализовано с помощью Invoke, но поскольку требования к отложенному уничтожению более требовательны, Unity добавляет функцию задержки в метод Destroy.Второй параметр Destroy используется для указания события отложенного уничтожения, например:
Уничтожить (куб, 0,5f);