2015-09-07 4 views
0

Dans mon jeu 2D le joueur devrait être capable de faire pivoter une image UI basée sur une fonction de souris, puis appuyez sur le bouton "Go" pour démarrer le niveau, et après cela, le bouton "Retour" sur le niveau devrait prendre la retour à la scène principale (celle qui a l'image de l'interface utilisateur), l'image doit donc être affichée dans la même dernière rotation que le joueur a définie pour elle. Tout fonctionne parfaitement bien pour moi, sauf pour la partie de chargement de la rotation de l'image. J'ai pu voir la valeur de rotation correcte dans la console, mais je ne vois pas de rotation sur l'image lorsque je reviens de l'autre scène. J'ai essayé de faire tellement de tentatives pour que ça marche mais ça n'obtient pas de bons résultats. Ce sera tellement apprécié si vous m'aidez à fêter mon anniversaire demain!Comment enregistrer une rotation d'image de l'interface utilisateur et la charger lors du retour d'une scène différente dans Unity3D?

J'espère que cela vous expliquera mieux ce que je suis en train de faire:

  1. première scène où la place est l'interface utilisateur image et le bouton Go est sous

  2. Après l'utilisateur fait glisser l'image , il obtient une nouvelle rotation. Ensuite, le joueur clique sur le bouton Go, la rotation est enregistrée et une nouvelle scène sera affichée. Et puis il y a une deuxième scène qui a le bouton Retour (cela amène l'utilisateur à la scène principale et devrait afficher l'image de l'IU tournée en fonction de l'entrée du dernier utilisateur). Le problème est qu'il n'y a aucune rotation affichée sur l'image de l'interface utilisateur.

Et voici le code que je l'ai utilisé pour l'interface utilisateur Rotation d'image:

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); 

} 

Et ceci est le code attribué au bouton "Go" dans la première scène:

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"); 
} 

Et le code attribué au bouton "Retour" dans la seconde scène:

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

Vous ne voyez pas l'image pivotée, car vous ne l'avez pas fait pivoter. Vous avez Vector3, mais vous n'avez pas assigné (simplement imprimé) à l'objet gameobject dans votre script pour le bouton "Retour". – buxter

+0

@buxter J'ai essayé de l'assigner dans le BackButtonScript mais chaque fois que je reçois ce message d'erreur: NullReferenceException: La référence d'objet n'est pas définie sur une instance d'un objet. Et j'ai utilisé ce script: ImgRotation temp = this.GetComponent (); \t \t Vecteur3 imgTrans; \t \t imgTrans = temp.img.transform.rotation.eulerAngles; \t \t imgTrans.z = imgRot.z; – Maryoomi1

+0

Pouvez-vous coller le script entier, s'il vous plaît? De plus, ImgRotation -> c'est votre script, pas une image. – buxter

Répondre

0

La raison pour laquelle vous ne voyez pas la rotation est que vous ne la définissez jamais sur l'objet image réel. Vous ne pouvez pas faire cela à partir du bouton de retour, car l'objet image n'existera pas dans cette scène.

Il suffit de charger les paramètres sur la place Awake:

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

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

Gardez à l'esprit que ce paramètre sera persisté entre le jeu et la fermeture à partir de secours. Si ce n'est pas le comportement que vous recherchez, voir ci-dessous pour un exemple possible sur la façon de conserver ces types de paramètres entre les scènes. Plutôt que d'utiliser les PlayerPrefs pour stocker ces informations entre les scènes, pensez à utiliser un objet qui utilise DontDestroyOnLoad pour conserver les données.

par exemple, vous pourriez avoir un objet dans la scène qui ressemble à ceci:

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; 
      } 
     } 
    } 
} 

Puis, à l'intérieur du script sur l'image que vous tourner, vous souhaitez conserver une référence à la RotationStorage gameobject et stocker votre rotation en cours en ce que chaque fois OnMouseDrag est appelé:

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); 
} 

pour vous assurer de ne pas obtenir des copies de l'objet RotationStorage, vous voudriez le mettre dans une scène qui ne jamais se charge une fois, c'est-à-dire un écran d'accueil au démarrage.

+0

merci beaucoup pour la grande aide fournie! Je l'apprécie vraiment beaucoup. J'ai déjà essayé une autre solution avant de voir ta réponse et ça a marché pour moi. J'ai également essayé votre solution et j'ai obtenu une exception NullReferenceException sur cette ligne: m_storage.SetRotation (rot) ;. Je vais poster ma réponse maintenant! Merci beaucoup! – Maryoomi1

0

Donc finalement, j'ai résolu mon problème! J'ai ajouté une variable booléenne statique dans le script du bouton Précédent, donc chaque fois que le bouton est pressé et qu'il amène le joueur à la première scène, le booléen devient vrai. Et de l'autre côté dans le script imgRotation j'ai ajouté une fonction Start() donc à chaque fois que la scène commence, elle tournera l'image en fonction de l'entrée du dernier utilisateur.

Donc, c'est le 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"); 
} 

Et c'est le ImgRotation Script:

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); 


} 

Hope it helps! :)