2016-09-21 2 views
0

Я хочу показать имя игрока и название команды на нескольких уровнях. Я создал игровой объект с singleton, который вызывает servidor для загрузки этих переменных. Он работает на первом уровне, но не в других. Gameobject сохраняется, но не сохраняет имя игрока и имя_группы. Как я могу его получить?Текстовые переменные не сохраняются на нескольких уровнях

Это мой код:

using UnityEngine; 
using UnityEngine.UI; 
using System.Collections; 


public class GlobalControl2 : MonoBehaviour 
{ 
private static GlobalControl2 instance = null; 

private Text PlayerName; 
private Text TeamName; 

void Awake() 
{ 
    if (instance == null) 
    { 
     instance = this; 
     DontDestroyOnLoad(this.gameObject); 
    } 
    else 
    { 
     Destroy(this.gameObject); 
    } 
} 

public void Start() 
{ 

    PlayerName = GameObject.Find ("PlayerName").GetComponent<Text>(); 
    TeamName = GameObject.Find ("TeamName").GetComponent<Text>(); 

    new GameSparks.Api.Requests.AccountDetailsRequest() 
     .SetDurable(true) 
     .Send ((response) => { 
      PlayerName.text = response.DisplayName; 
     } ); 

    new GameSparks.Api.Requests.GetMyTeamsRequest() 
     .SetDurable(true) 
     .Send(teamResp => { 
      if(!teamResp.HasErrors) 
      { 
       foreach(var teams in teamResp.Teams) 
       { 
        Debug.Log("Equipo: " + teams.TeamId); 
        TeamName.text = teams.TeamId; 

       } 

      } 
     } ); 
} 
} 

ответ

0

В настоящее время вы пытаетесь сохраняться Scene определенных объектов в течение нескольких сцен

Типа данных «Текст» является объектом единства.

Попробуйте использовать «String» вместо этого, в примере сильфонные вы увидите, что PersistentPlayerName и PersistentTeamName будет доступна в следующей сцене и Playername и TeamName не будет. Это всегда риск того, что многоэлементные синглтоны.

Пожалуйста, обратите внимание, что это не должно потребоваться, если PlayerName и TeamName находится на том же GameObject как GlobalControl2 (тот, который вы называете DontDestroyOnLoad на)

Я не утверждаю, что вы делаете это именно так, как он набран ниже, но этого должно быть достаточно, чтобы указать вам правильный путь, если нет, добавьте комментарий, и я объясню дальше.

using UnityEngine; 
using UnityEngine.UI; 
using System.Collections; 


public class GlobalControl2 : MonoBehaviour 
{ 
private static GlobalControl2 instance = null; 

private string PersistentPlayerName; 
private string PersistentTeamName; 

private Text PlayerName; 
private Text TeamName; 

void Awake() 
{ 
    if (instance == null) 
    { 
     instance = this; 
     DontDestroyOnLoad(this.gameObject); 
    } 
    else 
    { 
     Destroy(this.gameObject); 
    } 
} 

public void Start() 
{ 

    PlayerName = GameObject.Find ("PlayerName").GetComponent<Text>(); 
    TeamName = GameObject.Find ("TeamName").GetComponent<Text>(); 

    new GameSparks.Api.Requests.AccountDetailsRequest() 
     .SetDurable(true) 
     .Send ((response) => { 
      PlayerName.text = PersistentPlayerName = response.DisplayName; 
     } ); 

    new GameSparks.Api.Requests.GetMyTeamsRequest() 
     .SetDurable(true) 
     .Send(teamResp => { 
      if(!teamResp.HasErrors) 
      { 
       foreach(var teams in teamResp.Teams) 
       { 
        Debug.Log("Equipo: " + teams.TeamId); 
        TeamName.text = PersistentTeamName = teams.TeamId; 

       } 

      } 
     } ); 
} 
} 
+0

Yeeeees !! Оно работает!! Огромное спасибо. И как я могу сделать, если я не хочу показывать это на всех экранах? Как я могу исключить несколько сцен? – Angelsm

+0

К сожалению, это не так, как работает статика, статический класс всегда будет присутствовать, как только он будет инициализирован, если вы не установите его нулевым, это как раз то, как C# работает и не имеет ничего общего с Unity perse. (Если ответ выше помог вам, отметьте его как ответ) –

+0

Еще раз спасибо! – Angelsm