Перейти к содержимому

Как сделать стрельбу в unity 3d

  • автор:

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

#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); > >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *