Как сделать полет в юнити
Еще один скрипт управления персонажем, заточенный под 2D физику. В отличии от прочих, здесь имеются некоторые настройки. Возможен выбор осей. Например, если выбрать только ось Х, в этом случаи включается режим как для платформера, персонаж может двигаться по горизонтали и использовать прыжок. Если выбрать оси ХY, тогда скрипт переходит в режим как для скроллера, проще говоря, подходит для управления неким самолетом или вроде того, объект может двигаться не только по горизонтали, но и по вертикали, а та-же самая клавиша, что и в первом варианте, на этот раз выполняет роль ускорителя, то есть добавляет скорости. Кроме того, есть опция отслеживания позиции курсора, чтобы персонаж смотрел на него.
speed - скорость движения, как не странно.
addForce - если выбран режим Оnly X, будет использовано для прыжка, при нажатии соответствующий клавиши. Во втором режиме, значение addForce будет прибавлено к speed, тем самым придавая ускорение.
lookAtCursor - отслеживание позиции курсора, персонаж будет вращаться по оси Z. Важно помнить, что лицом считается ось Х.
isFacingRight - если на старте сцены персонаж смотрит вправо, то надо ставить true.
При движении только по горизонтали, разворот персонажа осуществляется через функцию Flip. Так же, чтобы прыжок был возможен, все объекты по которым возможно передвижение, как бы земля/поверхность, у всех них должен быть тег Ground.
Управление персонажем в 3D
- Plane — это территория, по которой будет перемещаться наш персонаж.
- Sphere — объект персонажа.
Создаем скрипт и даем ему название на английском языке.
- movementSpeed — скорость передвижения.
- turningSpeed — скорость поворота.
- vertical — движение по вертикали.
- horizontal — движение по горизонтали.
Управление персонажем в 2D
Для работы потребуется два спрайта — для персонажа и для земли. Перемещаем персонажа и землю на сцену. С помощью клавиш CTRL+D дублируем землю.
Создаем пустой объект. И в него перемещаем все объекты земли.
На пустой объект добавляем коллайдер. Add Component - Physics2D - BoxCollider. И с помощью инструмента Edit Collider настраиваем размеры.
Персонажу добавляем физику и коллайдер и так же настраиваем границы коллайдера.
- maxSpeed — скорость персонажа
- flipRight — направление спрайта персонажа.
Теперь отражаем наш спрайт в зависимости от того, в какую сторону движется наш персонаж. Условием If проверяем. Если нажали клавишу для перемещения вправо, а персонаж направлен влево, то поворачиваем спрайт вправо. С else if — обратная ситуация.
И теперь сама функция Flip. В ней мы отражаем спрайт по оси X и задаем размеры, чтобы из-за отражения не исказились размеры спрайта.
В школе “Пиксель” мы ведем полный курс обучения Unity 3D для детей и подростков. Изучая наши уроки Си Шарп, вы быстро освоите азы программирования и научитесь создавать свои игры.
Мы остановились после того, как получили полное представление о том, как начать работу с Unity 3D, и только что создали новый проект.
Наш новый проект по умолчанию создал четыре папки: Assets, Library, ProjectSettings и Temp. Unity3D создайте и настройте себя как несохраненную тему по умолчанию, над которой мы сейчас работаем. Не бойтесь: этот пост выглядит длинным, но есть много скриншотов, чтобы вы могли легко следить за ним.
…. Теперь к забавному материалу
Для начала давайте добавим игровой объект-плоскость, чтобы он действовал как пол мира. Это может быть выполнено несколькими разными способами.
Установка сцены
Теперь, когда у нас есть материал травы, мы перетащим его и назначим его нашему самолету. Нажмите и перетащите материал в иерархическое представление и поместите его на объект плоскости. Это добавит его в самолет. Теперь нажмите на объект плоскости в иерархическом представлении, и это покажет объект плоскости внутри инспектора. Внизу инспектора мы должны увидеть материал объекта травы.
Давайте отредактируем этот материал, чтобы он был более красочным и более похожим на траву, чем на серый.
Сначала мы нажмем темно-серую стрелку слева от материала травы, которая раскроет этот материал и покажет набор настроек, которые мы можем изменить.
А сейчас давайте просто изменим цвет альбедо. Мы делаем это, щелкая цветную пластинку рядом с альбедо, что даст нам возможность использовать цветовую палитру. Давайте войдем в красный 34, зеленый 86, синий 34 и оставим альфу в 255. Это даст нам хороший темно-зеленый цвет для использования в качестве травы.
Теперь мы должны увидеть хороший зеленый самолет для нашей травы.
Теперь для редактирования размера нашего поля. Мы можем еще раз выбрать нашу плоскость, и в инспекторе вы увидите вверху объект с именем Transform. Это объект, который визуализатор использует в качестве основы для положения, поворота и масштаба. Чтобы мы могли изменить размер статического плоского объекта, мы можем масштабировать объект. Шкала включает в себя 3 различных значения, каждое из которых относится к размерам, XY Z. В единстве мы можем думать о тех направлениях как x как ширина, y как высота и z как длина. Unity использует систему координат Y-up, и, поскольку мы работаем с плоскостью, у нас есть только два измерения X и Z для ширины и длины. Давайте установим оба значения в 10, делая нашу плоскость в 10 раз больше, чем раньше. Это должно дать нам достаточно места для передвижения.
Добавление объектов в нашу сцену
Теперь давайте добавим объект в игровой мир, который позволит нам передвигаться; это будет действовать как наш персонаж. Мы будем использовать куб, чтобы представить это в игре. Чтобы добавить куб, перейдите в окно Иерархия и щелкните правой кнопкой мыши 3D-объект -> Куб.
Наша сцена должна выглядеть примерно так, в которой есть наш куб и плоскость.
Обратите внимание, как наш куб на полпути в земле. Это потому, что точка происхождения куба, или точка, в которой объекты преобразуются, находится в центре.
Мы можем компенсировать это, перемещая объект вдоль его оси Y вверх на 0,5, что составляет половину нашего куба 1x1x1. Мы можем внести это изменение, выбрав объект куба в нашем представлении Иерархия и в Инспекторе найти объект Преобразование. Нам нужно изменить положение объекта на x = 0, y = 0.5, z = 0.
Наконец, погрузившись в некоторый код
Давайте откроем скрипт. Дважды щелкните скрипт в средстве просмотра активов, которое откроет либо Visual Studio, либо MonoDevelop. Для этого примера я собираюсь использовать MonoDevelop для нашего кода и отладки.
Внутри этого скрипта есть несколько вещей, которые Unity3d реализовал для вас для начала. Во-первых, он включает в себя два оператора UnityEngine , первый UnityEngine , который включает в себя все библиотеки для взаимодействия с игровым движком Unity и Unity Editor. Следующим является System.Collections , который предоставляет доступ к библиотеке Mono System Collections. Затем он добавляет класс PlayerController , который является именем сценария, производного от класса MonoBehaviour, который является частью библиотеки UnityEngine в качестве основы.
Он добавляет две функции по умолчанию: Start и Update . Запуск — это как звучит, это функция, которая вызывается в начале приложения, как только объект был создан. Обновление запускается каждый цикл Unity, который основан на основном цикле движка Unity.
Теперь давайте напишем некоторый код, чтобы заставить наш куб делать что-то, например вращаться.
Сначала нам нужно взять объект, над которым мы хотим действовать. Поскольку мы хотим вращать куб, а не камеру, мы не хотим просто вращать объект Player . Итак, давайте напишем некоторый код, чтобы получить куб. Для этого добавьте public GameObject cube над нашей функцией State ; это даст нам объект cube в нашем классе для работы.
Этот объект был создан, но мы еще ни на что не указали. Вернемся к редактору Unity и в представлении иерархии выберите объект Player . Теперь в Инспекторе мы видим, что внутри нашего вложенного объекта скрипта есть Объект Cube (Объект Игры).
Это позволит нам перетащить наш объект Cube на наш игровой объект, чтобы иметь контроллер. Теперь мы можем выбрать объект Cube под нашим объектом Player и перетащить его в Cube. Или вы можете щелкнуть по кружку рядом с объектом, и он даст вам список объектов в вашем списке сцен / активов для использования.
Теперь вернемся к нашему коду. Теперь в нашем коде мы можем написать, чтобы повернуть его на 45 градусов, чтобы он стоял на точке куба. Итак, в нашей функции Start напишите следующий код:
cube.transform.Rotate( new Vector3(1,0,0), 45) . Этот код берет наш объект Cube и действует на объект Transform сообщая ему Rotate. Первый параметр — это вектор3, который представляет собой точку в трехмерном пространстве, представленную тремя измерениями: XY Z. Здесь мы говорим в первом параметре, что мы хотим, чтобы он воздействовал только на измерение X вектора3. Мы говорим во втором параметре, что мы устанавливаем для размера X угол 45, который должен установить его по краю.
Давайте вернемся к редактору Unity и нажмите Play:
Теперь, чтобы понять это? Мы можем просто добавить еще один поворот, но на этот раз установить размер Y только как
cube.transform.Rotate( new Vector3(0,1,0), 45) . Снова вернёмся в редактор Unity и нажмем Play.
Ой, мы прорубаем землю; это было вызвано тем, что мы вращались только … мы не двигали объект, когда вращались. Таким образом, поскольку источник все еще находится в середине, как и раньше, мы находимся всего в 0,5, что слишком близко.
Перемещение со стрелками
Теперь, когда у нас есть некоторые базовые сведения о вращении и перемещении, давайте сделаем более похожую на игрока транзакцию куба, в которой мы можем использовать клавиши со стрелками на клавиатуре для его перемещения.
Сначала давайте удалим код, который мы написали, чтобы вращать и перемещать позицию вашего куба. Давайте теперь вместо этого переместим Камеру, чтобы быть более дружелюбной в мире. Давайте вернемся к MonoDevelop и удалим наш код куба с самого начала. Давайте также добавим некоторые действия на камеру.
Теперь мы больше не видим наш куб. Почему это? Ну, у нас нет вращения. Но чтобы проверить и понять, почему, давайте вернемся к Scene Viewer, оставаясь в режиме воспроизведения.
Мы видим четыре объекта и предварительный просмотр камеры. Предварительный просмотр камеры — отличный инструмент, который позволит вам (при выбранной камере) видеть статический вид игрового обзора. Мы также видим, что у нас есть камера, куб, направленный свет и наша зеленая плоскость. Если мы выберем Вид камеры, мы увидим стрелки и четыре белые линии.
Эти четыре белые линии — это ограничивающая рамка, которую видит камера. Хороший трюк, который вы можете сделать, это в Hierarchy View, вы можете дважды щелкнуть по объекту, и в Scene View он будет центрировать этот объект. Это облегчит поиск. Вы также можете прокручивать и уменьшать масштаб. Если вы удерживаете правую кнопку мыши над Scene View и используете клавиши WSAD, вы можете при необходимости перемещаться по сцене.
Если вы уменьшите масштаб и расположитесь так, чтобы красная стрелка камеры указывала прямо на вас, вы можете видеть, что ограничивающая рамка больше не охватывает наш куб, поэтому мы не сможем ее увидеть.
Это больше походит на это. Теперь мы можем видеть наш куб и он похож на игру с высоты птичьего полета. Теперь вернемся к нашему движению со стрелками. Как и раньше, мы хотим делать это при каждом обновлении, поэтому давайте добавим немного кода в функцию update . Давайте сначала напишем код, чтобы обнаружить, что мы нажали клавишу со стрелкой вперед (вверх).
Этот урок предполагает, что вы знакомы с интерфейсом Unity и базовыми концепциями скриптинга. Дополнительно, вы должны быть знакомы с концепциями, изложенными в первой части этого урока.
Before we begin — level setup
- Создайте новый проект (новый! не продолжайте старый!).
- Скачайте проект с необходимыми файлами и откройте его.
- Добавьте mainLevelMesh и FPC в сцену.
Weapon switching
Rocket Launcher
Launcher
Rocket
// The reference to the explosion prefab
var explosion : GameObject;
var timeOut = 3.0;
// Kill the rocket after a while automatically
function Start ()
Invoke("Kill", timeOut);
>
Сначала функция Kill ищет системы частиц в иерархии дочерних объектов и выключает их (параметр emit). Затем, открепляет все дочерние объекты от объекта (ракеты в данном случае) и удаляет ракету.
function OnCollisionEnter (collision : Collision)
// Instantiate explosion at the impact point and rotate the explosion
// so that the y-axis faces along the surface normal
var contact : ContactPoint = collision.contacts[0];
var rotation = Quaternion.FromToRotation(Vector3.up, contact.normal);
Instantiate (explosion, contact.point, rotation);
// And kill our selves
Kill ();
>
function Kill ()
// Stop emitting particles in any children
var emitter : ParticleEmitter= GetComponentInChildren(ParticleEmitter);
if (emitter)
emitter.emit = false;
- Выберите объект RocketLauncher.
- Перетащите префаб Rocket из WeaponPrefabs в слот параметра Projectile.
- Запустите игру, тестируйте.
Explosions
- Перетащите префаб /Standard Assets/Particles/Small explosion на переменную Explosion в скрипте Rocket в префабе Rocket.
function Start ()
var explosionPosition = transform.position;
var colliders : Collider[] = Physics.OverlapSphere (explosionPosition, explosionRadius);
Это возвращает массив коллайдеров, которые попали в сферу.
for (var hit in colliders)
if (!hit)
continue;
if (hit.rigidbody)
hit.rigidbody.AddExplosionForce(
explosionPower, explosionPosition, explosionRadius, 3.0);
Это применяет силу ко всем rigidbodies в пределах радиуса взрывы (сферы).
В принципе, взрыв выглядит неплохо.
var closestPoint = hit.rigidbody.ClosestPointOnBounds(explosionPosition);
var distance = Vector3.Distance(closestPoint, explosionPosition);
// stop emitting ?
if (particleEmitter)
particleEmitter.emit = true;
yield WaitForSeconds(0.5);
particleEmitter.emit = false;
>
- Добавьте скрипт Explosion-Simple.js к префабу Small explosion.
- explosionPower — величина силы, с которой взрыв будет передвигать объекты.
- explosionDamage — величина повреждений.
- explosionRadius — радиус действия взрыва.
- Запустите игру.
Machine Gun
- Создайте пустой объект и назовите его MachineGun. Добавьте его как дочерний объект в объект Weapons.
- Добавьте меш /Objects/weapons/machineGun в пустой объект MachineGun.
- Прикрепите скрипт MachineGun.js к объекту MachineGun
- Поместите muzzle_flash (дочерний объект в machineGun) в переменную Muzzle Flash компонента-скрипта Machine Gun в объекте MachineGun.
function Start ()
hitParticles = GetComponentInChildren(ParticleEmitter);
// Play sound
if (audio)
audio.loop = false;
>
>
>
>
Функция LateUpdate автоматически вызывается после вызова функции Update. Заметьте, что функция Update вызывается в скрипте PlayWeapons.js, который прикреплён к объекту Weapons (родитель объекта MachineGun). В основном, функция LateUpdate будет использоваться тогда, когда нужно реагировать на произошедшее внутри функции Update. В данном случае, если игрок стреляет в функции Update, то в функции LateUpdate будет применяться вспышка (muzzle flash).
function Fire ()
if (bulletsLeft == 0)
return;
// If there is more than one bullet between the last and this frame
// Reset the nextFireTime
if (Time.time - fireRate > nextFireTime)
nextFireTime = Time.time - Time.deltaTime;
// Keep firing until we used up the fire time
while( nextFireTime 0)
clips-- ;
bulletsLeft = bulletsPerClip;
>
>
function GetBulletsLeft ()
return bulletsLeft;
>
Функция Reload перезаряжает оружие. Продолжительность перезарядки — публичная переменная.
Configuring the particle emitter
- Перетащите префаб /StandardAssets/Particles/Sparks на machineGun в Hierarchy, сделав его дочерним.
- Это всё. Запустите игру. Оружие переключается клавишами 1 и 2.
Hit Points
Скрипты Explosion.js и MachineGun.js уже показали, как рассчитывать величину повреждений от снарядов (ракеты и пули) и посылать эти значения в повреждаемые объекты. Однако, объекты не знают, как получить (принять) эти значения.
Объекты отслеживают то, насколько они здоровы, с помощью переменной hitPoints. Каждый объект инициализируется со своим значением. Каждый, который объект должен получать повреждения, должен иметь функцию ApplyDamage() (заметьте, что функция вызывается из скриптов Explosion.js и MachineGun.js) Эта функция уменьшает количество HP в игровом объекте и вызывает функции, работающие с объектом, HP которого упали до нуля (обычно, это смерть).
Далее мы продемонстрируем, как использовать hitPoints и ApplyDamage()
Exploding Barrels
Рассматриваемый нами код является типовым и может использовать во многих ситуациях.
Вот полный код DamageReceiver.js:
var hitPoints = 100.0;
var detonationDelay = 0.0;
var explosion : Transform;
var deadReplacement : Rigidbody;
Skybox
- Edit→Render Settings. Перетащите /Materials/skyBoxTest в параметр Skybox Material.
Prerequisites
Этот урок предполагает, что вы знакомы с интерфейсом Unity и базовыми концепциями скриптинга. Дополнительно, вы должны быть знакомы с концепциями, изложенными в первых двух частях этого урока.
Setting up
- Откройте предыдущий проект (созданный в части 2).
Waypoints
Robot AI
Robot Damage
- Прикрепите скрипт CharacterDamage к префабу Robot.
- Запустите игру и стреляйте по роботу. Он умрёт и исчезнет, ага.
Ragdolls
- Сначала создайте новую сцену. Мы настроим регдолл здесь. Не забудьте сохранить текущую сцену.
- Создайте куб больших размеров. Он будет служить платформой для робота. Перетащите робота в сцену и расположите на кубе.
- Удалите компонент Animation. Это важно, иначе анимация будет конфиликтовать с физикой.
- Используйте мастера создания регдолла: Gameobject→CreateOther→Ragdoll
- Сначала, rootHandle назначаем на root.
- Установите Total Mass на 4.
Upper body / Arms
Using the Ragdoll
- Откройте исходную сцену, выберите робота в Hierarchy. Перетащите префаб Robot-Ragdoll в переменную Dead Replacement скрипта-компонента Character Damage.
- Запустите игру и стреляйте по роботу. Должен упасть.
Sound
Machine gun
Rocket Launcher
- Выберите префаб Rocket.
- Добавьте компонент Audio Source.
- Перетащите аудиофайл RocketLauncherFire на параметр Audio Clip.
- Настройте RolloffFactor (0.5 должно быть достаточно).
GUI (Графический Интерфейс Пользователя) предоставляет пользователю обратную связь и информирует его о текущей ситуации. Стандартные элементы GUI: количество патронов, здоровье, цели миссии и т. п.
В этой игре мы сделаем три элемента GUI.
Читайте также: