GUI вращение/Rotate GUI

Лучший способ помочь другим, поделиться своими находками.

GUI вращение/Rotate GUI

Сообщение Fox Malder 08 апр 2009, 13:44

Вот, если кому нада покрутить GUI и вместе с ним что-нибудь в сцене (как в Google Earth), юзаем...
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
Fox Malder
Герой Форума
 
Сообщения: 31
Зарегистрирован: 18 дек 2008, 16:51
Откуда: Моск. обл.
  • ICQ

Re: GUI вращение/Rotate GUI

Сообщение Neodrop 08 апр 2009, 13:46

Спасибо, огромное!!! :ymhug:

Код: Выделить всё
using UnityEngine;
using System.Collections;

public class RotateArrowScript : MonoBehaviour {

  /// <summary>
    /// Put this on guiTexture (GameObject) and set Transform node to (t000,r000,s001);
    /// </summary>

   static public bool DownArrowObject=false;
   public Texture2D tex;// Texture manipulator
   float angle;//
   public GameObject RotateArrow;// Rotate object
   public GameObject mainCam;// Main Camera
   public float rSpeed=0.01f;// speed of rotate
   float iniAngle=0;// Initial angle of GUI
   Rect mainRect = new Rect(680,50,100,100); //Main rectangle of all GUI
   Vector3 centerOfGUI;//center point of GUI
   Vector3 centerRotateOfGUI;//center point of Rotate
   Vector3 defferenseVector;
   float vert;//Vertical sign
   float goriz;//Horizontal sign
   
   void Start(){
      mainCam=GameObject.Find("Main Camera") as GameObject;
      guiTexture.pixelInset=new Rect(mainRect.x,Screen.height-mainRect.y-mainRect.height,mainRect.width,mainRect.height);//Position of GUITexture
      centerOfGUI=new Vector3(mainRect.x+mainRect.width/2,Screen.height-mainRect.y-mainRect.height+mainRect.height/2,1);
      centerRotateOfGUI=new Vector2(mainRect.x+mainRect.width/2,mainRect.y+mainRect.height/2);
   }
   
   
   ////////////////////////////////////////////////
   /// Deactivate Camera
   ////////////////////////////////////////////////
   
   void OnMouseDown(){
   DownArrowObject=true;
   }
   
   void OnMouseUp(){
   DownArrowObject=false;
   mainCam.SendMessage("RenderToTexture");
   angle=0;
   }
   
   //////////////////////////////////////////////////
   
   
    void OnMouseDrag(){
    defferenseVector = Input.mousePosition-centerOfGUI;
    vert=Mathf.Clamp(defferenseVector.y,-1,1);// get sign
    goriz=Mathf.Clamp(defferenseVector.x,-1,1);
    angle=(Input.GetAxis("Mouse Drag X")*vert+(-Input.GetAxis("Mouse Drag Y"))*goriz)*rSpeed;
   RotateArrow.transform.Rotate(0,angle,0);
    }
   
    void OnGUI(){
       Matrix4x4 iniMatrix=GUI.matrix;
       
       iniAngle+=angle;
      GUIUtility.RotateAroundPivot(iniAngle,centerRotateOfGUI);//Change GUI matrix
      GUI.DrawTexture(mainRect,tex);
      
      ///There restore the initial GUI.matrix for future elements from iniMatrix;
      GUI.matrix=iniMatrix;
      
   }
}
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: GUI вращение/Rotate GUI

Сообщение Neodrop 08 апр 2009, 16:49

Вариант 2.

Код: Выделить всё
using UnityEngine;
using System.Collections;

public class RotateArrowScript : MonoBehaviour {
  /// <summary>
    /// Put this on guiTexture (GameObject) and set Transform node to (t000,r000,s001);
    /// </summary>
   static public bool DownArrowObject=false;
   public Texture2D tex;// Texture manipulator
   float angle;//
   public GameObject RotateArrow;// Rotate object
   public GameObject mainCam;// Main Camera
   public float rSpeed=0.01f;// speed of rotate
   float iniAngle=0;// Initial angle of GUI
   Rect mainRect;
   Vector3 centerOfGUI;//center point of GUI
   Vector3 centerRotateOfGUI;//center point of Rotate
   Vector3 defferenseVector;
   float vert;//Vertical sign
   float goriz;//Horizontal sign
   
   
   void Start(){
      mainCam=GameObject.Find("Main Camera") as GameObject;
      mainRect = guiTexture.pixelInset; mainRect.y = Screen.height - mainRect.y-mainRect.height;
      centerOfGUI=new Vector3(mainRect.x+mainRect.width/2,Screen.height-mainRect.y+mainRect.height/2,1);
      centerRotateOfGUI=new Vector2(mainRect.x+mainRect.width/2,mainRect.y+mainRect.height/2);
   }
   
   
   ////////////////////////////////////////////////
   /// Deactivate Camera
   ////////////////////////////////////////////////
   
   void OnMouseDown(){
   DownArrowObject=true;
   }
   
   void OnMouseUp(){
   DownArrowObject=false;
   angle=0;
   }
   
   //////////////////////////////////////////////////
   
   
    void OnMouseDrag(){
    defferenseVector = Input.mousePosition-centerOfGUI;
    vert=Mathf.Clamp(defferenseVector.y,-1,1);// get sign
    goriz=Mathf.Clamp(defferenseVector.x,-1,1);
    angle=(Input.GetAxis("Mouse X")*vert+(-Input.GetAxis("Mouse Y"))*goriz)*rSpeed;
   
    }
   
    void OnGUI(){
       Matrix4x4 iniMatrix=GUI.matrix;
       
       iniAngle+=angle;
      GUIUtility.RotateAroundPivot(iniAngle,centerRotateOfGUI);//Change GUI matrix
      GUI.DrawTexture(mainRect,tex);
      RotateArrow.transform.Rotate(0,0,angle);
      ///There restore the initial GUI.matrix for future elements from iniMatrix;
      GUI.matrix=iniMatrix;
      
   }
}
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: GUI вращение/Rotate GUI

Сообщение Neodrop 08 апр 2009, 20:36

Вариант 3. Добавлен ресет по двойному клику на текстуре.

Код: Выделить всё
using UnityEngine;
using System.Collections;

public class RotateArrowScript : MonoBehaviour {
  /// <summary>
    /// Put this on guiTexture (GameObject) and set Transform node to (t000,r000,s001);
    /// </summary>
   static public bool DownArrowObject=false;
   public Texture2D tex;// Texture manipulator
   float angle;//
   public GameObject RotateArrow;// Rotate object
   public GameObject mainCam;// Main Camera
   public float rSpeed=0.01f;// speed of rotate
   float iniAngle=0;// Initial angle of GUI
   Rect mainRect = new Rect(680,50,74,74); //Main rectangle of all GUI
   Vector3 centerOfGUI;//center point of GUI
   Vector3 centerRotateOfGUI;//center point of Rotate
   Vector3 defferenseVector;
   float vert;//Vertical sign
   float goriz;//Horizontal sign
   static public bool reset = false;
   
   bool clicked = false;
   float lastClickedTime = 0.0f;
   
   Quaternion resetRot;
   
   void Start(){
      mainCam=GameObject.Find("Main Camera") as GameObject;
      mainRect = guiTexture.pixelInset; mainRect.y = Screen.height - mainRect.y-mainRect.height;
      centerOfGUI=new Vector3(mainRect.x+mainRect.width/2,Screen.height-mainRect.y+mainRect.height/2,1);
      centerRotateOfGUI=new Vector2(mainRect.x+mainRect.width/2,mainRect.y+mainRect.height/2);
      resetRot = RotateArrow.transform.rotation;
   }
   
   public static void DoubleClick()
   {
      if (DownArrowObject) reset = true;
   }
   
   
   ////////////////////////////////////////////////
   /// Deactivate Camera
   ////////////////////////////////////////////////
   
