Суббота, 23 Ноября 2024, 07:35

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Prefab гранаты
Kano-TanakaДата: Понедельник, 31 Марта 2014, 20:28 | Сообщение # 1
был не раз
Сейчас нет на сайте
Проблема следующая: у меня есть префаб гранаты для гранатомёта(в данный момент просто капсула), и мне надо, чтобы она вылетала в горизонтальном положении, но на сколько я понял: из в кладки transform у префаба сохраняется только опция масштаб(scale), так что граната всё равно вылетает в вертикальном положении(см картинку(кстати, там видно, что в опции вращение(rotation) стоит 90, а граната всё равно не повёрнутая)), что мне крайне не нравится. Мне почему-то кажется, что всё дело вот в этой части скрипта, собственно передназанченной для вылета гранаты:
Transform AmmoSAInstance = (Transform)Instantiate (AmmoSA, GameObject.Find ("Muzzle").transform.position, Quaternion.identity);

помогите пожалста


P.S. И не надо оффтопить.

P.P.S. Скрипт написан на C#

P.P.P.S. Я практически не знаю данный язык, изучал только его предшественника


Сообщение отредактировал Kano-Tanaka - Понедельник, 31 Марта 2014, 22:39
robertonoДата: Понедельник, 31 Марта 2014, 21:21 | Сообщение # 2
Чокнутый Кот
Сейчас нет на сайте
Kano-Tanaka,
попробуй вот так:
GameObject AmmoSAInstance = (GameObject)Instantiate (AmmoSA);
AmmoSAInstance.transform.position = GameObject.Find("Muzzle");
AmmoSAInstance.transform.rotation.eulerEdges = new Vector3(90,0,0);

Я привык спавнить gameobject. И ещё в коде выше могут быть ошибки в буквах. Но думаю ты разберешься
Storm54Дата: Понедельник, 31 Марта 2014, 21:41 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Код
Quaternion.identity

Этот параметр как раз и отвечает за поворот. Поиграйся со значением.
Удобней работать с углом ейлера.
Код
Quaternion.Euler(90,0,0)


Сообщение отредактировал Storm54 - Понедельник, 31 Марта 2014, 21:45
Kano-TanakaДата: Понедельник, 31 Марта 2014, 22:54 | Сообщение # 4
был не раз
Сейчас нет на сайте
Спасибо, заработало, а могу я ещё спросить, как уменьшить массу объекта, или, не знаю, сделать его чуть более прыгучим?

Добавлено (31.03.2014, 22:37)
---------------------------------------------

Цитата Storm54 ()
Quaternion.Euler(90,0,0)

Ай, блин, чё-то не то. Граната поаернулась, но по абсолютным координатам, теперь она вылетает всегда параллельно оси z

Добавлено (31.03.2014, 22:54)
---------------------------------------------

Цитата robertono ()
GameObject AmmoSAInstance = (GameObject)Instantiate (AmmoSA);
AmmoSAInstance.transform.position = GameObject.Find("Muzzle");
AmmoSAInstance.transform.rotation.eulerEdges = new Vector3(90,0,0);


так почему-то не получается выдаёт ошибки:

1)неявное преобразование типа 'UnityEngine.GameObject' в 'UnityEngine.Vector3' невозможно (ко второй строке)
2)Не удалось изменить возвращаемое значение для 'UnityEngine.transform.rotation', т.к. оно не является переменной (к третьей строке)
lentinantДата: Понедельник, 31 Марта 2014, 23:19 | Сообщение # 5
ленивый программист
Сейчас нет на сайте
Цитата Kano-Tanaka ()
1)неявное преобразование типа 'UnityEngine.GameObject' в 'UnityEngine.Vector3' невозможно (ко второй строке)

Потому что товарищ предложил тебе присваивать значение типа gameObject переменной типа Vector3. По сути, там надо было так
Код
AmmoSAInstance.transform.position = GameObject.Find("Muzzle").transform.position;

И да, каждый раз пользоваться поиском - не вариант. Трансформ объекта-мушки лучше закешировать.
Цитата Kano-Tanaka ()
2)Не удалось изменить возвращаемое значение для 'UnityEngine.transform.rotation', т.к. оно не является переменной (к третьей строке)

Это потому что переменной eulerEdges в классе Quaternion не существует. Зато существует переменная eulerAngles. И можно обойтись
Код
AmmoSAInstance.transform.eulerAngles = new Vector3(90,0,0);

Да и делить одну функцию на три строчки толку нет в принципе.
И да, это не решит проблему с поворотом гранаты, угол, задаваемый этим вектором, глобальный.

