Автор Will Goldstone Источник Unity Game
Скачать 7.66 Mb.
|
Кастинг луча В то время как мы можем обнаружить столкновения между коллайдером характера игрока и коллайдером, который соответствует дверному объекту, более соответствующий метод может быть должен проверить на то, когда характер игрока будет стоять перед дверью, мы ожидаем открываться, ив пределах определенного расстояния этой двери. Это может быть сделано, бросая луч вперед от передового направления игрока и ограничивая его длину. Это означает, что, приближаясь к двери, игрок не должен идти прямо до этого - или врезаться в расширенный коллайдер - для этого, чтобы быть обнаруженным. Это также гарантирует, что игрок не может приблизиться к двери, отворачивающейся от этого, и все еще открыть это - с кастингом луча, они должны стоять перед дверью, чтобы использовать это, которое имеет смысл. Вместе использование, кастинг луча сделан, где обнаружение столкновения просто слишком неточно, чтобы ответить правильно. Например, реакции, которые должны произойти с покадровым уровнем деталей, могут произойти слишком быстро для столкновения, чтобы иметь место. В этом случае мы должны преимущественно обнаружить, встретится ли столкновение, вероятно, а не столкновение непосредственно. Давайте смотреть на практический пример этой проблемы. Структура мисс В примере оружия в трехмерной игре стрелка кастинг луча используется, чтобы предсказать воздействие выстрела, когда оружие запущено. Из-за скорости фактической пули, моделируя курс полета заголовка пули к цели является очень трудным визуально представить в пути, который удовлетворил бы и имел бы смысл игроку. Это до основанной на структуре природы пути, которым предоставлены игры. Если Вы полагаете, что, когда реальное оружие запущено, оно берет крошечное количество времени, чтобы достигнуть его цели - и насколько наблюдатель обеспокоен, что оно, как могли говорить, случилось немедленно - мы можем предположить, что, отдавая более чем 25 структур нашей игры в секунду, пуля должна была бы достигнуть своей цели в пределах только нескольких структур. 89 В примере выше, пуля запущена от оружия. Чтобы сделать пулю реалистичной, это должно будет переместиться со скоростью 500 футов в секунду. Если норма структуры - 25 структур в секунду, то шаги пули в 20 футах за структуру. Проблема с этим - человек, приблизительно 2 фута в диаметре, что означает, что пуля будет очень вероятно скучать по врагам, показанным вина расстоянии в 25 футов, который был бы поражен. Это - то, где предсказание играет роль. Прогнозирующее обнаружение столкновения Вместо того, чтобы проверить на столкновение с фактическим объектом пули, мы узнаем, поразит ли запущенная пуля свою цель. Бросая луч отправляют от объекта оружия (таким образом использование его передового направления) на той же самой структуре, что игрок нажимает кнопку огня, мы можем немедленно проверить, какие объекты пересекают луч. Мы можем сделать это, потому что лучи немедленно оттянуты. Думайте о них как лазерный указатель - когда Вы включаете лазер, мы невидим, что свет продвигается, потому что это едет на скорости света - нам это просто появляется. Лучи работают таким же образом, так, чтобы всякий раз, когда игрок в основанной на луче игре стрельбы нажимает огонь, они потянули луч в направлении, которое они нацеливают. С этим лучом они могут восстановить информацию относительно коллайдера, который поражен. Кроме того, идентифицируя коллайдер, объект самой игры может быть обращен и подготовлен, чтобы вести себя соответственно. Даже подробная информация, такая как точка падения ракеты, может быть возвращена и использоваться, чтобы затронуть проистекающую реакцию, например, заставляя врага отскочить в специфическом направлении. 90 В нашем примере игры стрельбы мы вероятно призвали бы scripting, чтобы убить или физически отразить врага, коллайдер которого хиты луча, ив результате непосредственности лучей, мы можем сделать это на структуре после того, как луч сталкивается с, или пересекает вражеский коллайдер. Это дает эффект реального выстрела, потому что реакция немедленно зарегистрирована. Это также стоит отмечать, что стрельба в игры часто использует иначе невидимые лучи, чтобы отдать краткие видимые линии, чтобы помочь с целью и дать игроку визуальную обратную связь, ноне путает эти линии с бросками луча, потому что лучи просто используются как путь для предоставления линии. Добавление заставы Прежде, чем мы начнем использовать и обнаружение столкновения и кастинг луча, чтобы открыть дверь нашей заставы, мы должны будем ввести это сцене. В Главе 2 мы настраиваем состояния мультипликации для модели, и это будут те государства, к которым мы будем обращаться, когда мы напишем сценарий позже в главе. Чтобы начать, тяните модель заставы от Проектной группы до представления Сцены и понизьте это где-нибудь-медведь в памяти, Вы не можете поместить это, когда Вы drag and drop (перетащили и опустили это сделано, как только Вы понизили модель (то есть, отпустили от мыши. 91 Как только застава находится в Сцене, Вы заметите, что ее имя также появилось в группе Иерархии и что это автоматически стало отобранным. Теперь Вы готовы поместить и измерить это Расположение Поскольку Ваш проект ландшафта от Главы 2 может быть различным к месторождению, выбрать инструмент Transform (преобразовать) и поместить Вашу заставу в зону свободной торговли земли при перемещении ручек оси в сцене. Будьте осторожны, когда использование оси обращается для того, чтобы поместить. Перемещение белого квадрата, где ручки сходятся, приспособит все три топора сразу - не кое-что, что Выбудете хотеть использовать когда в перспективном способе, так гарантируйте, что Вытянете ручки индивидуально, держа Ваш курсор за пределами белого квадрата. 92 Я поместил свою заставу в (500, 30.8, 505), но Вы, возможно, должны повторно поместить свой объект вручную. Помните, что, как только Вы поместили использование ручек оси в окно Scene, Вы можете войти в определенные ценности в ценности Позиции компонента Transform преобразовать) в Инспекторе Вычисление Поскольку мы работаем с двумя применениями - применение моделирования, наш актив заставы был создан в и Unity непосредственно, масштаб импортированного актива не будет соответствовать единицам метра в Unity и будет нуждаться в расширении или вниз. В то время как мы можем настроить ценности Масштаба в Инспекторе, это лучше везде, где возможный, чтобы настроить Ваш масштаб при использовании урегулирования Коэффициента пропорциональности на оригинальном активе. Выберите модель заставы в папке Заставы в Проектной группе. Теперь в Инспекторе, Выбудете видеть компонент под названием FBXImporter. У этого компонента есть параметры настройки импорта, доступные, который затронет любые случаи модели, которую Вы помещаете в Сцену. Здесь Вы должны установить ценность Коэффициента пропорциональности от 1 до 2. Это делает модель заставы достаточно большой для нашего Диспетчера Характера, чтобы соответствовать через заслонку рабочего окна и создание этого реалистично размерной комнате, как только мы проникаем внутрь. Коллайдеры и маркировка двери Чтобы открыть дверь, мы должны идентифицировать это как отдельный объект, когда с этим сталкивается игрок - это может быть сделано, потому что у объекта есть компонент коллайдера, и через это мы можем проверить объект на определенный признак. Расширьте объект 93 родителя заставы, нажимая на темно-серую стрелку налево от ее имени в группе Иерархии. Вы должны теперь видеть список всех детских объектов ниже этого. Выберите объект, названный дверью и затем с Вашим курсором мыши по окну Scene, нажмите F на клавиатуре, чтобы сосредоточить Ваш взгляд относительно этого. Вы должны теперь видеть дверь в окне Scene, ив результате отбора объекта, Вы должны также видеть его компоненты, перечисленные в группе Инспектора. Вы должны заметить, что один из компонентов - Коллайдер Петли. Это - детальный коллайдер, назначенный на все петли, найденные на различных детях модели, когда Вы выбираете, Производят Коллайдеры, поскольку мы сделали для актива заставы в Главе 2. Коллайдер петли назначен на каждый детский элемент, поскольку Unity не знает, сколько деталей будет присутствовать в любой данной модели, которую Вы могли хотеть импортировать. В результате это не выполняет своих обязательств к назначению коллайдеров петли для каждой части, поскольку они будут естественно соответствовать к форме петли, они сталкиваются. Поскольку наша дверь - просто форма куба, мы должны заменить этот коллайдер петли более простыми более эффективным коллайдером коробки. От главного меню, пойдите в Компонент | Физика | Коллайдер Коробки Вы тогда получите два, вызывает. Во-первых, Вам скажут, что добавление нового компонента заставит этот объект терять свою связь с родительским объектом в Проектной группе. Это окно диалога, названный Проигрывающий Prefab, просто означает, что Ваша копия в Сцене больше не будет соответствовать 94 оригинальному активу, ив результате любые изменения, произведенные в активе в Проектной группе вне будут отражены в копии в Сцене. Просто нажмите на кнопку Add, чтобы подтвердить, что это - то, что Вы хотите сделать. Это случится всякий раз, когда Вы начинаете настраивать свои импортированные модели в Unity, и это - ничто, чтобы волноваться о. Это - то, потому что, вообще, Вы должны будете добавить компоненты к модели, которая является, почему Unity дает Вам возможность создать Ваши собственные prefab. Во-вторых, поскольку объекту уже назначали коллайдер на это, Выбудете побуждены, желаете ли Вы Добавить, Заменить, или Отменить этот коллайдер к Вашему объекту. Вообще, Выбудете использовать единственный коллайдер за объект, поскольку это работает лучше для двигателя физики в Unity. Это - то, почему Unity спрашивает, хотели ли бы Вы Добавить или Заменить вместо того, чтобы принять дополнение коллайдеров. Поскольку мы не имеем никакой дальнейшей потребности в коллайдере петли, выбираем, Заменяют Выбудете теперь видеть зеленую схему вокруг двери, представляющей компонент Коллайдера Коробки, который Вы добавили. 95 Коллайдер коробки - пример Примитивного Коллайдера, так называемого, поскольку это - один из нескольких масштабируемых примитивных коллайдеров формы во включающей Unity Коробке, Сфере, Капсуле, и Колесе - которые предопределили формы коллайдера, ив, все примитивные коллайдеры показывают с этой зеленой схемой. Вы, возможно, заметили это, рассматривая коллайдер диспетчера характера, который является технически краткой формой коллайдера, и как таковой также показывает в зеленом. Наконец, мы должны пометить дверной объект, поскольку мы должны будем обратиться к этому объекту в нашем scripting позже. С дверным детским объектом, все еще отобранным, нажмите на признак, опускаются наверху группы Инспектора, и выбирают, Добавляет Признак. В Менеджере Признака, который заменяет Ваше текущее представление Инспектора, добавьте, что признак outpostDBecause добавляющие признаки является двумя процессами шага, Вы должны будете повторно выбрать дверной детский объект в группе Иерархии, и выбрать Ваш недавно добавленный признак outpostDoor из Признака опускаются меню, чтобы закончить добавлять признак. 96 Выведение из строя автоматической мультипликации По умолчанию, Unity предполагает, что все оживляемые объекты, введенные сцене должны будут играться автоматически. Хотя это - то, почему мы создаем праздную мультипликацию - в котором наш актив ничего не делает разрешение Unity играть автоматически будет часто заставлять оживляемые объекты казаться структура в одну из их намеченных мультипликаций. Чтобы исправить эту проблему, мы просто отсеиваем Игру Автоматически checkbox в Инспекторе для родительского объекта нашей модели. Обычно, мы не должны были бы делать это, если бы наш актив, постоянно был просто закрепленной петлей мультипликацией играя в мире игры. Например, вздымающийся флаг или вращающаяся лампа маяка, номы нуждаемся в нашей заставе, чтобы не оживить, пока игрок не достигает двери, таким образом мы избегаем автоматически играть любую мультипликацию. Чтобы сделать это, повторно выберите родительский объект, названный заставой в группе Иерархии, ив компоненте Мультипликации в группе Инспектора, отсейте Игру Автоматически Групповое представление Инспектора объекта заставы должно теперь быть похожим наследующий скриншот: Отметьте, что я расширил параметр Мультипликаций здесь, я в компоненте Мультипликации, чтобы рассмотреть мультипликацию сообщаю, что я в настоящее время обращался к этому объекту. 97 Объект заставы теперь готов взаимодействоваться нашим характером игрока, таким образом мы должны будем начать scripting, чтобы обнаружить столкновения с нашей недавно теговой дверью, используя или обнаружение столкновения или луч, бросая как обрисовано в общих чертах выше. Открытие заставы В этой секции мы будем смотреть на два отличающихся подхода для того, чтобы вызвать мультипликацию, дающую Вам краткий обзор двух методов, которые оба станут полезными во многих других ситуациях развития игры. В первом подходе мы будем использовать обнаружение столкновения решающее понятие, чтобы схватиться стем, поскольку Вы начинаете воздействовать на игры в Unity. Во втором подходе мы осуществим простой бросок луча вперед от игрока. Приблизьтесь к обнаружению С 1 столкновением Чтобы начать писать сценарий, который вызовет мультипликацию дверного проема и таким образом предоставит доступ к заставе, мы должны рассмотреть который объект написать сценарий для. В развитии игры часто более эффективно написать единственный сценарий для объекта, который будет взаимодействовать со многими другими объектами, вместо того, чтобы писать много отдельных сценариев, которые проверяют на единственный объект. С этим в памяти, при письме сценариев для игры, таких как это, мы напишем сценарий, который будет применен к характеру игрока, чтобы проверить на столкновения со многими объектами в нашей окружающей среде, а не сценарий, сделанный для каждого объекта, с которым может взаимодействовать игрок, который проверяет на игрока. Создание новых активов Прежде, чем мы введем любой новый вид актива в наш проект, это - хорошая практика, чтобы создать папку, в которой мы будем держать активы того типа. В Проектной группе, нажмите на кнопку Create, и выберите Папку из опускаться меню, которое появляется. Переименуйте эти Сценарии папки, выбирая это и нажимая Возвращение (Mac) или нажимая F2 (PC). Затем, создайте новый файл JavaScript в пределах этой папки просто, оставляя отобранную папку Сценариев и нажимая на кнопку Create Проектной группы снова, на сей раз выбирая JavaScript. Выбирая папку, Вы хотите, чтобы недавно созданный актив был в том, прежде, чем Вы создадите их, Вы не должны будете создать и затем переместить меня Ваш актив, поскольку новый актив будет сделан в пределах отобранной папки. 98 Переименуйте недавно созданный сценарий от default-NewBehaviourScript-to PlayerCollisions. У файлов JavaScript есть расширение файла, но группа Проекта Unity скрывает расширения файла, таким образом нет никакой потребности попытаться добавить это, переименовывая Ваши активы. Вы можете также определить тип файла сценария, смотря на его изображение в Проектная группа. У файлов JavaScript есть 'JS', написанный на них, C# файлы просто имейте 'C#', и у файлов Boo есть изображение призрака Pacman, миленького информативная игра слов от парней в Технологиях Unity! Scripting для обнаружения столкновения характера Чтобы начать редактировать сценарий, щелкните два раза на его изображении в Проектной группе, чтобы начать это в редакторе сценария для Вашей платформы на Mac, или Uniscite на PC. Работа с OnControllerColliderHit По умолчанию, все новые JavaScripts включают Update () function, и это - то, почему Вы найдете, что он представляет, когда Вы открываете сценарий впервые. Давайте начнем, объявляя variables, которые мы можем использовать всюду по сценарию. Наш сценарий начинается с определения четырех variables, общественных variables участника и двухчастных. Их цели следующие doorIsOpen: частный истинный/ложный (булевый) Variables типа, действующий как выключатель для сценария, чтобы проверить, открыта ли дверь в настоящее время. doorTimer: частный (помещенный в десятичное число) Variables числа с плавающей запятой, который используется как таймер так, чтобы, как только наша дверь была открыта, сценарий, может посчитать определенное количество времени прежде закрывающимся автоматически дверь. currentDoor: частный GameObject хранение Variables имел обыкновение хранить определенную в настоящее время открываемую дверь. Если Вы желаете добавить больше чем одну заставу к игре позднее, тогда это гарантирует, что открытие одной из дверей не открывает их всех, которых это делает, помня новый дверной хит. doorOpenTime: с плавающей запятой (потенциально десятичный) числовой общественный Variables участника, который будет использоваться, чтобы позволить нам устанавливать количество времени, мы желаем, чтобы дверь осталась открытой в Инспекторе 99 doorOpenSound/doorShutSound: Два общественных variables участника типа данных AudioClip, для того, чтобы позволить звуковую скрепку drag and drop (перетащили и опустили) назначение в группе Инспектора. Определите variables выше при письме следующего наверху сценария PlayerCollisions, который Вы редактируете private var doorIsOpen : boolean = false; private var doorTimer : float = 0.0,-private var currentDoor : GameObject; var doorOpenTime : float = 3.0,-var doorOpenSound : AudioClip; var doorShutSound : Затем, мы оставим Update () function кратко, в то время как мы устанавливаем Functions обнаружения столкновения непосредственно. Спустите две линии от function Update(){ И напишите в следующем Functions: function OnControllerColliderHit(hit : ControllerColliderHit){ Это устанавливает новый Functions по имени OnControllerColliderHit. Этот Functions обнаружения столкновения - определенно для использования с характерами игрока такой как нашим, которые используют компонент CharacterController. Его единственный хит параметра - Variables, который хранит информацию на любом столкновении, которое происходит. Обращаясь к Variables хита, мы можем подвергнуть сомнению информацию относительно столкновения, включая - для стартеров - определенная игра возражает, что наш игрок столкнулся с. Мы сделаем это, добавляя если утверждение нашему Functions. Так в пределах скоб Functions, добавьте следующий если утверждение function OnControllerColliderHit(hit: ControllerColliderHit){ if(hit.gameObject.tag == "outpostDoor" && doorIsOpen == false){ } } 100 oor, как показано в следующем скриншоте: В этом, если утверждение, мы проверяем два условия, во-первых который объект мы поражаем, помечен с признаком outpostDoor и во-вторых что Variables doorOpen в настоящее время устанавливается в ложный. Помните здесь, что два равняется символам (==), используются как сравнительное, и два символа амперсанда (&&) просто говорят 'и также. Исход означает, что, если мы поражаем коллайдер двери, который мы пометили и если мы уже не открыли дверь, тогда это может выполнить ряд инструкций. Мы использовали точечный синтаксис, чтобы обратиться к объекту, с которым мы проверяем на столкновения, сужая от хита (наша информация хранящего Variables на столкновениях) к gameObject объектный хит) к признаку на том объекте. Если это, если утверждение действительно, то мы должны выполнить ряд инструкций открыть дверь. Это вовлечет игру звука, игра одной из мультипликации пристегивается модель, и урегулирование нашей логической переменной doorOpen к истинному. Поскольку мы должны вызвать многократные инструкции - и, возможно, быть должны вызвать эти инструкции в результате различного условия позже, когда мы осуществим подход кастинга луча - мы разместим их в наш собственный Functions под названием Открытый. Мы напишем этот Functions коротко, но сначала, мы вызовем функцию в, если утверждение мы будем иметь, добавляя Таким образом Ваш полный Functions столкновения должен теперь быть похожим на это function OnControllerColliderHit(hit: ControllerColliderHit){ if(hit.gameObject.tag == "outpostDoor" && doorIsOpen == false){ OpenDoor(); } Письмо таможенных functions Хранение наборов инструкций, которые Вы можете желать вызвать в любое время, должно быть сделано при письме Ваших собственных 101 functions. Вместо того, чтобы иметь необходимость выписать ряд инструкций или "команд" много разв пределах сценария, сочиняя Ваши собственные functions, содержащие инструкции, означает, что Вы можете просто вызвать ту функцию в любое время, чтобы управлять тем набором инструкций снова. Это также делает ошибки прослеживания в известном о коде как Отладка много более простого, поскольку есть меньше мест, чтобы проверить на ошибки. В нашем Functions обнаружения столкновения мы написали звонок в Functions под названием Открытый. Скобки после Открытый используются, чтобы сохранить параметры, которые мы можем желать послать в использование Functions скобкам Functions, Вы можете заставить дополнительное поведение проходить к инструкциям в Functions. Мы будем смотреть на это в большей глубине позже в этой главе под Эффективностью Functions заголовка. Наши скобки пусты здесь, поскольку мы не желаем передавать любое поведение к Functions все же. Объявление Functions Чтобы написать Functions, мы должны звонить, мы просто начинаем при письме function OpenDoor(){ Промежуточный скобы Functions, очень таким же образом как инструкции, если утверждение, мы помещаем какие-нибудь инструкции, которые будут выполнены, когда эта функция вызвана. Игра аудио Наша первая инструкция состоит в том, чтобы играть звуковую скрепку, назначенную на Variables, названный doorOpenSound. Чтобы сделать это, добавьте следующую линию к своему Functions, помещая это в пределах вьющихся скоб после и прежде Чтобы убедиться, это должно быть похожим на это function OpenDoor(){ audio.PlayOneShot(doorOpenSound); Здесь мы обращаемся к Звуковому Исходному компоненту, приложенному к объекту игры, что к этому сценарию относятся (наш объект характера игрока, Первый Диспетчер Человека, и как таковой, мы должны будем гарантировать позже, что нам приложили этот компонент иначе, эта команда вызовет ошибку. 102 Адресация к звуковому источнику, использующему термин аудио, предоставляет нам доступ к четырем functions, Игра (), Остановка (), Пауза () , и PlayOneShot (). Мы используем PlayOneShot, потому что это - лучший способ играть единственный случай звука, в противоположность игре звука и затем переключению скрепок, которые были бы более соответствующими для непрерывной музыки чем звуковые эффекты. В скобках команды PlayOneShot мы передаем Variables doorOpenSound, который вызовет любой звуковой файл, поручен на тот Variables в Инспекторе играть. Мы загрузим и назначим этому и скрепке для того, чтобы закрыть дверь после письма сценария. Проверка дверного статуса Одно условие нашего, если утверждение в пределах нашего Functions обнаружения столкновения было то, что наша логическая переменная doorIsOpen должна быть установлена в ложный. В результате вторая команда в нашем Открытом () Functions должна установить этот Variables в истинный. Это - то, потому что характер игрока может столкнуться с дверью несколько раз, врезаясь в это, и без этого булевого, они могли потенциально вызвать Открытое () Functions много раз, вызывая звуки мультипликацию возвратиться и перезапустить с каждым столкновением. Добавляя в Variables, который когда ложный позволяет Открытому () Functions работать и затем отвергает его, устанавливая doorIsOpen Variables в истинный немедленно, дальнейшие столкновения не будут повторно вызывать Открытое () Functions. Добавьте линию doorOpen = к Вашему Открытому () Functions теперь, помещая это между вьющимися скобами после предыдущей команды Вы только добавили. Игра мультипликации В Главе 2 мы импортировали пакет актива заставы и смотрели на различные параметры настройки на активе прежде, чем ввести это игре в этой главе. Одной из задач, выполненных в процессе импорта, было настраивание скрепок мультипликации, используя Инспектора. Выбирая актив в Проектной группе, мы определили в Инспекторе, что это покажет три скрепки idle (ничто' не сообщает, dooropen doorshut В нашем открытом () Functions, мы призовем названную скрепку, используя Последовательность текста обращаться к этому. Однако, сначала мы должны будем сообщить, какой объект в нашей сцене 103 содержит мультипликацию, которую мы желаем играть. Поскольку сценарий, который мы пишем, быть присоединен к игроку, мы должны обратиться к другому объекту прежде, чем обратиться к компоненту мультипликации. Мы делаем это, сообщая линию var myOutpost : GameObject = Здесь мы объявляем новый Variables названным myOutpost, заставляя его тип быть GameObject и затем выбирая объект игры с заставой названия при использовании GameObject. Найти. Команда Находки выбирает объект в текущей сцене ее именем в Иерархии и может использоваться как альтернатива использованию признаков. Теперь, когда у насесть, представляющий наш объект игры заставы, мы можем использовать этот Variables с точечным синтаксисом, чтобы назвать мультипликацию приложенной к нему, сообщая Это просто находит компонент мультипликации приложенным к объекту заставы и играет мультипликацию, названную dooropen. Игра () команду можно передать любая последовательность текстовых характеров, но это будет только работать, если скрепки мультипликации были настроены на рассматриваемом объекте. Ваше законченное Открытое () таможенный Functions должно теперь быть похожим на это function OpenDoor(){ audio.PlayOneShot(doorOpenSound); doorIsOpen = true; var myOutpost : GameObject = GameObject.Find("outpost"); myOutpost.animation.Play("dooropen"); Изменение процедуры Теперь, когда мы создали ряд инструкций, которые откроют дверь, как мы закроем это, как только это открыто Чтобы помочь пригодности для игры, мы не будем вынуждать игрока активно закрыть дверь, но вместо этого установить некоторый код, который заставит это закрываться после определенного периода времени. Это - то, где наш doorTimer Variables играет роль. Мы начнем рассчитывать, как только дверь становится открытой, добавляя ценность времени к этому Variables, и затем проверять, когда этот Variables достиг специфической ценности при использовании если утверждение. Поскольку мы будем иметь дело со временем, мы должны использовать Functions, который будет постоянно обновлять, такие как Update () 104 function, у нас было ожидание нас, когда мы создали сценарий ранее. Создайте некоторые пустые линии в Update () function, перемещая его заключительную вьющуюся скобу несколько линий вниз. Во-первых, мы должны проверить, была ли дверь открыта, поскольку нет никакого смысла в увеличивании нашего Variables таймера, если дверь не в настоящее время открыта. Напишите в следующем, если утверждение, чтобы увеличить Variables таймера со временем, если doorIsOpen Variables установлен в истинный if(doorIsOpen){ doorTimer += Time.deltaTime; } Здесь мы проверяем, открыта ли дверь - это - Variables, который по умолчанию установлен в ложный, и только станет верным в результате столкновения между объектом игрока и дверью. Если doorIsOpen Variables верен, то мы добавляем ценность Time (Времени. deltaTime к doorTimer Variables. Примите во внимание, что просто при письме имени переменной, поскольку мы прикончили наш, если условие утверждения - тоже самое как пишущий doorIsOpen == истинный - Classes Time (Времени, который будет работать независимый от нормы структуры игры. Это важно, потому что Вашей игрой можно управлять на переменных аппаратных средствах когда развернуто, и было бы странным, если бы время, замедленное на более медленных компьютерах и, было быстрее, когда лучшие компьютеры управляли этим. В результате, добавляя время, мы можем использовать Time.deltaTime , чтобы вычислить время, потраченное, чтобы закончить последнюю структуру и с этой информацией, мы можем автоматически исправить подсчет в реальном времени. Затем, мы должны проверить, достигли наш Variables таймера, doorTimer, определенной ценности, что означает, что определенное количество времени прошло. Мы сделаем это вложением, если утверждение в том, который мы только добавили - это будет означать, что, если утверждение мы собираемся добавить, будет только проверен, если doorIsOpen, если условие действительно. Добавьте следующий код ниже времени, увеличивая линию в существующем если утверждение if(doorTimer > doorOpenTime){ shutDoor(); doorTimer = 0.0,} 105 Это дополнение к нашему коду будет постоянно проверяться, как только doorIsOpen Variables становится верными ждет, пока ценность doorTimer не превышает ценность doorOpenTime Variables, который, потому что мы используем Time.deltaTime как возрастающую ценность, будет означать, что три секунды в реальном времени прошли. Это конечно, если Вы не изменяете ценность этого Variables от его неплатежа 3 в Инспекторе Как только doorTimer превысил ценность 3, функция, названная shutDoor () , вызвана, и doorTimer Variables перезагружен к нолю так, чтобы это могло использоваться снова в следующий раз, когда дверь вызвана. Если это не будет включено, то doorTimer застрянет выше ценности 3, и как только дверь была открыта, это закроется в результате. Ваш законченный Update () function должен теперь быть похожим на это function Update(){ if(doorIsOpen){ doorTimer += Time.deltaTime; if(doorTimer > 3){ shutDoor(); doorTimer = 0.0; } Теперь, добавьте следующую функцию, вызванную shutDoor () к основанию Вашего сценария. Поскольку это выполняет в значительной степени тот же самый Functions как открытый (), мы не будем обсуждать это подробно. Просто заметьте, что различную мультипликацию вызывают на заставе и что наш doorIsOpen Variables перезагружен к ложному так, чтобы вся процедура могла начаться function shutDoor(){ audio.PlayOneShot(doorShutSound) ; doorIsOpen = false; var myOutpost : GameObject = GameObject.Find("outpost"),-myOutpost.animation .Play("doorshut"); Эффективность Functions Теперь, когда у насесть сценарий, отвечающий за открытие и закрытие нашей двери, давайте смотреть на то, как мы можем расширить наше знание сделанных на заказ functions, чтобы сделать наше scripting более эффективное. 106 В настоящее время у насесть два functions, которые мы именуем как обычай или сделанный на заказ - открытый () и shutDoor (). Эти functions выполняют те же самые три задачи - они играют звук, устанавливают логическую переменную, и играют мультипликацию. Итак, почему бы не создавать единственный Functions и добавить параметры, чтобы позволить этому играть отличающиеся звуки и сделали, чтобы это выбрало или истинный или ложный для булевого и игры, отличающейся мультипликации Превращение этих трех задач в параметры Functions позволит нам делать только это. Параметры - параметры настройки, определенные в скобках Functions. Они должны быть отделены запятыми и должны быть даны указанный тип когда объявлено в Functions. function Door(aClip : AudioClip, openCheck : boolean, animName : String, thisDoor : GameObject){ audio.PlayOneShot(aClip); doorIsOpen = openCheck; thisDoor.transform.parent.animation.Play(animName); У основания Вашего сценария, добавьте следующий Вы заметите, что этот Functions выглядит подобным нашим существующим открытыми закрытым functions, но имеет четыре параметра в его декларации, openCheck, animName, и thisDoor. Они - эффективно variables, которые назначены, когда функция вызвана, и ценность, назначенная на них, используется в Functions. Например, когда мы желаем передать ценности для открытия двери в этот Functions, мы вызвали бы функцию и установили бы каждые параметры при письме Door(doorOpenSound, true, "dooropen", Это кормит Variables doorOpenSound к aClip параметру, ценности верного для openCheck параметра, последовательности текста "dooropen" к animName параметру, и посылает Variables currentDoor в thisDoor параметр. Теперь мы можем заменить звонок в открытое () Functions в Functions обнаружения столкновения. Однако, мы должны все же установить currentDoor Variables, таким образом мы должны будем сделать это также. Во-первых, удалите следующую линию, которая называет Открытое () Functions внутри OnControllerColliderHit () Functions: OpenDoor(); Замените это следующими двумя линиями currentDoor = hit.gameObject; 107 Door(doorOpenSound, true, "dooropen", Здесь мы устанавливаем currentDoor Variables в то, какой бы ни с объектом последний раз столкнулись. Это позволяет нам тогда передавать эту информацию к нашему Functions, гарантируя, что мы только открываемся - который является более аккуратной мультипликацией на - определенная застава, мы сталкиваемся сане любая застава с теговой дверью. В последней линии этого Functions мы играем правильную мультипликацию при использовании thisDoor. transform.parent.animation -при-использовании точечный синтаксис здесь, мы прослеживаем, отстраняется к компоненту мультипликации, к которому мы должны обратиться. thisDoor Variables питался объект, последний раз сохраненный хитом в currentDoor Variables - и мы тогда обращаемся к родительскому объекту двери - застава непосредственно, поскольку это - это, которому приложили компонент мультипликации к этому, не дверь. Например, мы не могли сказать thisDoor.animation.Play(animName); Unity сказал бы нам, что нет никакого компонента мультипликации. Так, вместо этого, мы обращаемся к дверному детскому родителю transform преобразовать) объекта - объект, которому это принадлежит в Иерархии - и затем затем выбирать компонент мультипликации оттуда. Наконец, потому что мы используем этот новый метод открытия и закрытия дверей, мы должны будем исправить дверной код закрытия в пределах Update () function. В пределах, если утверждение, что проверки на doorTimer Variables, превышающий ценность doorOpenTime Variables, замените звонок в shutDoor () Functions с этой линией Door(doorShutSound, false, "doorshut", Вы можете теперь удалить оригинальные два functions - открытый () и shutDoor () как наша настраиваемая Дверь (), Functions теперь заменяет их оба. Создавая functions таким образом, мы не повторяем нас в scripting, и это делает наш сценарий более эффективными экономит время, сочиняя два functions. Окончание сценария Чтобы закончить сценарий, мы удостоверимся, что у объекта, к которому он добавлен, есть компонент AudioSource - это необходимо, чтобы воспроизвести звуковые скрепки, поскольку мы делаем в нашем Дверном Functions. Добавьте следующую линию к самому основанию сценария, гарантируя, что линия НЕ закончена сточкой с запятой, поскольку Вы ожидали бы. 108 Это - то, потому что эта команда является определенной для Unity, и не часть ожидаемых требований JavaScript. @script RequireComponent (Приложение сценария Спасите свой сценарий в редакторе сценария, чтобы гарантировать, что редактор Unity получает любые обновления, которые Вы сделали - это должно быть сделано с любыми изменениями, которые Вы производите в своих сценариях иначе Unity не может повторно собрать сценарий. Затем, переключитесь назад на Unity. Проверьте нижний бар интерфейса Unity, поскольку это - то, где любые ошибки, сделанные в сценарии, покажут. Если есть любые ошибки, то щелкают два раза на ошибке и гарантируют что Ваши спички сценария написанное выше. Поскольку Вы продолжаете работать св, Вы привыкнете к использованию ошибки, сообщая, чтобы помочь Вам исправить любые ошибки, которые Вы можете сделать. Лучшее место, чтобы начать перепроверять это, Вы не сделали ошибок в своем коде, должно гарантировать, что у Вас есть четное число открытия и закрытия вьющихся скоб - это означает, что все functions и если утверждения правильно закрыты. Если у Вас нет никаких ошибок, то просто выбирают объект, к которому Вы желаете применить сценарий в Иерархии - объект First Person Controller. Есть два метода приложения сценария к любому объекту в Unity. Во-первых, Вы можете drag and drop (перетащили и опустили) сценарий непосредственно от Проектной группы на объект в Иерархии, или Сцена рассматривает, или просто выбирать объект, Вы желаете применить сценарий к (поскольку Вы только сделали, и от главного меню, пойдите в Компонент | Сценарии | Столкновения Игрока. Подменю Scripts меню Component просто перечисляет любые сценарии, которые это находит в текущем Проекте чтобы скоро, как Ваш сценарий создан и спасен, это будет доступно, чтобы выбрать из того меню. Группа Инспектора для Первого Диспетчера Человека должна теперь показать Сценарий Столкновений Игрока как компонент наряду со Звуковым Исходным компонентом, который автоматически был добавлен в результате использования команды RequireComponent в конце нашего сценария. 109 Вы должны отметить, что наши общественные variables участника, doorOpenTime, doorOpenSound, и doorShutSound появляются в Инспекторе так, чтобы Вы могли приспособить ценность doorOpenTime и drag and drop (перетащили и опустили) звуковые файлы от Проектной группы, чтобы назначить на два звуковых variables. Это верно для любых variables участника, с которыми Вы можете столкнуться при письме, что сценарии - помнят, что Вы можете скрыть общественные variables участника от появления в этой манере просто при использовании частной приставки, поскольку мы сделали с другими тремя variables, используемыми в сценарии. Примите во внимание, что, используя частные variables, им нужно назначить тип или ценность в сценарии, чтобы избежать ошибок, иначе они будут "пустыми" - не имеют никакой ценности. Открытая Дверь и Дверь Близко звучат, скрепки доступны в кодовой связке, обеспеченной на packtpub.com |