   void OnMouseDown(){
   DownArrowObject=true;
   if(clicked)
        {         
            if (Time.time - lastClickedTime > 0.5f)
            {
                 //too long, so set this as a first click
                 clicked = true;
                 lastClickedTime = Time.time;
            }
            else
            {
                 //it was a double click!
                 clicked = false;
                 lastClickedTime = 0.0f;
                 DoubleClick();
            }
        }
        else
        {
            clicked = true;
            lastClickedTime = Time.time;
        }
   }
   
   void OnMouseUp(){
   DownArrowObject=false;
   angle=0;
   }
   
   //////////////////////////////////////////////////
   
   
    void OnMouseDrag(){
    defferenseVector = Input.mousePosition-centerOfGUI;
    vert=Mathf.Clamp(defferenseVector.y,-1,1);// get sign
    goriz=Mathf.Clamp(defferenseVector.x,-1,1);
    angle=(Input.GetAxis("Mouse X")*vert+(-Input.GetAxis("Mouse Y"))*goriz)*rSpeed;
   
    }
   
    void OnGUI(){
       Matrix4x4 iniMatrix=GUI.matrix;
       if (!reset)
      {
         iniAngle+=angle;
         GUIUtility.RotateAroundPivot(iniAngle,centerRotateOfGUI);//Change GUI matrix
         
         GUI.DrawTexture(mainRect,tex);
         RotateArrow.transform.Rotate(0,0,angle);
         ///There restore the initial GUI.matrix for future elements from iniMatrix;
         GUI.matrix=iniMatrix;
         return;
      }
      iniAngle=0;
      GUIUtility.RotateAroundPivot(0,centerRotateOfGUI);//Change GUI matrix
      GUI.DrawTexture(mainRect,tex);
      GUI.matrix=iniMatrix;
      
      RotateArrow.transform.rotation = resetRot;
      reset = false;
   }
}
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: GUI вращение/Rotate GUI

Сообщение fox 09 апр 2009, 12:59

Вот упрощенный вариант, просто поворот текстуры на определенный угол

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

public class RotateArrowScript : MonoBehaviour {
        public float angle;
        public Rect mainRect;
        public Texture guiTextur;
       
        Vector3 centerRotateOfGUI;//center point of Rotate
       
        void Start(){
        centerRotateOfGUI = new Vector2(mainRect.x + mainRect.width / 2, mainRect.y + mainRect.height / 2);
        }
   
        void OnGUI(){
        Matrix4x4 iniMatrix = GUI.matrix;
        GUIUtility.RotateAroundPivot(angle, centerRotateOfGUI);//Change GUI matrix
        GUI.DrawTexture(mainRect, guiTextur);
        ///There restore the initial GUI.matrix for future elements from iniMatrix;
        GUI.matrix = iniMatrix;    
        }
}
Добавить foxumkov в Skype
Мои проекты:
Turbodrive
Изображение

Изображение
Аватара пользователя
fox
UNITрон
 
Сообщения: 255
Зарегистрирован: 07 ноя 2008, 13:02
Откуда: Питер
  • ICQ

Re: GUI вращение/Rotate GUI

Сообщение janua 10 мар 2010, 11:46

А как это поставить?
На GuiTexture пишет, что не ставит, копирую текстом просто в яваскрипт - выдает кучу ошибок.
Можно подробнее как сделать саму сцену с вращением, чтобы с привязкой к объекту?
janua
UNец
 
Сообщения: 25
Зарегистрирован: 18 фев 2010, 18:09

Re: GUI вращение/Rotate GUI

Сообщение janua 10 мар 2010, 16:51

Переименовал скрипт в "Rotate Arrow Script" - теперь могу добавлять к объектам и выбирать в параметрах текстуру, объект и камеру, но все равно ничего не происходит и пишет одну ошибку:
"There are inconsistent line endings in the 'Assets/RotateArrowScript.cs' script. Some are Mac OS X (UNIX) and some are Windows.
This might lead to incorrect line numbers in stacktraces and compiler errors. Unitron and other text editors can fix this using Convert Line Endings"

