Суббота, 23 Ноября 2024, 19:12

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Raycast, rigidbody и стрельба в юнити!
robertonoДата: Пятница, 27 Сентября 2013, 19:03 | Сообщение # 1
Чокнутый Кот
Сейчас нет на сайте
Всем привет. Перешёл наконец то к следующему этапу разработки своей игры. А именно к оружиям. Собственно это и есть вопрос этой темы. Как сделать стрельбу? Просто, вкратце. Что там нужно?
Raycast + instance + rigidbody? Или что?
Мне нужно сделать стрельбу например из всем знакомого ak 47. 30 патронов, автоматическая стрельба.
Заранее огромное спасибо, так как я хорошо застрял на этом моменте)

Добавлено (27.09.2013, 19:03)
---------------------------------------------
Или как лучше делать? Как это примерно сделано в современных 3д шутерах? Ведь если спавнить очень много риджид боди это не будет очень быстро работать, я прав?

lentinantДата: Пятница, 27 Сентября 2013, 19:18 | Сообщение # 2
ленивый программист
Сейчас нет на сайте
robertono, в современных 3D шутерах как раз спавнятся пули. Для уменьшения нагрузки на девайс существует такое понятие как пулы. А вообще - это ты решаешь сам. Можешь сделать пули - ригидбоди, и плясать от этого (например, в баттле можно видеть пули из большинства оружия). При спавне каждой пули отдельно рейкаст не нужен, весь код по попаданию пули и нанесению урона можно перенести в непосредственно пулю. Сама же стрельба банальна до ужаса - спавните (или вытаскиваете из пула) пулю, перемещаете ее на позицию мушки, и задаете ей скорость по направлению оружки. Не стоит забывать, что ригидбоди при большой скорости могут глючить, для этого стоит поменять режим детекции коллизии (см. референс по ригидбоди). Рейкасты же нужны при стрельбе без пуль (такое использовалось в более ранних шутерах), тогда нужен рейкаст в направлении оружки, и проверка полученной инфы по попаданию - размещение декаля следа пули на стенах, нанесение урона врагам, и т.д..

Когда-то тут будут ссылки на крутые проекты. Или нет.
robertonoДата: Пятница, 27 Сентября 2013, 19:24 | Сообщение # 3
Чокнутый Кот
Сейчас нет на сайте
lentinant,
вот скрипт который я "сочинил" сам, скажите пожалуйста ВСЁ что в нём сделано не так и что я делаю неправильно.
Хочется слышать ошибки которые я тут делал и что не нужно писать при написании скрипта стрельбы. Спасибо.

Код

using UnityEngine;
using System.Collections;

public class Shoot : MonoBehaviour {
   
  public GameObject BulletStart;
   
  void Update () {
   if(Input.GetKeyDown(KeyCode.Mouse0)){
    /*
    for(int i = 1; i <= 21; i ++){
     Vector3 pos = GameObject.Find(gameObject.name + "/BulletStart").transform.position;
     ToShoot("9x19",pos);
    }
    */
     
   }
  }
  void ToShoot (string bullet_type,Vector3 start_pos) {
   GameObject bullet = Resources.Load("Bullets/" + bullet_type) as GameObject;
   GameObject go = Instantiate(bullet, start_pos, transform.rotation) as GameObject;
   go.rigidbody.AddForce(new Vector3(0,0,-50),ForceMode.Impulse);
  }
  IEnumerator IEShoot()
         {
    for(int i = 1; i <= 21; i ++){
     yield return new WaitForSeconds(0.0001f);
     Vector3 pos = BulletStart.gameObject.transform.position;
     ToShoot("9x19",pos);
    }
         }
  void FixedUpdate (){
   if(Input.GetKeyDown(KeyCode.Mouse0)){
    Vector3 pos = BulletStart.gameObject.transform.position;
    ToShoot("9x19",pos);
   }
  }
}
DragYourAssetsДата: Пятница, 27 Сентября 2013, 19:31 | Сообщение # 4
CHANGIN' ENGINES
Сейчас нет на сайте
Цитата (lentinant)
robertono, в современных 3D шутерах как раз спавнятся пули. Для уменьшения нагрузки на девайс существует такое понятие как пулы. А вообще - это ты решаешь сам. Можешь сделать пули - ригидбоди, и плясать от этого (например, в баттле можно видеть пули из большинства оружия). При спавне каждой пули отдельно рейкаст не нужен, весь код по попаданию пули и нанесению урона можно перенести в непосредственно пулю. Сама же стрельба банальна до ужаса - спавните (или вытаскиваете из пула) пулю, перемещаете ее на позицию мушки, и задаете ей скорость по направлению оружки. Не стоит забывать, что ригидбоди при большой скорости могут глючить, для этого стоит поменять режим детекции коллизии (см. референс по ригидбоди). Рейкасты же нужны при стрельбе без пуль (такое использовалось в более ранних шутерах), тогда нужен рейкаст в направлении оружки, и проверка полученной инфы по попаданию - размещение декаля следа пули на стенах, нанесение урона врагам, и т.д..

А что, если я скажу, что и в большинстве современных шутеров, несмотря на нечто, отдаленно напоминающее баллистику, даже несмотря на трассеры, используется все тот же старый хисткан-рейкаст?
robertonoДата: Пятница, 27 Сентября 2013, 19:32 | Сообщение # 5
Чокнутый Кот
Сейчас нет на сайте
DragYourAssets, пули по рейкасту будет трудно пустить что бы они немного падали вниз при дальней стрельбе
SomeOneInTheMaskДата: Пятница, 27 Сентября 2013, 22:13 | Сообщение # 6
Stranger
Сейчас нет на сайте
У меня есть несколько уроков на канале, вот последний по этой теме, но там патроны не падают...
это можно реализовать как-то так:

