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.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 |
был не раз
Сейчас нет на сайте
| Спасибо огромное, теперь буду знать. Никогда б не додумался до этого.
|
|
| |
|