Может, кто знает, чего с этим всем делать?
janua
UNец
 
Сообщения: 25
Зарегистрирован: 18 фев 2010, 18:09

Re: GUI вращение/Rotate GUI

Сообщение Serge 10 мар 2010, 19:28

А нечего, что скрипт написан на шарпе, и что имя скрипта должно быть без пробелов? Научитесь сначала работать со скриптами, делать свои, потом уже беритесь за чужие. Каков вопрос, таков ответ.
Сообщение об ошибке, у вас кстати просто предупреждение, в полнее читаемо переводится любым переводчиком.
О, сколько нам открытий чудных Готовят просвещенья дух И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель.
Аватара пользователя
Serge
UNIверсал
 
Сообщения: 476
Зарегистрирован: 20 мар 2009, 15:53
Откуда: Сибирь г. Омск
  • Сайт
  • ICQ

Re: GUI вращение/Rotate GUI

Сообщение warr11r 10 мар 2010, 19:36

Скопируйте текст в Блокнот, а затем обратно в чистый скрипт. Ваш интерпретатор смущает то, что строки заканчиваются разными типами перехода каретки на новую строку.
Мудрость - это когда начинаешь понимать, что все время занимаешься какой-то х...ней.
Изображение
Аватара пользователя
warr11r
UNITрон
 
Сообщения: 310
Зарегистрирован: 06 июн 2009, 03:21
Откуда: Украина, Ровно
  • ICQ

Re: GUI вращение/Rotate GUI

Сообщение Neodrop 10 мар 2010, 21:23

Не слушайте кривых советов. Line Ending настраивается в редакторе кода. Выставьте "Windows"
Где настраивается - это зависит от редактора кода. Если вы используете UniSciTE то ищите в Text (кажется). Если Visual Studio то "Файл-Дополнительные параметры сохранения"
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: GUI вращение/Rotate GUI

Сообщение gnoblin 10 мар 2010, 22:26

Serge злой :D .
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: GUI вращение/Rotate GUI

Сообщение janua 11 мар 2010, 17:38

О, пасибки, ошибки хоть исчезли! Я использую UniSciTE. Где меняется на Windows не нашел, но убрал все комменты и ошибок больше нет.
Только вот от этого ничего не изменилось.
Я создаю , Cube и GuiTexture, на последнюю накладываю данный скрипт, меняю параметры Transform в GUITexture на значения 000 - 000 - 001 (если я правильно понял "Transform node to (t000,r000,s001)"). Во вкладке параметров скрипта для "Rotate Arrow" ставлю Cube, а для Main Cam соответственно Main Camera. С параметром "Tex" я вообще не знаю что делать потому, что чего бы я туда не совал - отображается только та карта, что выбрана в параметрах самой GUITexture.
А при нажатии на Play вижу куб, естественно и текстуру, что установлена для GUITexture. Но она никак не функционирует...

Напишите, плиз, юнцу чего не так и как его найдо делать-то!
janua
UNец
 
Сообщения: 25
Зарегистрирован: 18 фев 2010, 18:09

Re: GUI вращение/Rotate GUI

Сообщение Serge 11 мар 2010, 19:33

Выложите пример того, что сотворили, посмотрим, что не получается.
Кстати, про какой вариант скрипта идет речь? :)
О, сколько нам открытий чудных Готовят просвещенья дух И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель.
Аватара пользователя
Serge
UNIверсал
 
Сообщения: 476
Зарегистрирован: 20 мар 2009, 15:53
Откуда: Сибирь г. Омск
  • Сайт
  • ICQ

Re: GUI вращение/Rotate GUI

Сообщение janua 14 мар 2010, 19:28

спасибо всем! Уже разобрался.
janua
UNец
 
Сообщения: 25
Зарегистрирован: 18 фев 2010, 18:09

Re: GUI вращение/Rotate GUI

Сообщение Neodrop 14 мар 2010, 23:44

Добавить в название темы (РЕШЕНО)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

След.

Вернуться в Исходники (Копилка)

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

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