[РЕШЕНО]Проблема с Instantiate

Программирование на Юнити.

[РЕШЕНО]Проблема с Instantiate

Сообщение Berenold 22 июл 2011, 22:14

Доброго времени суток. Делаю создание пули через скрипт вот такой код
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class PlayerShoot : MonoBehaviour
{
        public Transform puliaPrefab;
       
        void Update ()
        {
                ShootBase();
        }
       
        void ShootBase()
        {
                if(Input.GetMouseButtonDown(0))
                {
                        Rigidbody clonePylia;
                        clonePylia = Instantiate(puliaPrefab, GameObject.Find("SootPoint").transform.position, Quaternion.identity);
                        clonePylia.velocity = transform.TransformDirection(Vector3.forward * 200);                     
                       
                }
        }
}
 


Выдает ошибку
Assets/Content/Scripts/Client/PlayerControl/Player Control 2D/PlayerShoot.cs(18,25): error CS0266: Cannot implicitly convert type `UnityEngine.Object' to `UnityEngine.Rigidbody'. An explicit conversion exists (are you missing a cast?)


Первым же делом я полез в справку
static function Instantiate (original : Object, position : Vector3, rotation : Quaternion) : Object
Description

Clones the object original and returns the clone.

Clones the object original, places it at position and sets the rotation to rotation, then returns the cloned object. This is essentially the same as using duplicate command (cmd-d) in Unity and then moving the object to the given location. If a game object, component or script instance is passed, Instantiate will clone the entire game object hierarchy, with all children cloned as well. All game objects are activated.
See Also: In depth Prefab Instantiate discussion

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
public Transform prefab;
void Awake() {
int i = 0;
while (i < 10) {
Instantiate(prefab, new Vector3(i * 2.0F, 0, 0), Quaternion.identity);
i++;
}
}
}
 


Instantiate is most commonly used to instantiate projectiles, AI Enemies, particle explosions or wrecked object replacements.

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
public Rigidbody projectile;
void Update() {
if (Input.GetButtonDown("Fire1")) {
Rigidbody clone;
clone = Instantiate(projectile, transform.position, transform.rotation);
clone.velocity = transform.TransformDirection(Vector3.forward * 10);
}
}
}
 


и т.д.


