Автор Will Goldstone Источник Unity Game
Скачать 7.66 Mb.
|
0. Нажмите на опускаться стрелку направо ни от Одного (Звуковая Скрепка) и выберите скрепку аудио броска из списка доступных звуковых активов скрепки. Нажмите на стрелку направо ни от Одного (Rigidbody) и выберите Кокосовый Prefab как объект, чтобы назначить от списка, который появляется. Это связывает кокосовый заранее приготовленный актив непосредственно с этим Variables, означая, что сценарий создаст случаи того объекта. Наконец, назначьте Variables Силы Броска ценность 25. Примите во внимание, что изменение ценностей в Инспекторе не регулирует то, что написано в сценарии, но просто отвергает любые назначенные на сценарий ценности. Помните, что эти публично выставленные variables участника могут быть заменены, не имея необходимость 157 повторно собирать или редактировать исходный текст. Привыкните к наладке этих ценностей в Инспекторе, поскольку удобство использования общественных variables участника таким образом является оперативным спасателем. Теперь, пришло время проверять сценарий броска игрой, проверяющей игру. Нажмите кнопку Play теперь и или щелкните левой кнопкой мыши, или нажмите левую клавишу CTRL на клавиатуре, чтобы бросить кокосовый орех Нажмите кнопку Play снова, чтобы прекратить проверять, как только Вы удовлетворены, что это работает правильно. Если что-нибудь не работает правильно, то возвратитесь к своему сценарию и перепроверке, что это соответствует полному сценарию, который является следующие var throwSound : AudioClip; var coconutObject : Rigidbody; var throwForce : float; function Update () { if(Input.GetButtonUp("Fire1")){ audio.PlayOneShot(throwSound); var newCoconut : Rigidbody = Instantiate(coconutObject, transform.position, transform.rotation); newCoconut.name = "coconut"; newCoconut.rigidbody.velocity = transform.TransformDirection (Vector3(0,0, throwForce)); Physics.IgnoreCollision(transform.root.collider, newCoconut.collider, true); } } @script RequireComponent(AudioSource) Instantiate (Проиллюстрировать) ограничение и объектную уборку Instantiate (Проиллюстрировать) объектов таким образом, в которых мы сделали, является идеальным использованием заранее приготовленной системы Unity, облегчая строить любой объект в сцене и создавать много клонов этого вовремя времени выполнения. Однако, создание многих клонов объекта с твердым телом может оказаться дорогостоящим, поскольку каждый призывает двигатель физики, и поскольку это договаривается о своем пути вокруг трехмерного взаимодействия мира другие объекты - это будет использовать циклы центрального процессора (обрабатывающий власть. Теперь вообразите, должны ли Выбыли позволить Вашему 158 игроку создавать бесконечное количество управляемых физикой объектов, и Вы можете ценить, что Ваша игра может замедлиться через некоторое время. Поскольку Ваша игра использует слишком много циклов центрального процессора и памяти, норма структуры становится ниже, создавая вяленое мясо смотрит на Вашу ранее гладко показывавшую жестом игру. Это конечно будет плохим опытом для игрока, ив коммерческом смысле, убило бы Вашу игру. Вместо того, чтобы надеяться, что игрок не бросает много кокосовых орехов, мы вместо этого сделаем две вещи, чтобы избежать слишком многих объектов, забивающих норму структуры игры Позвольте игроку бросать кокосовые орехи только в то время как в определенном пятне в мире игры Напишите сценарий, чтобы удалить кокосовые орехи из мира после определенного времени начиная сих экземпляра Если бы мы воздействовали на экземпляр большего масштаба, например, оружия, то мы также добавили бы основанную на времени задержку, чтобы гарантировать 'перезарядить' период. Это не необходимо в этом случае, поскольку мы избегаем слишком многих кокосовых орехов, бросаемых сразу при использовании GetButtonUp () команда - игрок должен выпустить ключ прежде, чем кокосовый орех будет брошен. Формирование кокосового броска Мы обратимся к первому пункту, просто имея переключающуюся логическую переменную, которая должна быть верной для игрока, чтобы бросить кокосовые орехи, и мы только установим этот Variables в верный, когда характер игрока будет стоять на части модели платформы - который будет нашей кокосовой целевой ареной. Наличие игрока, беспорядочно бросающего кокосовые орехи вокруг уровня далеко от этой миниигры, действительно не имело бы смысла, таким образом это - хорошая вещь, чтобы ограничить это действие вообще независимо от наших рассмотрений работы. Вновь откройте сценарий CoconutThrow, если Вы закрыли его, щелкая два раза его изображением в Проектной группе. Иначе, просто переключитесь назад на редактора сценария и продолжите воздействовать на это. Ранее, мы смотрели на формирование и дезактивацию сценариев через позволенный параметр компонента. Точно также в этом случае, мы могли очень хорошо использовать GetComponent () команда, выбрать этот сценарий, и повредить это, когда мы не хотим, чтобы игрок бросил кокосовые орехи. Однако, как со всеми проблемами scripting, есть много решений любой проблемы, ив этом случае, мы будем смотреть на использование статических variables, чтобы общаться через сценарии. Добавьте следующую линию в очень главном из сценария CoconutThrow: статический вар canThrow: булевый = ложный Эта статическая приставка перед нашим Variables - Джевэскрипт Unity 159 способ создать глобальную стоимость, к которой могут получить доступ другие сценарии. В результате этого мы будем добавлять другое условие к нашему существующему, если утверждение, которое позволяет нам бросать, так что найдет что линия в пределах Update () function. Это должно быть похожим на это if(Input.GetButtonUp("Fire1")){ Чтобы добавить второе условие, просто добавьте два символа амперсанда перед правильной заключительной скобкой если утверждение наряду с названием статического Variables, следующим образом if(Input.GetButtonUp("Fire1") && canThrow){ Примите во внимание здесь, что просто написание имени Variables является более коротким способом сообщить if(Input.GetButtonUp("Fire1") && canThrow==true){ Поскольку мы установили canThrow Variables в сценарии к ложному, когда это было объявлено, и потому что это статично (поэтому не общественный Variables участника, мы должны будем использовать другую часть scripting, чтобы установить этот Variables в истинный. Учитывая, что наш игрок должен стоять в определенном месте, наш лучший курс действия для этого должен использовать обнаружение столкновения, чтобы проверить, сталкивается ли игрок со специфическим объектом, и если так, установил этот статический Variables в истинный, позволяя им бросить. Откройте сценарий PlayerCollisions теперь и определите местонахождение прокомментированного OnControllerColliderHit () Functions. Это должно быть похожим на это /* function OnControllerColliderHit(hit: ControllerColliderHit){ if(hit.gameObject.tag == "outpostDoor" && doorIsOpen == false){ Door(doorOpenSound, true, "dooropen"); } } */ Удалите и характеры, чтобы непрокомментировать это, делая это активный код снова. Однако, удалите, если утверждение, поскольку мы больше не нуждаемся в этом Functions, чтобы обращаться с дверным проемом и закрытием. У Вас должен теперь только быть Functions, непосредственно остающийся, как это function OnControllerColliderHit(hit: ControllerColliderHit){ В модели платформы Вы загрузили, есть часть модели, названной 160 циновкой, на которой игрок должен стоять, чтобы бросить кокосовые орехи, таким образом мы гарантируем, что они сталкиваются с этим объектом. В этом Functions, еще добавьте следующий если утверждение if(hit.collider == GameObject.Find("mat").collider){ CoconutThrow.canThrow=true; }else{ CoconutThrow.canThrow=false; } Здесь мы проверяем, равен ли текущий поражаемый коллайдер (двойной, равняется, сравнительное, коллайдер объекта игры в сцене с циновкой названия. Если это условие соблюдают, то мы просто обращаемся к статическому Variables canThrow в сценарии по имени CoconutThrow использование точечного синтаксиса, и устанавливаем этот Variables в истинный. Это позволяет Instantiate (Проиллюстрировать) () команды сценария CoconutThrow работать. Иначе, мы удостоверяемся, что этот Variables, который это установило в ложный, означая, что игрок не будет в состоянии бросить кокосовые орехи, когда он не будет стоять на циновке броска платформы. В редакторе сценария, пойдите в Файл |, Экономят и возвращаются к Unity. Удаление кокосовых орехов Как объяснено ранее, слишком много управляемых физикой объектов в Вашей сцене могут серьезно затронуть работу. Поэтому, в случаях, таких как это, где Ваши объекты - просто холостые объекты (возражает, что не должен быть сохранен, мы можем написать сценарий, чтобы автоматически удалить их после определенного количества времени. Выберите папку Сценариев в Проектной группе, нажмите на кнопку Create, и выберите JavaScript, чтобы сделать новый сценарий. Переименуйте этот сценарий CoconutTidy, нажимая Возвращение (Mac) или F2 (PC) и перепечатывание. Тогда щелкните два раза изображением сценария, чтобы начать это в редакторе сценария. Удалите Update () function по умолчанию из этого сценария, поскольку мы не нуждаемся в этом. Чтобы удалить любой объект из сцены, мы можем просто использовать Разрушение () команда. Осуществите его второй параметр, чтобы установить период ожидания. Добавьте следующий Functions и команду к Вашему сценарию теперь function Start(){ Destroy(gameObject, 5); При использовании Начала () команда, которую мы вызовем, Разрушает (), как только этот объект появляется в мире, то есть, как только это иллюстрируется примерами игроком, нажимающим кнопку огня. Обращаясь к gameObject, мы просто говорим 'объект, к которому этот 161 сценарий присоединен. После запятой мы просто сообщаем время в секундах, чтобы ждать до формирования этой команды. В результате этого сценария - как только кокосовый орех брошен, это останется в мире в течение пяти секунд, и затем будет удалено. Пойдите в Файл |, Экономят в редакторе сценария и возвращаются к Unity. Ранее, когда мы написали сценарии, мы приложили их к объектам в сцене, мы продолжали работать. Однако, в этом случае, мы уже закончили воздействовать на наш кокосовый prefab, и у нас больше нет копии в сцене. Есть два способа применить сценарий, который мы только что написали prefab. Чтобы сделать это легкий путь, Вы можете Выберите Кокосовый prefab, который Вы сделали ранее в Проектной группе, и идти в Компонент | Сценарии | CoconutTidy Или следовать более многоречивым маршрутом, Вы можете изменить prefab в Сцене следующим образом Тяните Кокосовый prefab кокну или группе Иерархии Пойдите в Компонент | Сценарии | CoconutTidy, щелчок Добавляет к corvfirm когда сказано, что Добавление компонента потеряет заранее приготовленного родителя Отзовитесь эхом это обновление к оригинальному prefab, идя в GameObject | Применяют Изменения к prefab Удалите случай в сцене, используя сокращенную Команду + Клавиша Backspace (Mac) или Удаляет (PC). В этом случае я рекомендую прежнему, то есть, единственному маршруту шага, столь давайте сделаем что теперь. Нов некоторых случаях может быть полезно забрать prefab в сцену, и изменить это прежде, чем Вы примените изменения к prefab. Например, если бы Вы воздействуете кое на что визуальное, такое как система частицы, тогда Вы должны были бы видеть то, что производит Ваши регуляторы, или недавно добавленные компоненты будут иметь. Поэтому, взятие prefab такого объекта в сцену, чтобы отредактировать было бы существенным. Пойдите в Файл |, Экономят Проект в Unity теперь, чтобы обновить Ваше продвижение пока. Добавление кокосовой застенчивой платформы Теперь мы готовы осуществить нашу миниигру от активов, которые Вы загружали ранее. Помещая платформу и три цели в сцену, мы проверим на столкновения между кокосовыми орехами и целями, и напишем сценарий, чтобы проверить, сбиты ли все три цели в некогда цели миниигры. В Проектной группе есть Кокосовая папка Игры, которая была 162 импортирована, когда Вы загружали активы, чтобы закончить эту главу. Выберите трехмерную модель в этой папке, названной платформой, чтобы видеть ее свойства в Инспекторе Параметры настройки импорта Прежде, чем мы поместим платформу и цели в сцену, мы гарантируем, что они правильно измерены и могут идтись на игроком, производя коллайдеры для каждой части моделей. Платформа В компоненте FBXImporter в Инспекторе, набор Коэффициент пропорциональности к 1.25, тогда выберите коробку для, Производят Коллайдеры, чтобы гарантировать, что Unity назначает коллайдер петли на каждую часть модели, означая, что характер игрока будет в состоянии идти на платформе. Чтобы подтвердить это изменение, щелкните кнопкой Apply у основания Инспектора теперь. Теперь тяните модель от Проектной группы до окна Scene, и используйте инструмент Transform (преобразовать, чтобы поместить это где-нибудь около заставы, чтобы гарантировать, что игрок понимает, что две особенности связаны. Удостоверьтесь, что Вы понижаете модель платформы в основание так, чтобы характер игрока был в состоянии идти по шагам впереди модели. Вот расположение, которое я выбрал 163 Цели и кокосовые столкновения Теперь найдите целевую модель в Кокосовой папке Игры в Проектной группе, и выберите это, чтобы видеть, что различный импорт устанавливает компоненты в Инспекторе В компоненте FBXImporter в Инспекторе, выберите коробку для, Производят Коллайдеры, чтобы гарантировать, что любая часть модели, что кокосовые хиты должны заставить это отражать - помнит, что без коллайдеров, трехмерные объекты пройдут через друг друга. Кроме того, установите Коэффициент пропорциональности в ценность 1 здесь. В компоненте Мультипликаций мы должны будем определить, что структуры и дать названия для каждой мультипликации сообщают, что мы хотели бы, чтобы эта модель имела, таким же образом поскольку мы сделали для дверных мультипликаций заставы. Добавляя эти государства мультипликации, мы можем призвать их в наших сценариях, если столкновение между кокосовым орехом и правильной частью цели происходит. Добавьте три государства мультипликации, как показано в следующем скриншоте, нажимая плюс (+) изображение направо от стола мультипликаций, тогда fflling на Название и структуры Начала и Конца 164 Когда Вы закончили стол Мультипликаций, не забудьте нажимать кнопку Apply в основании, чтобы подтвердить это и другие изменения импорта, которые Вы произвели в активе. Размещение Чтобы поместить цели легко в платформу, мы добавим их как дети объекта платформы уже в нашей сцене. Чтобы сделать это, просто тяните целевую модель от Кокосовой папки Игры в Проектной группе, и понизьте это на объект родителя платформы в группе Иерархии. Выбудете побуждены с окном диалога, сообщающим Вам, что добавление этого детского объекта Потеряет заранее приготовленную связь. Просто щелкните кнопкой Continue здесь. Это просто сообщает Вам, что изменения сделали к компонентам приложенный к оригинальной модели в Проектной группе например, сценарий параметры, больше не относятся к этой копии в сцене, потому что Вы разъединяете связь между этим случаем и оригинальным активом или prefab. Добавляя цель, поскольку ребенок платформы заставит платформу расширять и показывать свои существующие детские объекты наряду с целью, которую Вы только что добавили. Поскольку цель будет помещена в центр платформы по умолчанию, переместит это в правильную позицию, изменяя ценности в компоненте Transform (преобразовать) в Размещении инспектора это в (0, 1.7, 1.7). Кокосовый сценарий обнаружения Поскольку мы должны обнаружить столкновения между целевой частью целевой модели - в противоположность стеблю или основе, для примера - мы должны будем написать сценарий с обнаружением коллизий, чтобы быть примененными к той части модели. Выберите папку Сценариев в Проектной группе, затем нажмите на кнопку Create, и выберите JavaScript 165 из опускаться меню. Переименуйте это от NewBehaviourScript дои затем щелкните два раза изображением, чтобы открыть это в редакторе сценария. Установление variables Во-первых, мы должны установить пять variables, и они следующие Общественный Variables участника GameObject, хранящий целевой объект непосредственно beenHit булевое, чтобы проверить, снижается ли цель в настоящее время Перезагружен частный Variables таймера с плавающей запятой, чтобы ждать определенного количества времени перед целью hitSound звуковой общественный Variables участника resetSound звуковой общественный Variables участника Чтобы сделать это, добавьте следующий код к началу сценария var targetRoot : GameObject; private var beenHit : boolean = false; private var timer : float = 0.0; var hitSound : AudioClip; var resetSound : AudioClip; Отметьте здесь, что beenHit и таймер - частные variables, поскольку они не должны быть назначены в Инспекторе - их ценности установлены и используются только в пределах сценария. Урегулирование частной приставки скроет их от представления в Инспекторе, означая, что они не общественные variables участника. Обнаружение столкновения Затем, переместите существующий Update () function вниз несколькими линиями и напишите в следующем Functions обнаружения столкновения function OnCollisionEnter(theObject : Collision) { if(beenHit==false && theObject.gameObject.name=="coconut"){ audio.PlayOneShot(hitSound); targetRoot.animation.Play("down"); beenHit=true; } Отличающийся от OnControllerColliderHit () и OnTriggerEnter () функционирует, мы использовали ранее, OnCollisionEnter () обращается с обычными столкновениями между объектами с примитивными коллайдерами, то есть, не коллайдерами диспетчера характера и не коллайдерами в более аккуратном способе. В этом Functions параметр theObject является случаем Classes 166 Столкновения, который хранит информацию на скоростях, rigidbodies, коллайдерах, преобразовать, GameObjects, и пункты контакта, вовлеченные в столкновение. Поэтому, здесь мы просто согласовываем Classes с, если утверждение, проверяя, снабдил ли тот параметр gameObject кокосовым орехом названия. Чтобы гарантировать, что цель не может быть поражена много разу насесть дополнительное условие в, если утверждение, которое проверяет, что beenHit установлен в ложный. Это будет иметь место, когда игра начнется, и когда это столкновение происходит, beenHit установлен в верный так, чтобы мы не могли случайно вызвать это дважды. Этот Functions также играет звуковой файл, назначенный на Variables hitSound, и играет государство мультипликации, названное вниз на любом объекте, который мы drag and drop (перетащили и опустили) к targetRoot Variables. После письма сценария мы назначим целевой объект родителя модели на этот Variables в Инспекторе Сброс цели Теперь в Update () function, мы должны будем использовать beenHit Variables, чтобы начать таймер подсчитывание к 3 секундам. Это означает, что от структуры, что она поражена кокосовым орехом, таймер рассчитает к 3 прежде, чем вызвать сброс. Для этого мы будем нуждаться два, если утверждения, один, чтобы обращаться с проверкой beenHit, чтобы быть верными увеличивание таймера и другого, чтобы проверить, достигли таймер 3 секунд. Переместите заключительную правильную вьющуюся скобу Update () function вниз несколькими линиями, и добавьте следующий код if(beenHit){ timer += Time.deltaTime; if(timer > 3){ audio.PlayOneShot(resetSound); targetRoot.animation.Play("up"); beenHit=false; timer=0.0; } Наше первое, если утверждение ждет beenHit, чтобы быть верными затем добавляет к Variables таймера, используя прилавок Time.deltaTime. Это - определенная норма неструктуры, и поэтому рассчитывает в режиме реального времени. Второе, если утверждение ждет Variables таймера, чтобы превысить 3 секунды, то игры звук, назначенный наиграет государство мультипликации модели, назначенной на targetRoot, и перезагружает beenHit и таймер к их оригинальным государствам так, чтобы цель могла быть поражена снова. Включая звуковой источник 167 Поскольку мы играем звуки, мы должны будем добавить обычную команду RequireComponent к основанию нашего сценария, чтобы гарантировать, что звуковой источник добавлен к объекту, к которому приложен этот сценарий. Поместите следующую линию в самое основание сценария после заключительной вьющейся скобы Update () function: @script RequireComponent (AudioSource) Пойдите в Файл | |