Что такое коллайдер в юнити
Меш-коллайдер (Mesh Collider)
Mesh Collider использует меш ассет для создания под него коллайдера на основе этого меша. Это гораздо удобнее, чем использовать примитивы для определения столкновений сложных мешей. Меш коллайдеры, которые помечены как Convex могут взаимодействовать (сталкиваться) с другими меш коллайдерами.
Свойства
Свойство: | Функция: |
---|---|
Is Trigger | Если включён, то этот коллайдер будет игнорироваться физическим движком и использоваться для запуска событий. |
Material | Ссылка на физический материал, который определяет, как данный коллайдер взаимодействует с другими. |
Mesh | Ссылка на меш, используемый для столкновений. |
Convex | При включении, текущий меш коллайдер будет взаимодействовать с другими меш коллайдерами. Выпуклые (Convex) меш коллайдеры ограничены 255 треугольниками. |
Детали
The Mesh Collider builds its collision representation from the Mesh attached to the GameObject, and reads the properties of the attached Transform to set its position and scale correctly. The benefit of this is that the shape of the collider can be exactly the same as the shape of the visible mesh for the object, resulting in more precise and authentic collisions. However, this precision comes with a higher processing overhead than collisions involving primitive colliders (sphere, box, capsule) and so it is best to use Mesh Colliders sparingly.
Меши, служащие для расчёта столкновений, используют отсечение невидимых поверхностей. Если объект столкнётся с таким мешем визуально, то он также столкнётся с ним и физически.
Note that versions of Unity before 5.0 had a Smooth Sphere Collisions property for the Mesh Collider in order to improve interactions between meshes and spheres. This property is now obsolete since the smooth interaction is standard behaviour for the physics engine and there is no particular advantage in switching it off.
Коллайдеры (Colliders)
Collider components define the shape of an object for the purposes of physical collisions. A collider, which is invisible, need not be the exact same shape as the object’s mesh and in fact, a rough approximation is often more efficient and indistinguishable in gameplay.
The simplest (and least processor-intensive) colliders are the so-called primitive collider types. In 3D, these are the Box Collider, Sphere Collider and Capsule Collider. In 2D, you can use the Box Collider 2D and Circle Collider 2D. Any number of these can be added to a single object to create compound colliders.
With careful positioning and sizing, compound colliders can often approximate the shape of an object quite well while keeping a low processor overhead. Further flexibility can be gained by having additional colliders on child objects (eg, boxes can be rotated relative to the local axes of the parent object). When creating a compound collider like this, there should only be one Rigidbody component, placed on the root object in the hierarchy.
Однако существуют случаи, где даже составные коллайдеры недостаточно точны. В 3D вы можете использовать Mesh Colliders, чтобы создать коллайдер, идентичный по форме мешу объекта. В 2D Polygon Collider 2D сгенерирует форму примерно совпадающую с графикой спрайта. Не идеально, но вы можете изменить его форму до любого уровня детализации. Эти коллайдеры нагружают процессор сильнее, чем примитивные коллайдеры, так что используйте их экономно, чтобы сохранить высокую производительность. Также Mesh Collider не сможет сталкиваться с другими Mesh Collider (другими словами, при их контакте ничего не произойдёт). В некоторых случаях вы можете обойти это пометив Mesh Collider в инспекторе как Convex (выпуклый). Это создаст коллайдер формы “выпуклой оболочки”, который такой же, как и оригинальный меш, но с “заполненными” углублениями. Польза от этого в том, что выпуклый Mesh Collider может сталкиваться с другими Mesh Collider, так что вы сможете использовать эту функцию, когда у вас есть двигающийся персонаж с подходящей формой. Тем не менее хорошим общим правилом будет использование Mesh Collider для геометрии сцены, и имитировать приближённую к реальности форму для двигающихся объектов с помощью примитивных коллайдеров.
Для создания пола, стен и других неподвижных элементов сцены, к объектам без компонента Rigidbody можно добавлять коллайдеры. Они называются static (статичными) коллайдерами. Обычно вам не следует перемещать статичные коллайдеры изменяя положение их трансформации, т.к. это сильно повлияет на производительность физического движка. Коллайдеры на объекте, у которого есть Rigidbody, известны как динамичные коллайдеры. Статичные коллайдеры могут взаимодействовать с динамичными коллайдерами, но, т.к. у них нету Rigidbody, они не сдвинутся в ответ на коллизии (столкновения).
Страницы справки для различных типов коллайдеров, указанных выше, имеют дополнительную информацию об их свойствах и способах использования.
Физические материалы (Physics Materials)
Когда коллайдеры взаимодействуют, их поверхностям надо симулировать свойства материала, из которого они теоретически должны состоять. Например, слой льда будет более скользким, в то время как резиновый мяч будет предлагать больше трения и будет очень упругим. Хотя форма коллайдеров и не деформируется во время коллизий, их трение и упругость можно настроить используя физические материалы (Physics Materials). Настроить параметры так, как хочется, можно методом проб и ошибок, но, например, материал льда будет иметь нулевое (или очень маленькое) трение, а резиновый материал будет с большим показателем трения и почти идеальной упругостью. Для дополнительной информации по доступным параметрам, читайте страницы справки Physic Material и Physics Material 2D. Учтите, что, по историческим причинам, 3D ассет называется Physic Material, в то время как 2D эквивалент называется Physics Material 2D (с “s” после “Physic”).
Триггеры (Triggers)
Collision callbacks for scripts
When collisions occur, the physics engine calls functions with specific names on any scripts attached to the objects involved. You can place any code you like in these functions to respond to the collision event. For example, you might play a crash sound effect when a car bumps into an obstacle.
У обычных не триггерных коллизий есть ещё дополнительная деталь: как минимум один из вовлечённых в коллизию объектов должен обладать не кинематическим Rigidbody (т.е. IsKinematic должен быть выключен). Если оба объекта являются кинематическими, то тогда не будут вызываться функции, вроде OnCollisionEnter и т.д. С триггерными столкновениями это условие не применяется, так что и кинематические и не кинематические Rigidbody будут незамедлительно вызывать OnTriggerEnter при пересечении триггерного коллайдера.
Взаимодействия коллайдеров
Коллайдеры взаимодействуют друг с другом по разному, в зависимости от того, как настроены их компоненты Rigidbody. Тремя важными конфигурациями являются статичный коллайдер (Static Collider) (т.е. компонент Rigidbody отсутствует вообще), Rigidbody коллайдер (Rigidbody Collider), и кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider).
Статичный коллайдер (Static Collider)
Это игровой объект, у которого есть коллайдер, но нету Rigidbody. Статичные коллайдеры используются для геометрии уровней, которая всегда стоит на месте и совсем не двигается. Встречные Rigidbody объекты будут врезаться в статичный коллайдер, но его не сдвинут.
The physics engine assumes that static colliders never move or change and can make useful optimizations based on this assumption. Consequently, static colliders should not be disabled/enabled, moved or scaled during gameplay. If you do change a static collider then this will result in extra internal recomputation by the physics engine which causes a major drop in performance. Worse still, the changes can sometimes leave the collider in an undefined state that produces erroneous physics calculations. For example a raycast against an altered Static Collider could fail to detect it, or detect it at a random position in space. Furthermore, Rigidbodies that are hit by a moving static collider will not necessarily be “awoken” and the static collider will not apply any friction. For these reasons, only colliders that are Rigidbodies should be altered. If you want a collider object that is not affected by incoming rigidbodies but can still be moved from a script then you should attach a Kinematic Rigidbody component to it rather than no Rigidbody at all.
Rigidbody коллайдер (Rigidbody Collider)
Это игровой объект, к которому прикреплён коллайдер и нормальный не кинематический Rigidbody. Rigidbody коллайдеры полностью симулируются физическим движком и могут реагировать на коллизии и силы, приложенные из скрипта. Они могут сталкиваться с другими объектами (включая статичные коллайдеры) и являются самой распространённой конфигурацией коллайдера в играх, которые используют физику.
Кинематические Rigidbody коллайдеры (Kinematic Rigidbody Collider)
Это игровой объект, к которому прикреплён коллайдер и кинематический Rigidbody (т.е. свойство IsKinematic компонента Rigidbody включено). Изменяя компонент Transform, вы можете перемещать объект с кинематическим Rigidbody, но он не будет реагировать на коллизии и приложенные силы так же, как и не кинематические Rigidbody. Кинематические Rigidbody должны использоваться для коллайдеров, которые могут двигаться или периодически выключаться/включаться, иначе они будут вести себя как статичные коллайдеры. Примером этого является скользящая дверь, которая обычно является недвижимым физическим препятствием, но по надобности может открываться. В отличие от статичного коллайдера, движущийся кинематический Rigidbody будет применять трение к другим объектам и, в случае контакта, будет “будить” другие Rigidbody.
Даже когда они неподвижны, кинематические Rigidbody коллайдеры ведут себя иначе, в отличие от статичных коллайдеров. Например, если коллайдер настроен как триггер, то вам также понадобится добавить к нему Rigidbody, чтобы можно было в вашем скрипте принимать события триггера. Если вы не хотите, чтобы триггер падал под действием силы гравитации или подвергался влиянию физики, то тогда вы можете включить свойство IsKinematic.
A Rigidbody component can be switched between normal and kinematic behavior at any time using the IsKinematic property.
A common example of this is the “ragdoll” effect where a character normally moves under animation but is thrown physically by an explosion or a heavy collision. The character’s limbs can each be given their own Rigidbody component with IsKinematic enabled by default. The limbs will move normallly by animation until IsKinematic is switched off for all of them and they immediately behave as physics objects. At this point, a collision or explosion force will send the character flying with its limbs thrown in a convincing way.
Матрица действий коллизии
Начало работы с Unity: коллайдеры и UnityScript
Обнаружение столкновений в вашей игре является важным элементом как реализма, так и функциональности. На нашем уровне из последнего урока вы в настоящее время сможете ходить по деревьям и уходить с самого уровня, который не является ни полезным, ни реалистичным! Давайте исправим это с помощью коллайдеров.
Окончательный результат предварительного просмотра
Примечание: вы встретите аббревиатуру «RMB» на протяжении всей этой статьи. Я имею в виду нажатие «правой кнопки мыши».
Шаг 1: Представляем коллайдеры
Коллайдеры — это компоненты, встроенные в Unity, которые обеспечивают обнаружение столкновений с использованием их различных «ограничивающих рамок», зеленые линии которых показаны вокруг дерева на изображении ниже. Сетка-коллайдер, однако, не имеет никаких зеленых линий, окружающих изображение под ним, так как он использует сетку дерева, обведенную синим цветом.
При использовании коллайдеров столкновение обрабатывается для нас, при этом коллайдер вычисляет, какая часть ограничивающего прямоугольника была перехвачена первой, и контролирует его реакцию на столкнувшиеся объекты. Эти данные хранятся и предоставляются нам с помощью нескольких функций, что позволяет нам запускать более конкретное поведение, когда объекты входят, занимают и покидают ограничивающую рамку, если это необходимо. Мы рассмотрим некоторые из этих функций в этом руководстве.
Однако сейчас давайте воспользуемся несколькими коллайдерами, чтобы просто не дать нашему игроку уйти с края карты.
Шаг 2: Использование коллайдеров в качестве границ уровня
Создайте пустой GameObject, используя верхнее меню GameObject> Create Empty, и переименуйте его в «Границы». Убедитесь, что его положение в Инспекторе равно (0, 0, 0).
Дублируйте его, используя RMB> Duplicate или Ctrl + D и переименуйте его в «Bottom». Перетащите «Низ» на «Границы», чтобы сделать его дочерним объектом объекта «Границы».
С выбранным «Bottom» добавьте компонент Box Collider, используя верхнее меню, Component> Physics> Box Collider, и в инспекторе установите значения Position и Center Box Collider к значениям, показанным ниже:
Нажмите ось Y (зеленая) Гизмо сцены в верхнем правом углу окна сцены, чтобы перевести вид сцены в вид сверху и уменьшить масштаб, чтобы вы могли видеть весь свой уровень, как у меня ниже:
Дублируйте «bottom» три раза и переименуйте их в «Right», «Left» и «Top». Выберите каждый из них за раз и установите значения их положения и центра компонента Box Collider на значения, указанные ниже.
Теперь вы должны были окружить свой уровень со всех четырех сторон пустыми игровыми объектами, каждый из которых содержит компоненты Box Colliders, как показано ниже. Если вы сейчас запустите свою игру, вы обнаружите, что больше не можете упасть с карты.
Давайте теперь применим коллайдеры в другой ситуации …
Шаг 3: Хватит ходить по деревьям!
В настоящее время мы можем просто пройтись по деревьям на нашем уровне, что не слишком хорошо. Вот что мы собираемся сделать …
Мы создадим новый префаб с выбранным нами деревом, применим коллайдер и изменим его размер, чтобы он соответствовал стволу дерева, а затем поменяем дерево, которое мы использовали в инструменте Terrains ‘Place Trees’ на префаб с коллайдером. Довольно просто верно? Давайте начнем…
В окне проекта выберите дерево ольхи в «Terrain Assets / Trees Ambient-Occlusion /» и перетащите его в сцену; расположите его ближе к контроллеру от первого лица, чтобы вы могли легко и быстро перейти к нему.
С выбранным деревом в Иерархии добавьте капсульный коллайдер в качестве компонента через верхнее меню «Компонент> Физика> Капсульный коллайдер».
Появится диалоговое окно ниже, предупреждающее вас о том, что добавление этого компонента разорвет соединение с его исходным префабом. То есть, если вы измените исходное дерево ольхи, изменения не будут видны в этом экземпляре.
Для нас это не проблема, поэтому выберите «Добавить», чтобы подтвердить добавление компонента капсульного коллайдера.
Нажмите play и попробуйте пробежать по этому конкретному дереву, и вы обнаружите, что даже близко не можете подобраться к нему из-за размера капсульных коллайдеров «Bounding Box».
Не забудьте остановить свою игру! Не останавливайся! В противном случае ваши изменения будут отменены, когда игра остановлена!
Как мило с моей стороны, чтобы напомнить вам 🙂
Итак, у нас теперь есть Дерево, через которое наш пользователь не может пройти, однако мы все равно можем пройти через все другие деревья, которые были размещены с помощью инструмента Места деревьев Terrain. Давайте заменим их на дерево, к которому мы только что добавили коллайдер. Как мы это сделаем? С использованием префабов.
В окне проекта создайте новую папку и переименуйте ее в «Prefabs», а в ней создайте новый «Prefab» и переименуйте в «tree-prefab». Присвойте дерево с коллайдером префабу, выделив его в иерархии и перетащив на префаб. Наконец, удалите дерево из Иерархии.
Теперь у нас есть дерево с коллайдерами, настроенными и готовыми к использованию; все, что осталось сделать, это выбрать Terrain в Иерархии и в Инспекторе выбрать инструмент «Place Trees» (который мы использовали в предыдущем уроке), чтобы разместить деревья над ландшафтом.
Текущее дерево, размещаемое над картой, является деревом «Ольха»; выберите его и нажмите «Редактировать деревья …», чтобы открыть диалоговое окно «Редактировать дерево». Щелкните по кругу справа от выбранного дерева, в данном случае — «Ольха», и выберите древовидный префаб в появившемся диалоговом окне «Выбрать объект GameObject».
Все деревья теперь будут заменены на наше дерево с коллайдером. Чтобы закончить, выберите местность и в нижней части Инспектора убедитесь, что включено «Создание столкновений деревьев».
Теперь запустите игру снова, и вы должны столкнуться со всеми деревьями, которые вы поместили! Если вы разместили более одного типа деревьев, повторите процесс для других деревьев, которые у вас есть.
Шаг 4: Создание нашего сборного пикапа
Теперь мы собираемся начать разработку префаба для нашего пикапа, который будет разбросан по уровню для сбора игроком. Загрузите этот пакет Unity в папку Projects Asset и дважды щелкните его, чтобы распаковать его.
Прежде чем пользователь соберет звукосниматели, мы должны создать их на карте. Мы могли бы сделать это вручную, перетащив их из окна проекта на ландшафт. Тем не менее, было бы немного интереснее, если бы они случайно появлялись по карте в заранее определенных точках появления … пора начинать писать сценарии!
Шаг 5: Краткое введение в UnityScript
На этом этапе предыдущий опыт программирования будет полезен и, вероятно, будет означать, что этот раздел представляет собой краткое резюме. Для тех из вас, кто плохо знаком с программированием, я бы посоветовал проверить Nettuts + Javascript из серии Null, если вы хотите выйти за рамки основ Unity. Если есть интерес, я могу опубликовать более подробное руководство по написанию сценариев в Unity, дайте мне знать в комментариях …
А пока, сделайте глубокий вдох и давайте прямо сейчас погрузимся.
переменные
Если вы попытаетесь использовать имя переменной, уже используемой Unity, например, «transform», вы получите ошибку, поскольку имена переменных ДОЛЖНЫ быть уникальными.
Как показано выше, переменные не должны иметь значение, назначенное им сразу после объявления. Они могут быть инициализированы или им присвоено значение позже в более поздней части сценария.
Однако вы всегда должны определять тип данных для информации, хранящейся в переменной, когда она объявлена, чтобы компилятор знал, с каким типом данных он имеет дело, и сможет выполнять быстрее.
Некоторые примеры распространенных типов данных:
В этой статье, посвященной оптимизации производительности, вы можете увидеть некоторые статистические данные о производительности, полученной благодаря использованию типизации данных.
Пока что все вышеперечисленные переменные имеют префикс «public». Все «публичные» переменные будут доступны в качестве параметров в Инспекторе, когда выбран «Сценарий» или «GameObject», к которому прикреплен «Сценарий», а также будут доступны в других сценариях, в которых «Сценарий» присоединен как компонент.
Если вы не собираетесь изменять значение с помощью инспектора или хотите, чтобы оно не было доступно для других сценариев, добавьте к нему префикс «private».
Если вы хотите иметь глобальную переменную, вы можете использовать модификатор static, как показано ниже. Доступ к нему можно получить из любого другого сценария, используя имя сценария, за которым следует точка и, наконец, имя переменной. Это называется «точечный синтаксис» и демонстрируется в следующем сценарии.
функции
Функции определяют серию инструкций, которые могут вызываться повторно в вашем скрипте.
Как и переменные, они должны быть буквенно-цифровыми, но начинаться с заглавной буквы. Если вы попытаетесь использовать имя функции, уже используемое Unity, например «Update ()», вы получите ошибку, так как функция SIGNATURES должна быть уникальной.
Подобно соглашению с переменными, функции из более чем одного слова, такие как «демонстрационная функция», используют соглашение CamelCase с лидирующей заглавной буквой, что приводит к «DemoFunction». В некоторых случаях это не так, например, print (…).
Чтобы использовать или «вызывать» вашу функцию, достаточно просто ввести имя функции в вашем коде, за которым следует пара скобок «()».
Однако вы можете иметь несколько функций с одинаковым именем, но разными параметрами, как показано ниже («перегрузка» функции). Функции также могут иметь обязательные и дополнительные параметры, как показано ниже:
Вызов функции с параметрами — это просто вопрос ввода параметров в скобках для используемой функции, как показано выше.
Порядок выполнения функции события
Поскольку скрипт выполняется в Unity, есть несколько «функций событий», которые вызываются в определенном порядке. Вы можете использовать их для управления поведением вашей игры. Давайте посмотрим на наиболее популярные, в порядке исполнения, при запуске в Unity:
Функция события: «Пробуждение ()»
Функция Awake () всегда вызывается перед любыми функциями Start, а также сразу после создания префаба.
Функция события: «Старт ()»
Функция Start () вызывается перед первым обновлением фрейма, только если включен экземпляр скрипта.
Функция события: «Update ()»
Функция «Update ()» вызывается каждый кадр, в котором отображается игра, т.е. если ваша частота кадров составляет 30 кадров в секунду (кадров в секунду), то функция будет вызываться 30 раз в секунду. Вы должны поместить большую часть своего кода поведения в эту функцию, кроме всего, что связано с физикой. Стоит отметить, что частота кадров Unity Player может колебаться во время выполнения, в зависимости от оборудования, на котором он работает, и вычислительной мощности, необходимой для каждого кадра. Поэтому очень важно, чтобы ваш код в этой функции был максимально оптимизирован.
Функция события: ‘LateUpdate ()’
Функция «LateUpdate ()» вызывается один раз за кадр после завершения функции «Update ()». Все вычисления, выполняемые в Update (), будут завершены, когда начнется LateUpdate ().
Функция события: ‘FixedUpdate ()’
Функция FixedUpdate () вызывается на каждом физическом шаге; он будет синхронизирован с физическим движком Unity. Код в этой функции также должен быть максимально оптимизирован.
Функция обработчика событий: ‘OnApplicationQuit ()’
Функция OnApplicationQuit фактически определяется как обработчик событий; все обработчики событий начинаются с «Вкл». Он вызывается для всех игровых объектов при выходе из приложения. В редакторе он вызывается, когда пользователь останавливает режим воспроизведения. В веб-плеере он вызывается, когда веб-представление закрыто.
Вы можете найти больше информации о Порядке исполнения и Порядке обновления в Руководстве Unity.
Шаг 6: наш первый сценарий — порождение пикапа
Наконец пришло время, пришло время создать наш первый скрипт в Unity!
Создание скрипта PickupController
Прежде чем писать какие-либо сценарии, создайте новую папку в окне проекта и переименуйте ее в «Сценарии».
Создайте новый Script by RMB в папке Scripts и выберите «Create> JavaScript», затем используйте F2, чтобы переименовать скрипт в «PickupController».
Дважды щелкните скрипт, чтобы открыть его в редакторе по умолчанию Unity, который для тех, кто на ПК, — UniSciTe, а для тех, кто на OSX, — Unitron. Нам не нужна функция Update которая добавлена по умолчанию, поэтому удалите ее. Теперь мы готовы начать писать сценарии появления нашего пикапа.
Однако прежде чем мы начнем, нам нужно выбрать место, где мы хотели бы, чтобы наш пикап появлялся; мы сделаем это, используя пустой GameObject и получим положение его компонента Transform.
Добавление SpawnPoint
Используйте верхнее меню, чтобы добавить Empty GameObject, GameObject> Create Empty, и в Инспекторе установите его положение (0, 0, 0) и переименуйте его в «PickupSpawnPoints». Это будет родительский объект, который будет содержать нашу точку (ы) появления, чтобы помочь организовать нашу Иерархию.
При именовании сценариев или объектов GameObject убедитесь, что вы получаете ТОЧНО имена, как они есть в руководстве, поскольку они будут использоваться позже в наших сценариях и в противном случае будут возвращать различные ошибки.
С выбранной точкой появления GameObject используйте Transform Tools, чтобы переместить его перед игроком, как на скриншоте выше, и убедитесь, что он находится над местностью.
Чтобы наш скрипт PickupController мог получать объекты GameObject, которые являются точками SpawnPoints, мы будем использовать теги …
Пометка SpawnPoint
Unity поставляется с несколькими встроенными тегами, которые вы можете найти в раскрывающемся списке тегов в верхней части инспектора; Вы также можете добавить свой собственный, что мы будем делать сейчас.
Чтобы открыть диспетчер тегов, выберите «Добавить тег» в нижней части раскрывающегося списка «Теги» или в верхнем меню «Правка»> «Настройки проекта»> «Теги».
Чтобы добавить тег, просто раскройте список «Теги», щелкните следующий доступный элемент и начните вводить имя тега, который вы хотите добавить. Добавьте SpawnPoint в элемент 0, как показано ниже.
Теперь, когда мы добавили наш тег SpawnPoint, нам нужно перейти и применить его к нашей точке появления. Снова выберите точку появления в Иерархии и примените новый тег SpawnPoint из выпадающего меню. Легко.
Итак, наша точка появления теперь настроена, время начинать писать сценарии!
Сценарии нашего скрипта PickupController
Вернитесь к скрипту PickupController и добавьте следующий код:
Посмотрите на комментарии и посмотрите, имеет ли это смысл. У нас есть две переменные: одна общедоступная, которая может быть назначена через инспектор, и одна частная, которая назначена в функции Awake.
Функция Awake, если вы помните, вызывается во время загрузки скрипта; он извлекает наш Spawnpoint GameObject через свой тег и присваивает его переменной spawnPoint скрипта. Затем вызывается SpawnPickup ().
Функция SpawnPickup извлекает позицию и вращение точки появления, а затем создает экземпляр pickupPrefab в найденной позиции и вращении.
Новый клон нашего pickupPrefab возвращается Instantiate (…) и сохраняется как spawnedPickup, а затем становится дочерним для spawnPoint, назначая его родительское свойство компоненту Transform компонента spawnPoint. Это не обязательно, а просто чтобы поддерживать нашу Иерархию организованной.
Добавление нашего скрипта PickupController в качестве компонента
Добавление скрипта в качестве компонента GameObject невероятно просто и может быть выполнено любым из двух способов.
Во-первых, выберите GameObject, для которого вы хотите добавить скрипт в качестве Компонента; это может быть GameObject в Иерархии ИЛИ Prefab в Окне Проекта. Затем вы просто нажимаете и перетаскиваете скрипт, который хотите добавить в качестве компонента, в Инспектор и отпускаете его, и он будет добавлен для вас. Легко!
Второй способ — просто перетащить скрипт на имя GameObject / Prefab, в который вы хотите добавить его, либо в иерархии, либо в окне проекта. Вам решать, что использовать; Я использую оба.
Поэтому нам нужно добавить наш скрипт PickupController в качестве компонента GameObject PickupSpawnPoints — сделайте это, используя любой из вышеперечисленных методов. Затем сценарий должен появиться в Инспекторе при выборе игрового объекта PickupSpawnPoints, как показано ниже:
Если вы сейчас попробуете запустить игру, вы увидите ошибку в консоли в левом нижнем углу экрана, щелкните по ней, чтобы просмотреть ошибку более подробно.
Если вы прочитаете ошибку, это имеет смысл: мы не присвоили нашу переменную pickupPrefab, поэтому, когда сценарий пытается создать экземпляр переменной, нет ничего (нулевого) для создания экземпляра, и поэтому он выдает ошибку.
Чтобы назначить наш pickup-prefab переменной pickupPrefab с помощью Инспектора, есть два подхода. Первый — через диалоговое окно «Выбор GameObject», доступное, когда вы щелкаете по кружку справа от «None (игровой объект)», а второе — просто перетаскивая префаб в текст «None (игровой объект)».
Используйте один из описанных выше методов, чтобы назначить prefab pickup-переменной переменной pickupPrefab компонента PickupController в игровом объекте PickupSpawnPoints.
Если вы сейчас запустите игру, звукосниматель появится на месте spawnPoint — вы, однако, сможете пройти прямо через него!
Перед тем, как забрать звукосниматели, давайте сделаем их немного интереснее и сделаем так, чтобы несколько датчиков случайным образом появлялись в диапазоне точек появления … не волнуйтесь, это не так сложно и не так сложно, как кажется!
Шаг 7: Случайное появление нескольких пикапов
Наличие только одного пикапа в одной точке появления довольно просто и понятно, поэтому давайте изменим наш сценарий, чтобы поддерживать неограниченное количество точек появления и выборки в них случайным образом.
Настройка нашего скрипта PickupController
Удалите переменные, определенные в верхней части вашего скрипта, и замените их следующими: