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