2015-09-07 4 views
0

В моей 2D-игре игрок должен иметь возможность поворачивать изображение пользовательского интерфейса на основе функции перетаскивания мышью, а затем нажать кнопку «Перейти», чтобы начать уровень, и после этого кнопка «Назад» на уровне должна плеер обратно на главную сцену (та, которая имеет изображение пользовательского интерфейса), поэтому изображение должно отображаться в том же последнем вращении, которое игрок установил для него. Все работает фантастически хорошо для меня, за исключением части загрузки вращения изображения. Мне удалось увидеть правильное значение вращения в консоли, однако при возврате с другой сцены я не вижу поворота на изображении. Я пытался сделать так много попыток заставить его работать, но не получал хороших результатов. Это будет так высоко оценено, если вы поможете мне отпраздновать свой день рождения завтра!Как сохранить поворот изображения пользовательского интерфейса и загрузить его при возвращении из другой сцены в Unity3D?

Я надеюсь, что это будет лучше объяснить, что я пытаюсь сделать:

  1. Первая сцена, где квадрат является UI изображения и кнопка Go находится под

  2. После того, как пользователь перетаскивает изображение , он получает новое вращение. Затем игрок нажимает кнопку Go, вращение сохраняется и отображается новая сцена.

  3. А затем есть вторая сцена, в которой есть кнопка «Назад» (она берет пользователя на главную сцену и должна отображать повернутый пользовательский интерфейс, основанный на входе последнего пользователя). Проблема в том, что на изображении пользовательского интерфейса вообще нет никакого вращения.

А вот код, который я использовал для вращения UI Изображение:

public static Quaternion rot; 

public void OnMouseDrag(){ 
     Vector3 pos = Camera.main.WorldToScreenPoint (transform.position); 
     Vector3 dir = Input.mousePosition - pos; 
     float angle = Mathf.Atan2 (dir.y, dir.x) * Mathf.Rad2Deg; 
     transform.rotation = rot; 
     rot = Quaternion.AngleAxis (angle, Vector3.forward); 

} 

И это код, назначенный кнопке «Go» в первой сцене:

public void OnClicked(Button button) 
{ 
    PlayerPrefs.SetFloat ("PlayerX", ImgRotation.rot.eulerAngles.x); 
    PlayerPrefs.SetFloat ("PlayerY", ImgRotation.rot.eulerAngles.y); 
    PlayerPrefs.SetFloat ("PlayerZ", ImgRotation.rot.eulerAngles.z); 
    Application.LoadLevel ("2"); 
} 

И код, присвоенный кнопке «Назад» во втором эпизоде:

public void OnClicked(Button button) 
{ 

    Vector3 imgRot; 
    imgRot = ImgRotation.rot.eulerAngles; 
    imgRot.x = PlayerPrefs.GetFloat ("PlayerX"); 
    imgRot.y = PlayerPrefs.GetFloat ("PlayerY"); 
    imgRot.z = PlayerPrefs.GetFloat ("PlayerZ"); 
    print (imgRot.z); 
    Application.LoadLevel ("1"); 
} 
+0

Вы не видите, что изображение повернуто, потому что вы его не вращали. У вас есть Vector3, но вы не назначили (просто напечатали) его в игровой объект в своем скрипте для кнопки «Назад». – buxter

+0

@buxter Я попытался назначить его в BackButtonScript, но каждый раз, когда я получаю это сообщение об ошибке: NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. И я использовал этот скрипт: ImgRotation temp = this.GetComponent (); \t \t Векторный3 imgTrans; \t \t imgTrans = temp.img.transform.rotation.eulerAngles; \t \t imgTrans.z = imgRot.z; – Maryoomi1

+0

Можете ли вы вставить весь скрипт, пожалуйста? Кроме того, ImgRotation -> это ваш скрипт, а не изображение. – buxter

ответ

0

Причина, по которой вы не видите поворот, заключается в том, что вы никогда не устанавливаете его на фактический объект изображения. Вы не можете сделать это с помощью кнопки «Назад», потому что объект изображения не будет существовать в этой сцене.

Просто загрузите настройки на Пробудитесь вместо:

void Awake() 
{ 
    Vector3 imgRot; 
    imgRot.x = PlayerPrefs.GetFloat ("PlayerX"); 
    imgRot.y = PlayerPrefs.GetFloat ("PlayerY"); 
    imgRot.z = PlayerPrefs.GetFloat ("PlayerZ"); 

    transform.rotation = Quaternion.Euler(imgRot); 
} 

