Движение в мире по (Z,X) относительно мыши + краш редактора.

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Draiget 29 окт 2012, 14:42

Собственно с юнити начал работать вчера (Использую C#, с ним проблем нет), сегодня дошел до проблемы, которую гугл решить не помогает.
Для наглядности проблемы, видео:



Во первых, позиция мышки в мире определяется не самым лучшим образом (смотрим видео), красной сфере применяется позиция:
Синтаксис:
Используется csharp
ray = current_camera.ScreenPointToRay(Input.mousePosition);
DebugMouseObject.position = new Vector3(ray.GetPoint(100f).x, 167.1944f, ray.GetPoint(100f).z);  


Но вот в чем проблема:
Сфера должна двигаться по определенной высоте под курсором мыши, но если двигать курсор вверх, кружок за мышкой не "ползет". Если не ограничивать движение сферы по Z, тогда при перемещении мышки вверх экрана он ползет вверх. Как определить координаты курсора на плоскости по X,Z онли?

Вторая менее важная проблема возникает так:
Запускается сцена "главного меню", в ней по нажатии на кнопку подгружается "тестовая сцена", далее в ней жмем Эскейп и видим "внутри-игровое меню" (код ниже), далее в нем жмем "в главное меню", переходим из "главного меню" снова на "тестовую сцену", внутри-игровая менюшка осталась (надо будет пофиксить) и теперь при нажатии Эксейпа меню должно пропасть, а вот нет, редактор тупо вылетает... (Самый конец видео).

Синтаксис:
Используется csharp
public static bool GUI_Enabled = false;

    private GUIStyle _windowStyle;
    public Texture2D BackGroundTexture;

    public float SCPOWidth(float val)
    {
        return (Screen.width / 2) - (val / 2);
    }

    void Start()
    {
        _windowStyle = new GUIStyle();
        _windowStyle.normal.background = BackGroundTexture;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            GUI_Enabled = !GUI_Enabled;
            if (GUI_Enabled)
            {
                Time.timeScale = 0;
            }
            else
            {
                Time.timeScale = 1;
            }
        }
    }

    void OnGUI()
    {
        if (GUI_Enabled)
        {
            GUI.Window(1, new Rect(0, 0, Screen.width, Screen.height), InGameWindow, string.Empty, _windowStyle);
        }
    }

    void InGameWindow(int windowID)
    {
       
        if (GUI.Button(new Rect(SCPOWidth(140), 224, 140, 30), "В главное меню"))
        {
            Application.LoadLevel("MainMenu");
            Time.timeScale = 1;
        }
    }


Надеюсь я понятно описал суть проблемы :D
Решение пытался искать на зарубежных форумах, так-что если это уже обсуждалось здесь - извиняйте, не особо глубоко рыл.
Аватара пользователя
Draiget
UNец
 
Сообщения: 10
Зарегистрирован: 29 окт 2012, 10:40
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Syberex 29 окт 2012, 21:42

Юнити легко вылетает при делении на 0, может это и не ваш случай, но я бы внимательней последил за функцией SCPOWidth :-?
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Draiget 29 окт 2012, 22:03

Нет, здесь что-то другое, ибо:

Синтаксис:
Используется csharp
    public float SCPOWidth(float val)
    {
        if (val == 0)
        {
            return 0;
        }

        return (Screen.width / 2) - (val / 2);
    }


Не помогло, если ошибка при делении.
Аватара пользователя
Draiget
UNец
 
Сообщения: 10
Зарегистрирован: 29 окт 2012, 10:40
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Receptor 30 окт 2012, 05:12

логичнее наверное так оформить
Синтаксис:
Используется csharp

         if (val == 0)
         {
             return 0;
         }else{
             return (Screen.width / 2) - (val / 2);
         }
 

Но не думаю что это как-то решит проблему :)
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Draiget 30 окт 2012, 06:23

Нету разницы, после ретурна последующий код уже не выполняется.
Аватара пользователя
Draiget
UNец
 
Сообщения: 10
Зарегистрирован: 29 окт 2012, 10:40
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение jetyb 30 окт 2012, 07:56

ray = current_camera.ScreenPointToRay(Input.mousePosition);
DebugMouseObject.position = new Vector3(ray.GetPoint(100f).x, 167.1944f, ray.GetPoint(100f).z);

Берется точка 100f на луче , выходящем из камеры, т.е. область ее значений - сфера, ограниченная фруструмом камеры. Затем этот сектор проецируется на плоскость y = 167. Естественно, что область возможных положений точки будет весьма ограничена.
Тут лучше находить пересечение луча и плоскости, или луча и квадрата.

Насчет второго - попробуй в старте дописать
DontDestroyOnLoad(this);
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Draiget 30 окт 2012, 13:47

jetyb писал(а):Берется точка 100f на луче , выходящем из камеры, т.е. область ее значений - сфера, ограниченная фруструмом камеры. Затем этот сектор проецируется на плоскость y = 167. Естественно, что область возможных положений точки будет весьма ограничена.
Тут лучше находить пересечение луча и плоскости, или луча и квадрата.


А нельзя ли написать более понятно, не знаком с местным сленгом... Что есть "фруструм" ?
Суть в том что плоскости не должно быть, я чисто чтобы показать передвижение сферы ее сделал, он должен находить точку пересечения по y = 167, но как?

jetyb писал(а):Насчет второго - попробуй в старте дописать
DontDestroyOnLoad(this);


