#6 — Стрельба игроков

В уроке мы научим игроков стрелять. Мы пропишем функционал для выстрелов, отслеживания попаданий, а также нанесения урона. Весь функционал стрельбы реализован за счёт системы лучей — Raycast.
Видеоурок
Материалы для курса
Чтобы скачивать материалы к видеокурсам необходимо оформить подписку на сайт
Весь код будет доступен после подписки на проект!
Задание к уроку
Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям
Как сделать стрельбу в unity3d Подробно. С отдачей и так далее.
Можно сделать анимацию, которая будет проигрываться при нажатии кнопки стрельбы, а касательно самих снарядов, можно сделать скрипт и префаб (будь то спрайт или 3D объект), собственно при нажатии кнопки стрельбы скрипт будет через метод Instantiate создавать префаб объекта в заданом месте (размещаешь снаряд у ствола оружия), если это автоматическая стрельба, то надо будет использовать ещё и метод Invoke, он будет спавнить префаб с определенным временным интервалом при нажатой кнопке, если стрельба одиночными, то справишься и без Invoke метода.
Похожие вопросы
Как создать кнопку стрельбы в игре на движке Unity?
Принцип игры состоит в следующем: нужно стрелять из пушки нажимая на конкретную кнопку. Ниже я оставлю часть из C# кода, которая помогает меня стрелять из пушки, но не с помощью специальной кнопки, а нажимая на любую часть экрана. Прошу помочь преобразовать и использовать этот код с целью стрельбы с кнопки.
public void Update () < Vector3 diffarance = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; float rotZ = Mathf.Atan2(diffarance.y, diffarance.x) * Mathf.Rad2Deg; transform.rotation = Quaternion.Euler(0f, 0f, rotZ + offset); if (ShotsTime > else < ShotsTime -= Time.deltaTime; >>
Отслеживать
411 1 1 золотой знак 4 4 серебряных знака 16 16 бронзовых знаков
задан 20 апр 2019 в 20:20
Eric Petakchyan Eric Petakchyan
25 4 4 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Создайте скрипт и повесьте его на Вашу пушку.
using UnityEngine; public class Gun : MonoBehaviour < public void Fire() < Debug.Log ("fire"); >>

Затем создайте UI Button (ПКМ в окне иерархии > UI > Button )
найдите в его свойствах список слушателей и добавьте туда элемент нажав на +

Затем перетащите объект gun в ячейку слушателя и в выпадающем меню выберите Gun > Fire

После вышеописанных действий при нажатии на кнопку будет вызван метод Fire у объекта Gun
Стрельба и система повреждений
Обычно в играх, для реализации стрельбы, используется два варианта. Первый, для тех случаев, когда нужно, чтобы пулю можно было видеть, то есть низкая скорость движения объекта. Например, если это какой-нибудь снаряд, либо нечто энергетическое, наподобие сгустка плазмы. Во втором варианте, когда скорость пуль высокая (автоматы, пистолеты и прочее) и их не видно. Хотя визуализация может быть, но учитывается не попадание пули в цель, а «попадание» прицела на цель и нажатие клавиши выстрела. Иначе говоря, в первом случаи, нужно создавать объекты и задавать им траекторию движения, в другом, нужно лишь передать цели переменную.
Сделать всё это в принципе не сложно.
Для начала, нам понадобится прицел для нашего оружия. То есть указатель по центру экрана. Находим или рисуем подходящую нам иконку прицела, с прозрачным фоном. Затем, добавляем на сцену GameObject -> UI -> Image и указываем в качестве источника изображения нашу иконку. Осталось разместить прицел по центру и отрегулировать размер. Внимание! Скрипт стрельбы, нужно вешать именно на этот UI объект.
Напишем небольшой скрипт учета повреждений EnemyHealth и цепляем его на цель:
using UnityEngine; using System.Collections; public class EnemyHealth : MonoBehaviour < public float HP = 10; public void AddDamage(float damage) < HP -= damage; if(HP > >
Тут всё просто, есть «здоровье» и одна публичная функция.
Теперь, займемся скриптом стрельбы, название может быть каким угодно:
Пистолеты, пулеметы и похожий огнестрел
Объявляем необходимы переменные:
public float damage = 1; public float timeout = 0.2f; public string[] targetTags = ; private float curTimeout;
damage — сколько HP будет отнимать одно попадание.
timeout — темп стрельбы.
targetTags — здесь надо указать теги объектов, у которых будет скрипт EnemyHealth. Например, в игре могут быть различные типы врагов, с разными тегами для определенного взаимодействия. Поэтому, проще использовать текстовый массив, вместо копирования кусков кода.
void Update() < RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(transform.position); if (Physics.Raycast(ray, out hit)) < if(Input.GetMouseButton(0)) < foreach(string currentTag in targetTags) < if(currentTag == hit.transform.tag) < curTimeout += Time.deltaTime; if(curTimeout >timeout) < curTimeout = 0; hit.transform.GetComponent().AddDamage(damage); > > > > else < curTimeout = timeout + 1; >> >
Так как прицел у нас по центру экрана. Соответственно от центра пускаем луч и при нажатой ЛКМ, если луч попадает на объект у которого есть тег, как в массиве, то отправляем переменную damage.
Плазменное оружие и тому подобное
public Rigidbody bullet; public Transform gunPoint; public int bulletSpeed = 10; public float timeout = 0.5f; private float curTimeout;
bullet — префаб снаряда, о котором поговорим позже.
bulletSpeed — скорость пули.
gunPoint — точка, где будут появятся снаряды. То есть создаем пустой объект, затем его надо сделать дочерним модели оружия и разместить так, чтобы этот объект был там-же, где и дуло оружия. Получится, что пули, как бы вылетают из дула.

void Update() < if(Input.GetMouseButton(0)) < curTimeout += Time.deltaTime; if(curTimeout >timeout) < curTimeout = 0; Rigidbody bulletInstance = Instantiate(bullet, gunPoint.position, Quaternion.identity) as Rigidbody; bulletInstance.velocity = gunPoint.forward * bulletSpeed; >> else < curTimeout = timeout + 1; >>
Скрипт создает объект пули и задет вектор движения, от точки gunPoint — до точки, куда «смотрит» прицел. В общем, как и должно быть.
О префабе пули. На нем обязательно должно быть три компонента: Collider (в режиме триггера), Rigidbody (с отключенной гравитацией) и скрипт Bullet.
Содержание скрипта пули:
using UnityEngine; using System.Collections; public class Bullet : MonoBehaviour < public float damage = 1; public string[] targetTags = ; void OnTriggerEnter(Collider coll) < foreach(string currentTag in targetTags) < if(currentTag == coll.transform.tag) < coll.transform.GetComponent().AddDamage(damage); > > Destroy(gameObject); > >