Скрипт луча, пушки, рейкаста, raycast для игрока
Сейчас мы создадим скрипт для управления лучами в Unity 3D. А именно мы сделаем пушку для игрового танка, из которого можно отлично стрелять. Сам скрипт ещё проверяет столкновение луча, и если он попал во вражеский танк, то нам будут начисляться бонусы и очки!
Ну что же, для создания скрипта C# мы будем использовать программу C Sharp Maker, с помощью которой можно создавать скрипты, даже не зная самого языка программирования!
В результате мы получаем код:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pushka : MonoBehaviour { RaycastHit Инфо; Vector3 Позиция = new Vector3(0, 0, 0); Color Цвет1 = new Color(1, 0, 0); Color Цвет2 = new Color(0, 1, 0); public float Дальность; public float x; public float y; public float z; public int Пули; public int Очки; void Update() { if (Input.GetKeyDown(KeyCode.Space)) { if (Пули > 0) { Vector3 Дополнение = new Vector3(x, y, z); Позиция = this.transform.position + Дополнение; Направление = transform.forward; Ray Луч = new Ray(Позиция, Направление); Пули = Пули - 1; if (Physics.Raycast(Луч, out Инфо)) { if (Инфо.collider.gameObject.tag == "Vrag") { Debug.DrawRay(Позиция, Направление * Дальность, Цвет1); Очки = Очки + 1; } else { Debug.DrawRay(Позиция, Направление * Дальность, Цвет2); } } else { Debug.DrawRay(Позиция, Направление * Дальность, Цвет2); } } } } }
Видео-урок и объяснение скрипта
Чтобы было наглядно и более понятно, мы сделали видео-урок, в котором полностью всё объясняется и разбирается каждая строчка скрипта.
Скачать эту программу C Sharp Maker
Вы можете скачать данную программу, чтобы тоже создавать игры без каких-либо усилий и проблем. Си Шарп Мейкер сам создаёт скрипт из простых блоков, которые расписаны по-русски с отдельным описанием!
Подробное создание скрипта
Всех приветствуем. Сейчас мы создадим классную пушку для танка, из которой можно будет стрелять, с помощью программы C Sharp Maker. В этом видео будет небольшой сюрприз, поэтому смотрите это видео внимательно.
И сразу начнём. Создадим переменную луча, которая будет считывать информацию о различных столкновениях. К примеру можно назвать Инфо. Создаём вектор, который будет хранить позицию нашего танка. Назовём Позиция и по умолчанию оставим координаты по нулям.
Второй вектор будет устанавливать направление танка, поэтому его назовём также — Направление.
Теперь создадим переменную цвета. В этот цвет будет перекрашиваться наш луч от пушки. Назовём Цвет1 и установим значения его цветов. Красный поставим на единицу, а все остальные поставим по нулям, таким образом в итоге будет простой красный цвет.
Второй цвет назовём Цвет2, и он уже будет иметь синий цвет, поэтому у него ставим красный и зелёный по нулям, а в место синего установим единицу. В такой цвет будет перекрашиваться луч, когда он столкнётся со врагом.
Ещё сразу создадим переменную, которая будет устанавливать дальность видимого нам луча.
И создадим три вещественные переменные, которые будут регулировать смещение луча по осям на танке.
Один называем X.
Второй называем Y.
Третий называем Z, как и оси.
Устанавливаем гипер-блок Всегда и в нём создадим ещё один вектор.
Назовём его Дополнение, ведь он и будет смещать наш луч.
В его значениях прописываем X, Y, и Z.
Поставьте лайк, подпишитесь на канал и скачайте программу, чтобы тоже создать крутые игры!
Вектору Позиция присваивать координаты самого игрока. Пишем Позиция и приписываем, что позицию надо смещать на координаты вектора Дополнение.
А вектору Направление задаём направление Вперёд.
Теперь можно создать сам луч, который будет вылетать из пушки.
Так и оставляем Луч. Он будет исходить из координат Позиция по направлению Направление. Мы специально так пишем, чтобы было понятно, за что оно отвечает.
Делаем проверку на столкновение луча с чем-либо. В этом блоке оставляем Луч, а вот переменную заменяем на Инфо.
Теперь сделаем проверку столкновения с врагом. Для этого пишем вместо ПеременнаяЛуча нашу переменную Инфо. А тег устанавливаем на Vrag, который мы сделаем в юнити.
И если луч столкнулся с танком под тегом Vrag, то мы отображаем луч, который имеет начало в Позиция, направленный в сторону Направление и имеет цвет Цвет1. В нашем случае это красный.
А Направление ещё умножаем на переменную Дальность, чтобы мы могли регулировать длину луча.
Ставим блок Иначе, который будет красить наш луч в синий цвет, когда не сталкивается с врагом.
Поэтому также оставляем значение Позиция, цвет меняем на Цвет2, а Направление тоже умножаем на Дальность.
Но и ещё нужно красить луч в синий цвет, когда луч вообще не сталкивался. Устанавливаем блок Иначе и в нём точно также создаём луч.
Теперь скрипт готов для нашего тестирования. Заходим в меню файл и в свойствах проекта изменяем название скрипта.
Вот и всё. Копируем наш код и переходим в Visual Studio.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pushka : MonoBehaviour { RaycastHit Инфо; Vector3 Позиция = new Vector3(0, 0, 0); Vector3 Направление = new Vector3(0, 0, 0); Color Цвет1 = new Color(1, 0, 0); Color Цвет2 = new Color(0, 0, 1); public float Дальность; public float x; public float y; public float z; void Update(){ Vector3 Дополнение = new Vector3(x, y, z); Позиция = this.transform.position + Дополнение; Направление = transform.forward; Ray Луч = new Ray(Позиция, Направление); if(Physics.Raycast(Луч, out Инфо)){ if(Инфо.collider.gameObject.tag == "Vrag"){ Debug.DrawRay(Позиция, Направление * Дальность, Цвет1); } else{ Debug.DrawRay(Позиция, Направление * Дальность, Цвет2); } } else{ Debug.DrawRay(Позиция, Направление * Дальность, Цвет2); } } }
Выделяем весь код и вставляем наш скопированный скрипт. Теперь переходим в юнити.
Находим нашего игрока и переносим на него наш скрипт.
Запустим игру, чтобы настроить луч.
Если мы увеличиваем Дальность, то увеличивается и размер луча.
Теперь настроим так, чтобы луч выходил чётко из пушки. Для этого поднимем его по оси Y.
В нашем случае — это ноль сто двадцать пять.
А врагу нужно добавить компонент Rigidbody и Mesh Collider.
Теперь находим вкладку с тегами. Там мы создаём свой тег с именем Vrag.
Главное после добавления своего тега не забыть его поставить на врага. Поэтому выбираем его и устанавливаем наш тег.
Запускаем и пробуем!
Ого, как видно уже появляется луч. И если мы его направим на вражеский танк, то увидим, как луч перекрашивается в красный цвет.
А если заехать за коробку, то луч не будет перекрашиваться в красный. Это потому, что луч сталкивается с объектом, который не имеет тега Врага.
Всё отлично работает. Но этот луч виден лишь в редакторе и он никак не влияет на игру.
Поэтому давайте создадим простенькую систему очков.
В Си Шарп Мейкере добавляем ещё одну переменную, которую назовём Пули.
И ещё одну переменную с названием Очки.
Теперь при выстреле, когда луч столкнётся с врагом, Пули будут уменьшаться по одному.
Так и пишем, что переменная Пули равна Пули минус 1.
Если сталкивается не с врагом, то также пули тратятся.
И если при выстреле пули вообще не попали в объект, то тоже пули заканчиваются.
Это можно сделать сразу одним блоком вычитания, но мы делаем, чтобы показать как можно сделать любые ограничения или правила для своей игры.
А вот если луч попал во вражеский танк, то очки должны прибавляться.
Поэтому тоже пишем, Очки плюс один.
И самое главное — нужно сделать так, чтобы луч появлялся при выстреле, то есть при нажатии на клавишу.
Для этого находим блок и прописываем название клавиши. Можно поставить клавишу пробел, то есть Space.
И ещё сделаем проверку, если пули есть в наличии, то выстрел может осуществляться.
Просто сравним Количество пуль, и если их больше нуля, то выстрел можно создать.
Переносим в эти два блока с условиями остальные блоки.
Главное случайно не перепутать последовательность. Но по блокам проверять легко!
Готово! Нужно теперь вставить этот скрипт в игру.
Снова выделяем всё и вставляем уже новый скрипт.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pushka : MonoBehaviour { RaycastHit Инфо; Vector3 Позиция = new Vector3(0, 0, 0); Color Цвет1 = new Color(1, 0, 0); Color Цвет2 = new Color(0, 1, 0); public float Дальность; public float x; public float y; public float z; public int Пули; public int Очки; void Update() { if (Input.GetKeyDown(KeyCode.Space)) { if (Пули > 0) { Vector3 Дополнение = new Vector3(x, y, z); Позиция = this.transform.position + Дополнение; Направление = transform.forward; Ray Луч = new Ray(Позиция, Направление); Пули = Пули - 1; if (Physics.Raycast(Луч, out Инфо)) { if (Инфо.collider.gameObject.tag == "Vrag") { Debug.DrawRay(Позиция, Направление * Дальность, Цвет1); Очки = Очки + 1; } else { Debug.DrawRay(Позиция, Направление * Дальность, Цвет2); } } else { Debug.DrawRay(Позиция, Направление * Дальность, Цвет2); } } } } }
Сохраняем и переходим в юнити.
Нужно при старте игры игроку дать некоторое количество пуль. Для примера поставим 24.
Отлично! Теперь при нажатии на пробел происходит выстрел. Попробуем сделать выстрел во врага.
И действительно, количество пуль каждый раз уменьшается, а при попадании во врага, нам присваивают очки. Уже получается какая-никакая игра!
Можно теперь поездить и поиграть в игру.
Подпишитесь на канал и поставьте лайк, чтобы увидеть новые видео-уроки и игры.