Еще больше проблем стало, после их фикса при переходе в главное меню он вылетает.
Аватара пользователя
Draiget
UNец
 
Сообщения: 10
Зарегистрирован: 29 окт 2012, 10:40
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Syberex 30 окт 2012, 23:27

1. Я не утверждал, что точно деление на 0, я предлагал проверить все то, что выходит за рамки ... например функция может возвращать отрицательные значения, или что-то с типами не в порядке после деления :-? попробуй измениь на :
Синтаксис:
Используется csharp
public float SCPOWidth(float val)
     {
         return (Screen.width / 2f) - (val / 2f);
     }
 


2. Есть такая структура Plane у которой есть метод Raycast, такая плоскость на экране отображаться не будет ...
Фруструм камеры это усеченная пирамида, внутри которой находится видимый камерой объем.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Draiget 31 окт 2012, 06:51

Спасибо за перевод :)

Погуглил немного, не до конца понял плейн, а именно его создание:

Синтаксис:
Используется csharp
new Plane(Vector3 inNormal, Vector3 inPoint);


Что есть inNormal и inPoint?

Или лучше юзать такую перегрузку:
Синтаксис:
Используется csharp
Plane(Vector3 inNormal, float d);


А здесь что есть inNormal и d?

К сожалению описания этих переменных тут нет, либо я их в упор не вижу.

В итоге получился вот такой код:
Синтаксис:
Используется csharp
 ray = _cam.ScreenPointToRay(Input.mousePosition);
Plane _p = new Plane(Vector3.up, Vector3.zero);
float fOut = 100.0f;
_p.Raycast(ray, out fOut);

DebugMouseObject.position = new Vector3(ray.GetPoint(fOut).x, 167.1944f, ray.GetPoint(fOut).z);


Он перемещает сферу не под курсором (смещает ее в сторону от курсора), но на плоскости, а это прогресс =)
Аватара пользователя
Draiget
UNец
 
Сообщения: 10
Зарегистрирован: 29 окт 2012, 10:40
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Syberex 31 окт 2012, 20:01

У плейна есть 3 конструктора Plane.Plane
inNormal - это нормаль, перпендикулярно ее будет создаваться плоскость
inPoint - точка, через которую будет проходить плоскость

Вы построили плоскость с нормалью направленной вверх (то есть горизонтальную) и проходящую через начало координат :)
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Draiget 01 ноя 2012, 06:30

Огромное спасибо, теперь все так как и задумывалось

Вот так получилось:
Синтаксис:
Используется csharp
Plane _p = new Plane(Vector3.up, new Vector3(169f, 167.1944f, 221f));
        float fOut = 100.0f;
        _p.Raycast(ray, out fOut);


Просто центр у меня в другом месте немного :)


Еще одна новая проблема:
Сделал модель в максе и перенес в Юнити, когда я двигаю обычный примитив в виде прямоугольника, он правильно поворачивается по направлению движения, а вот 3д модель колбасит: она переворачивается вверх дном и боком под бешеным углом...

Код:
Синтаксис:
Используется csharp
if (moving)
   {
   if (rotate)
   {
      transform.rotation = Quaternion.Slerp(transform.rotation, targetAngle, ((Time.time - startTime) / RotationSpeed)); //Time.deltaTime

      if (targetAngle.x == transform.rotation.x
      || -targetAngle.x == transform.rotation.x
      || targetAngle.x == -transform.rotation.x)
      {
         if (targetAngle.y == transform.rotation.y
         || -targetAngle.y == transform.rotation.y
         || targetAngle.y == -transform.rotation.y)
         {
            if (targetAngle.z == transform.rotation.z
            || -targetAngle.z == transform.rotation.z
            || targetAngle.z == -transform.rotation.z)
            {
               rotate = false;
               startTime = Time.time;
            }
         }
      }
   }
   else
   {
      transform.position = Vector3.Lerp(startPoint, moveTo, ((Time.time - startTime) / MovingSpeed));
      if (transform.position == moveTo)
      {
         moving = false;
      }
   }
}
 


Скриншот:
Изображение
Аватара пользователя
Draiget
UNец
 
Сообщения: 10
Зарегистрирован: 29 окт 2012, 10:40
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Draiget 02 ноя 2012, 09:07

UP

Видео:


Что с углами твориться?
Пытался ограничить вращение только по одной оси такая-же фигня, код выше. Даже если конечному англу (z,x,w) задавать текущий англ юнита, он поворачивается не по оставшемуся Y, а по черт знает каким осям, это тоже не помогло.
Аватара пользователя
Draiget
UNец
 
Сообщения: 10
Зарегистрирован: 29 окт 2012, 10:40
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Syberex 02 ноя 2012, 11:24

Все просто, нужно выровнять пивоты (pivot, локальные оси модели) перед импортом модели в макс.
Перевёрнутые Оси (РЕШЕНИЕ)

И выучить кнопочки на верхней панели Юнити:
Pivot/Center
Local/Global

Посмотрите куда смотрит пивот моделей, смотреть он должен так:
z - вперед, y - вверх, x - в сторону.
Сравните с примитивами!
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Движение в мире по (Z,X) относительно мыши + краш редактора.

Сообщение Draiget 02 ноя 2012, 13:33

Огромное вам спасибо, все работает, поворачивает как надо :)
Аватара пользователя
Draiget
UNец
 
Сообщения: 10
Зарегистрирован: 29 окт 2012, 10:40
  • Сайт


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot] и гости: 20