Получается, что один и тот же код у них работает, у меня нет((
Явное приведение типов тоже не помогло.
Синтаксис:
Используется csharp
clonePylia = (Rigidbody)Instantiate(puliaPrefab, GameObject.Find("SootPoint").transform.position, Quaternion.identity);
 


Клон создается но при этом в логе появляется ошибка

InvalidCastException: Cannot cast from source type to destination type.
PlayerShoot.ShootBase () (at Assets/Content/Scripts/Client/PlayerControl/Player Control 2D/PlayerShoot.cs:18)
PlayerShoot.Update () (at Assets/Content/Scripts/Client/PlayerControl/Player Control 2D/PlayerShoot.cs:10)


Как можно решить эту проблему? Пробовал сделать клон пули и гейм обджект таже фигня. Ему нужен только обджект. А на обджектом я не могу дяльше работать с физикой. Как быть?
Заранее спасибо.
Последний раз редактировалось Berenold 25 июл 2011, 16:51, всего редактировалось 2 раз(а).
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Проблема с Instantiate

Сообщение corrozian 22 июл 2011, 22:25

Не знаю почему у тебя там выходит ошибка но пули я создаю вото так и работаю, а ригибоди на них уже сразу висит
На персонаже:
Синтаксис:
Используется javascript
............  
//Shuting
  if(Input.GetMouseButtonDown(0)){
      fsh =1;
        }
  else if (Input.GetMouseButtonUp(0)){
          fsh =0;
        }
 .........
if (fsh ==1){
   targ = GameObject.Find("/"+name+"/Pelvis/Spine1/Spine2/Spine3/Target");
   Network.Instantiate(pshut,targ.transform.position,targ.transform.rotation, 0);
  }


На самой пуле(полет):
Синтаксис:
Используется javascript
function Update () {
   transform.position +=transform.forward*3;
   Destroy(gameObject,3);
}
Последний раз редактировалось corrozian 22 июл 2011, 22:34, всего редактировалось 1 раз.
corrozian
UNец
 
Сообщения: 16
Зарегистрирован: 10 июн 2011, 12:47

Re: Проблема с Instantiate

Сообщение corrozian 22 июл 2011, 22:27

Это вариант сетевой вместо Network.Instantiate используй Instantiate для сингла =)
corrozian
UNец
 
Сообщения: 16
Зарегистрирован: 10 июн 2011, 12:47

Re: Проблема с Instantiate

Сообщение Berenold 22 июл 2011, 22:36

corrozian спасибо за ответ. Сейчас попробую твой вариант. Но вопрос остается открытым. Не может же в справке быть не правельные примеры.
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Проблема с Instantiate

Сообщение corrozian 22 июл 2011, 22:41

Berenold писал(а):corrozian спасибо за ответ. Сейчас попробую твой вариант. Но вопрос остается открытым. Не может же в справке быть не правельные примеры.


Ну мне кажется не нужно при создании сразу искать как ты тут(не проверял):
clonePylia = Instantiate(puliaPrefab, GameObject.Find("SootPoint").transform.position, Quaternion.identity);
corrozian
UNец
 
Сообщения: 16
Зарегистрирован: 10 июн 2011, 12:47

Re: Проблема с Instantiate

Сообщение Zaicheg 22 июл 2011, 22:54

Rigidbody rig = (Instantiate(prefab) as GameObject).GetComponent<Rigidbody>();
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Проблема с Instantiate

Сообщение Berenold 23 июл 2011, 00:33

corrozian писал(а):Ну мне кажется не нужно при создании сразу искать как ты тут(не проверял):
clonePylia = Instantiate(puliaPrefab, GameObject.Find("SootPoint").transform.position, Quaternion.identity);

Нужно объясню почему. GameObject.Find("SootPoint").transform.position Является точкой где непосредственно должен появится объект в пространстве.
Выдержка из справки
static function Instantiate (original : Object, position : Vector3 , rotation : Quaternion) : Object

А ругается он на другое совершенно. Instantiate как видно из справки(которую я уже 2 раза приводил) является типом [color=#FF0000] Object [color=#FF0000] !!! И его никак не прикрутить ни к Rigidbody ни к GameObject. Насколько я понимаю Object здесь подразумевается как тим самого С#. Это базовый его тип из которого строятся все остальные типы и нельзя неявно базовый тип привести к наследующему(Rigidbody, GameObject и т.д.). Если я не прав поправте меня. Просто фишка в том, что если данный скрипт перевести на JS все работает как надо. Я принципиально не хочу включать JS хочу разобраться как сделать это на C#. Есть конечно идея)) Попробовать упаковку/распаковку))
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Проблема с Instantiate

Сообщение Berenold 23 июл 2011, 00:35

Zaicheg писал(а):Rigidbody rig = (Instantiate(prefab) as GameObject).GetComponent<Rigidbody>();

Поясни пожалуйста этот код. Я токо понял что ты типы привел. А вот эот GetComponent<Rigidbody>() что?

corrozian писал(а):На самой пуле(полет):
Синтаксис:
Используется javascript
function Update () {
   transform.position +=transform.forward*3;
   Destroy(gameObject,3);
}

Не пойдет объясню почему. Игра 2.5D тоесть все трех мерноено но движение всех обьектов происходит непосредственно только по оси "x" и вид с боку. transform.forward направляет пулю от точки респауна четко в центр экрана причем по оси "z". + Все должно быть в одном коде так как направление полета определяется от точки респаута в точку где в данный момент находится курсор мышки по оси "x". А так да, твой код вполне работает для ФПС или 3д персон.
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Проблема с Instantiate

Сообщение Zaicheg 23 июл 2011, 00:55

Berenold писал(а):Поясни пожалуйста этот код. Я токо понял что ты типы привел. А вот эот GetComponent<Rigidbody>() что?

Этот метод подробно разъяснён в Script Reference. Если коротко, до получение ссылки на компонент.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Проблема с Instantiate

Сообщение king_kong 23 июл 2011, 05:05

такой вариант мне больше нравится Rigidbody rig = Instantiate(prefab) as Rigidbody;
Аватара пользователя
king_kong
UNец
 
Сообщения: 40
Зарегистрирован: 03 июн 2011, 21:58
Откуда: Барнаул

Re: Проблема с Instantiate

Сообщение lazykiller 23 июл 2011, 10:20

если запарка с типами то проще сделать совсем по стандарту
инстанитинатить как геймобжект и через него уже трогать риджидбади
Синтаксис:
Используется csharp
GameObject clonePylia;
clonePylia = Instantiate(puliaPrefab, GameObject.Find("SootPoint").transform.position, Quaternion.identity);
clonePylia.rigidbody.velocity = transform.TransformDirection(Vector3.forward * 200);
Аватара пользователя
lazykiller
UNец
 
Сообщения: 17
Зарегистрирован: 18 июл 2011, 17:44

Re: Проблема с Instantiate

Сообщение seaman 23 июл 2011, 11:30

собственно Ваше утверждение:
Получается, что один и тот же код у них работает, у меня нет((

в корне неверно!
Они инстанцируют что? -
public Rigidbody projectile;
Вы инстанцируете что? -
public Transform puliaPrefab;

Почему вообще у префаба тип Transform? Ну хотя бы GameObject.
ЗЫ: Это объяснение почему ошибка, Н\ну а как решить проблему Zaicheg уже написал.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Проблема с Instantiate

Сообщение Berenold 23 июл 2011, 17:02

seaman писал(а):Они инстанцируют что? -
public Rigidbody projectile;
Вы инстанцируете что? -
public Transform puliaPrefab;


Вы думаете я не использовал тип public Rigidbody projectile; во время тестов? Пишет, что не может привести тип Object к Rigidbody. Так же не может привести тип Object к типу GameObject и тд. public Transform puliaPrefab; это был уже последний вариант испытаний, после чего я обратился за помощью на форуме. Почему не может я тоже уже описал. Нужно делать ЯВНОЕ ПРИВЕДЕНИЕ ТИПОВ!!!! Почему я и говорю, что скорее всего в справке ошибка. Сейчас буду делать по одному примеру, который нарыл в нете. Должно работать нормально, причем так как мне нужно.

И в подтверждение моих слов дабы больше не возникали вопросы выкладываю скрины

Попытка неявно привести тик Object к типу GameObject
error1_1.jpg

error1_2.jpg


Попытка неявно привести тик Object к типу Rigidbody
error2_1.jpg

error2_2.jpg
У вас нет доступа для просмотра вложений в этом сообщении.
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

Re: Проблема с Instantiate

Сообщение Zaicheg 23 июл 2011, 20:27

Действительно, пример из справки с инстансированием rigidbody нерабочий — даёт ошибку компиляции о невозможности приведения типов.
Скорее всего, дело в том, что пример для C# делался на основе примера для US (до 3.0 примерно на шарпе не было), в котором такая конструкция работает. И забыли проверить.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Проблема с Instantiate

Сообщение Berenold 24 июл 2011, 02:11

Слава богу работает но не совсем так как хотелось бы((
Когда создается префаб он поворачивается по оси "y". Далее я высчитываю направления полета пули и при этом меняется разворот пули опять таки по оси "y". То, что она разворачивается это круто, только я не пойму как сделать, что бы она разворачивалась по оси "z".

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class PlayerShoot : MonoBehaviour
{
        public GameObject prefabPylia; // Подгрузка префаба
        public Camera cam;                   // Переиенная для инициалезации камеры
        GameObject _targ;                    // Переменная для определения точки респауна пули
       
       
        Vector3 _inputRotation;              //Переменная для расчета направления пули
        Vector3 _tempVector;                 //Переменная для определения положения mouse на экране
        Vector3 _tempVector2;                //Переменная для определения точки респауна пули на экране
        Vector3 _tempVector3;                //Переменная для определения точки респауна пули в мировых координатах
       
       
        void Start ()
        {
                cam = Camera.main;                                           // Инициалезация камеры
                _targ = GameObject.Find("ShootPoint");                       // Определение положения точки респауна пули
        }

        void Update ()
        {
                FindVector();
        }
       
        void FindVector()
        {
                // Нахождения вектора для mouse
                _tempVector = Input.mousePosition; // Определение положения mouse на экране
                _tempVector2 = cam.WorldToScreenPoint(_targ.transform.position); // Определение проложения тоски респауна пури на экране
                _tempVector3 = new Vector3(_targ.transform.position.x, _targ.transform.position.y, 0); // Определение положения тоски  респауна пули в мировых координатах
                _inputRotation = _tempVector - _tempVector2; // Расчет направления пули

                GameObject objCreatedPylia = (GameObject) Instantiate(prefabPylia, _tempVector3, Quaternion.LookRotation(_inputRotation)); // создание клона пули в игре
        }
}
 


Код на самой пуле
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class PyliaTransform : MonoBehaviour
{
        private float _moveSpeed=40f; // Скоросто передвижения пули
       
        void Update ()
        {
                Ptransform();
        }
       
        void Ptransform()
        {
                transform.Translate(0, 0, _moveSpeed * Time.deltaTime);
                transform.position = new Vector3(transform.position.x, transform.position.y,0); //
                Destroy(gameObject, 0.5f);
        }
}

 


Подскажите пожалуйста где касяк?

P.S. Код сокращал непосредственно в редакторе форума. Так, что если вдруг не совпадения по названиям переменных или что-то подобное не нужно кричать"ааа я знаю у тебя точка с запетой не стоит потому и не правельно поворачивается"))
Заранее спасибо))
Невозможное возможно!
Аватара пользователя
Berenold
UNITрон
 
Сообщения: 151
Зарегистрирован: 31 июл 2010, 01:44
Откуда: Киев
  • Сайт

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8