Код

void Update () {
       gravity+=acceleration;
       pos-=new Vector3(0,gravity,0);
}

только луч надо будет по-кадрово запускать где-то после 100 кадров (там отклонение довольно сильное будет)


Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
robertonoДата: Пятница, 27 Сентября 2013, 22:22 | Сообщение # 7
Чокнутый Кот
Сейчас нет на сайте
SomeOneInTheMask, мне кажется проще будет делать тогда именно на риджид боди
SomeOneInTheMaskДата: Пятница, 27 Сентября 2013, 22:36 | Сообщение # 8
Stranger
Сейчас нет на сайте
robertono, ты про OnTiggerEnter? там если каждый кадр проверяется столкновение, то это будет не слабо грузить комп... мне нравится лучи потому что информацию и про расстояние и про точку и нормаль к поверхности можно сразу получить, и функцию запускаещь 1 раз, если патрон далеко не летит smile

Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
robertonoДата: Пятница, 27 Сентября 2013, 22:40 | Сообщение # 9
Чокнутый Кот
Сейчас нет на сайте
SomeOneInTheMask, пуская луч не получится сделать линию от пуль мне кажется.
SomeOneInTheMaskДата: Пятница, 27 Сентября 2013, 22:49 | Сообщение # 10
Stranger
Сейчас нет на сайте
robertono, линию в смысле след? Можно с помощью системы частиц реализовать

Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
robertonoДата: Пятница, 27 Сентября 2013, 22:52 | Сообщение # 11
Чокнутый Кот
Сейчас нет на сайте
SomeOneInTheMask, Ну хорошо, можно сделать на рейкасте математику и просчет куда и во что попало, а графически просто что нибудь добавить
Спасибо Вам !
SomeOneInTheMaskДата: Пятница, 27 Сентября 2013, 23:00 | Сообщение # 12
Stranger
Сейчас нет на сайте
robertono, Слава Богу)
У меня есть старый урок по триггеру, но там есть пара не корректных моментов (там не нужно пулям родителей присваивать)


Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
robertonoДата: Пятница, 27 Сентября 2013, 23:06 | Сообщение # 13
Чокнутый Кот
Сейчас нет на сайте
SomeOneInTheMask, я в Debug.DrawRay вывел луч, в scene его видно. А как можно сделать что бы он был виден и с той камеры которой управляю?
Вот код:
Код

Ray ray = cam.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
Debug.DrawRay(ray.origin,ray.direction * 100,Color.red);
SomeOneInTheMaskДата: Пятница, 27 Сентября 2013, 23:19 | Сообщение # 14
Stranger
Сейчас нет на сайте
Цитата (robertono)
я в Debug.DrawRay вывел луч, в scene его видно. А как можно сделать что бы он был виден и с той камеры которой управляю?

если честно, то я не знаю функции которая это делает. Но можно реализовать в ручную сделать куб
Код

transform.position=(po2+pos1)/2;  //pos2 конечная позиция   pos1 начальная
transform.forward=dir;  //dir направление полета
transform.localScale=new Vector3(0.01f,0.01f,dist);   //dist расстояние

надеюсь ты идею понял, если что то не сшивается, то подгони smile


Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
robertonoДата: Пятница, 27 Сентября 2013, 23:46 | Сообщение # 15
Чокнутый Кот
Сейчас нет на сайте
SomeOneInTheMask, а как можно сделать передвижение какого нибудь объекта по линии raycast?
SomeOneInTheMaskДата: Пятница, 27 Сентября 2013, 23:53 | Сообщение # 16
Stranger
Сейчас нет на сайте
robertono,
Код

transform.forward=dir;  //dir направление полета, 1раз

transform.position=dir*speed*Time.deltaTime;  //каждый кадр



я вроде в уроке это рассказал


Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)

Сообщение отредактировал SomeOneInTheMask - Пятница, 27 Сентября 2013, 23:54
allodsДата: Суббота, 28 Сентября 2013, 00:26 | Сообщение # 17
почти ветеран
Сейчас нет на сайте
А еще можно рейкаст из пули выпускать и нету ни тригеров ничего такого что может нагружать комп. Как только пуля в 1 метре от цели то она попадает . Все ровно от пули в 1ом метре уже не увернутся
SomeOneInTheMaskДата: Суббота, 28 Сентября 2013, 00:39 | Сообщение # 18
Stranger
Сейчас нет на сайте
allods, я собственно почти это предлагаю это делать, только после 100 кадров когда пуля отклониться от начальной траектории из за гравитации, а первый луч пустить при создании пули из камеры чтобы направить ее верно... 100 кадров лучше подождать (не делать лучей) и двигаться к первоначальной цели, ибо делать каждый кадр новый луч не рационально, но после где-то 100 кадров придется делать их чаще так как траектория более сложная

Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
seamanДата: Суббота, 28 Сентября 2013, 10:00 | Сообщение # 19
старожил
Сейчас нет на сайте
Цитата
я в Debug.DrawRay вывел луч, в scene его видно. А как можно сделать что бы он был виден и с той камеры которой управляю?

LineRenderer
SomeOneInTheMaskДата: Суббота, 28 Сентября 2013, 22:05 | Сообщение # 20
Stranger
Сейчас нет на сайте
Цитата (seaman)
LineRenderer

Спасибо smile


Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг