2017-08-20 7 views
2

私はネッセサーリ時に新しいシーンを読み込むgameobjectを持っています。ゲームオブジェクトに添付されたスクリプトには、キャンバス要素への参照を保持する変数があります(キャンバス要素にはプログレスバーがあります)。問題は、新しいシーンをロードしてそのシーンに新しいシーンをロードした後に、彼をDontDestroyOnLoadに設定できないため、キャンバスオブジェクトへの参照が失われることです。キャンバスは新しいシーンにロードされた後に有効にしません。

私は私が失った警告を受けるいけないことをやった後に私が行っていることは、私は..破壊されますdoesntのゲームオブジェクトの子として()(スタート機能でコメント行を参照)canvas要素を入れていますオブジェクトリファレンスは、setNewNameAndLoadScene()関数でキャンバスを有効にすることはありません。

私が有効にしていることは、GUIが画面に表示されないことですが、それはhirarchyにあります。私はそれがヌルであるかどうかを調べた。プログラムは問題なく行のコードを実行しますが、キャンバスはゲーム画面に表示されません。

2回目の編集:(ロード時に)新しいロードされたシーンのキャンバスに私のキャンバス(ゲームオブジェクトの子である)私のキャンバスを見せてくれたのです。私が私に尋ねるのは、それをシーンのキャンバスに入れると、なぜそれが表示されるのかということです。私は、シーンのキャンバスに私の最初のシーン私のキャンバス波平をロードしますが、まだ簡単にシングルトンを作成し、スライダーの公共ゲームオブジェクト参照を取得するために以下のコードを使用するか、あなたがしたいものは何でも

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

public class SceneLoaderGameObject : MonoBehaviour { 


private SceneLoader sl; 
public Canvas cav; //loses reference when loading new scene 

void Start() { 
    sl = new SceneLoader(); 
    cav.GetComponent<Canvas>().enabled = false; 
    DontDestroyOnLoad (this.gameObject); 
    DontDestroyOnLoad (this); 
    DontDestroyOnLoad (this.gameObject.transform.GetChild(0).GetComponent<Canvas>()); 
} 

public void setNewNameAndLoadScene(string name){ 

    if(name.Length ==0) 
     throw new UnityException("length 0"); 

    if (cav != null) { 
     Slider slid = cav.transform.GetChild (1).GetComponent<Slider>(); 
     Text tx = cav.transform.GetChild (2).GetComponent<Text>(); 
     Button bttn = cav.transform.GetChild (3).GetComponent<Button>(); 

     sl.setNewScene (name); 
     sl.setSliderAndTextToChange (slid, tx); 
     bttn.onClick.AddListener (() => activateNewScene()); 
     cav.GetComponent<Canvas>().enabled = true; 
     StartCoroutine (sl.LoadAsynchron (name, bttn)); 

    } 

} 

public void activateNewScene(){ 
    sl.AsgetOP().allowSceneActivation=true; 

} 
} 
+1

詳細はご質問ください。 「有効にしない」とはどういう意味ですか? 'Debug.Log'を使って正確に何が起こっているのかを見てください。キャンバス変数がnullかどうかを確認します。エディタをチェックして、キャンバスオブジェクトが階層にまだ残っているかどうかを教えてください。これらをあなたの質問に加えてください。私たちのお手伝いをしてください。 – Programmer

+0

@Programmerホープそれhelrs – TiZaLjubavNisiRodjena

+0

@Programmerまたは私のキャンバスへの参照を失うことはできません。だから私はそれを子供にする必要はありません。だから私はそれがキャンバスであるように私が有効/無効にする保存された変数のように常にそれを使用することができます – TiZaLjubavNisiRodjena

答えて

1

gamescreenにプログレスバーを示しています前に、シーン読み込み時に有効/無効を切り替えます。たとえば、キャンバスのコンポーネントを制御するゲームマネージャがある場合は、シングルトンオブジェクトと参照オブジェクトの両方を1つずつ作成します。コードのソースはhereです。

public class SceneLoaderSingleton : MonoBehaviour 
{ 

    //Static instance of SceneLoaderSingleton which allows it to be accessed by any other script. 
    public static SceneLoaderGameObject instance = null;  

    //Awake is always called before any Start functions 
    void Awake() 
    { 
     //Check if instance already exists 
     if (instance == null) 

      //if not, set instance to this 
      instance = this; 

     //If instance already exists and it's not this: 
     else if (instance != this) 

      //Then destroy this. This enforces singleton pattern, meaning there can only ever be one instance of a SceneLoaderSingleton. 
      Destroy(gameObject);  

     //Sets this to not be destroyed when reloading scene 
     DontDestroyOnLoad(gameObject);    
    } 
関連する問題