Имейте в виду, что эта установка будет сохраняться между игрой закрытия и запуска резервного копирования. Если это не то поведение, которое вам нужно, см. Ниже пример возможного продолжения этих настроек между сценами.

Вместо того, чтобы использовать PlayerPrefs для хранения этой информации между сценами, подумайте о том, чтобы объект DontDestroyOnLoad сохранял данные.

, например, вы можете иметь объект в сцене, которая выглядит примерно так:

public class RotationStorage : public MonoBehaviour 
{ 
    private Quaternion m_imageRotation = Quaternion.identity; 

    void Awake() 
    { 
     DontDestroyOnLoad(gameObject); 
    } 

    void SetRotation(Quaternion rotation) 
    { 
     m_imageRotation = rotation; 
    } 

    void OnLevelWasLoaded(int level) 
    { 
     if (Application.loadedLevelName == "Your starting scene") 
     { 
      GameObject image = GameObject.Find("name of your object"); 
      //If the rotation hasn't been set yet don't set the image' rotation. 
      if(image != null && m_rotation != Quaternion.identity) 
      { 
       image.transform.rotation = m_imageRotation; 
      } 
     } 
    } 
} 

Затем внутри сценария на изображении вы вращающемся, вы бы сохранить ссылку на RotationStorage геймобжекты и сохранить текущее вращение в том, что всякий раз, когда OnMouseDrag называется:

private RotationStorage m_storage = null; 

void Awake() 
{ 
    m_storage = FindObjectOfType<RotationStorage>(); 
} 

void OnMouseDrag() 
{ 
    Vector3 pos = Camera.main.WorldToScreenPoint (transform.position); 
    Vector3 dir = Input.mousePosition - pos; 
    float angle = Mathf.Atan2 (dir.y, dir.x) * Mathf.Rad2Deg; 
    transform.rotation = rot; 
    rot = Quaternion.AngleAxis (angle, Vector3.forward); 

    m_storage.SetRotation(rot); 
} 

чтобы убедиться, что вы не получаете дубликаты объекта RotationStorage, вы хотите, чтобы установить его в сцене, которая только когда-либо загружается один раз, т.е. заставка при запуске.

+0

большое спасибо за отличную помощь! Я очень, очень ценю это. Я немного попробовал другое решение, прежде чем увидеть ваш ответ, и это сработало для меня. Я также попробовал ваше решение и получил исключение NullReferenceException в этой строке: m_storage.SetRotation (rot) ;. Я отправлю свой ответ прямо сейчас! Спасибо огромное! – Maryoomi1

0

Итак, наконец, я решил, что проблема решена! Я добавил логическую статическую переменную в скрипте Back Button, поэтому всякий раз, когда нажимается кнопка, и игрок переходит на первую сцену, логическое значение вернется. А с другой стороны в сценарии imgRotation я добавил функцию Start(), поэтому всякий раз, когда начинается сцена, она поворачивает изображение на основе ввода последнего пользователя.

Так что это BackButtonScript:

public static Vector3 imgRot; 
[HideInInspector] public static bool loadRot=false; 


public void OnClicked(Button button) 
{ 
    imgRot = ImgRotation.rot.eulerAngles; 
    imgRot.x = PlayerPrefs.GetFloat ("PlayerX"); 
    imgRot.y = PlayerPrefs.GetFloat ("PlayerY"); 
    imgRot.z = PlayerPrefs.GetFloat ("PlayerZ"); 


    loadRot= true; 
    Application.LoadLevel ("1"); 
} 

И это ImgRotation Сценарий:

public static Quaternion rot; 


void Start(){ 

    if (BackButtonScript.loadRot == true) { 
     transform.Rotate(BackButtonScript.imgRot); 

    } 
} 


public void OnMouseDrag(){ 

     Vector3 pos = Camera.main.WorldToScreenPoint (transform.position); 
     Vector3 dir = Input.mousePosition - pos; 
     float angle = Mathf.Atan2 (dir.y, dir.x) * Mathf.Rad2Deg; 
     transform.rotation = rot; 
     rot = Quaternion.AngleAxis (angle, Vector3.forward); 


} 

Надеется, что это помогает! :)

 Смежные вопросы

  • Нет связанных вопросов^_^