Тебе надо отталкиваться от того, как повернуто оружие в момент выстрела. Ты можешь взять то же значение transform.eulerAngles.x оружия, и присвоить именно это значение соответственному углу гранаты. Ну или при необходимости вычесть из него Pi.


Когда-то тут будут ссылки на крутые проекты. Или нет.

Сообщение отредактировал lentinant - Понедельник, 31 Марта 2014, 23:21
Kano-TanakaДата: Понедельник, 31 Марта 2014, 23:36 | Сообщение # 6
был не раз
Сейчас нет на сайте
так пули просто появляются на месте спавна игрока, вне зависимисти от его положения после спавна, хотя и повёрнутые -_-

Цитата lentinant ()
Тебе надо отталкиваться от того, как повернуто оружие в момент выстрела. Ты можешь взять то же значение transform.eulerAngles.x оружия, и присвоить именно это значение соответственному углу гранаты. Ну или при необходимости вычесть из него Pi.

а вот с этого момента поподробнее, только без огромного нагромождения терминов пожалуйста, просто
Цитата Kano-Tanaka ()
P.P.P.S. Я практически не знаю данный язык, изучал только его предшественника
lentinantДата: Вторник, 01 Апреля 2014, 02:26 | Сообщение # 7
ленивый программист
Сейчас нет на сайте
Ладно, будем по порядку. Я просто проигнорю то, какое у тебя оружие сейчас, и начну сначала, чтобы не разбираться в твоих наработках. Аналогии найдешь сам.

Итак, есть оружие. Припустим, это просто объект на уровне, прикрепленный к камере, и представляющий какой-то растянутый куб. К нему по иерархии прикреплен пустой объект, который располагается на месте мушки (тот же Muzzle). К оружию прикреплен скрипт непосредственно оружия. Для начала, в скрипте надо объявить переменные для префаба гранаты и для мушки.
Код
public Transform Muzzle;
public Transform grenadePrefab;

В первый "затягиваешь" непосредственно объект Muzzle, во второй - префаб твоей гранаты. Поворачивать ее необязательно, это можно делать при создании гранаты. Сам префаб - капсула, ригидбоди, и код, который в начале дает импульс ригидбоди
Код
void Start()
{
     rigidbody.AddRelativeForce(0, power, 0);
}

Может возникнуть вопрос, почему мы добавляем силу именно по оси Y. Так вот. Есть такая штука как transform, в которой записано положение, вращение и масштаб объекта. Дело в том, что там есть вектор forward, указывающий, где "перед" объекта, вектор Up, отвечающий за верх, и вектор right, отвечающий за право. В переходе на вектор, это оси Z, Y, и X соответственно. И фишка в том, что, как бы ты не крутил трансформ, векторы эти в отношении прикрепленной модели не поменяются. В случае с капсулой, как только ты добавил ее к объекту, оси Z и X, оказывается, выходят по сторонам капсулы. По ее направлению идет только ось Y. Так что, если хочешь не менять модель, но чтобы та летела соответственным образом, надо просто использовать в качестве вектора "вперед" вектор "вверх".

Так вот. Теперь мы дошли до момента, в котором ты стреляешь. Не буду останавливаться на нажатии кнопок, паузе при стрельбе и все такое, перейду сразу к функции Instantiate. Вообще, если ты не хочешь ничего дальше делать со снарядом, будет достаточно этой строчки.
Код
Instantiate(grenadePrefab, Muzzle.position, Quaternion.LookRotation(transform.up));

Насчет первых двух параметров, думаю, ясно. Теперь, третий параметр. Нам надо задать вращение в виде кватерниона - очень хитрой штуки, которая мне самому непонятна. Но, в общем, если повернуть объект с помощью LookRotation, то его вектор "вперед" будет параллельным вектору, заданному в качестве параметра в LookRotation. В нашем случае, получается, мы направили вектор "вперед" гранаты соответственно вектору "вверх" оружия. Однако, так и надо, потому что теперь вектор "вверх" гранаты соответствует вектору "вперед" оружия. То есть, она правильно выровнена. И летит тоже правильно, это я расписал выше.


Когда-то тут будут ссылки на крутые проекты. Или нет.
Kano-TanakaДата: Вторник, 01 Апреля 2014, 16:01 | Сообщение # 8
был не раз
Сейчас нет на сайте
Спасибо огромное, теперь буду знать. Никогда б не додумался до этого.
  • Страница 1 из 1
  • 1
Поиск:

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