2015-10-14 57 views
0

我一直在谷歌搜索幾個小時試圖保持雲的位置時重新加載它的場景,但仍然沒有運氣。Unity3D - 保持雲位置

你能指出我的錯誤嗎?

using UnityEngine; 
using System.Collections; 

public class MenuScript : MonoBehaviour { 

public Transform[] clouds; 
public float speed = 0.2f; 

void Update() { 
    for(int i = 0; i < instance.clouds.Length; i++){ 
     if(instance.clouds[i].position.x >= 10f){ 
      instance.clouds[i].position = new Vector3(-10f, instance.clouds[i].position.y, 0); 
     } 
     Vector3 vec = instance.clouds[i].position; 
     vec.x += speed * Time.deltaTime; 
     instance.clouds[i].position = vec; 
    } 
} 

static MenuScript instance; 

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

回答

0

用戶PlayerPrefs更換DontDestroyOnLoad:

PlayerPrefs.SetFloat("x", 10.0f); 

來獲取值後面,用

PlayerPrefs.GetFloat("x"); 

的PlayerPrefs商店和訪問遊戲會話之間玩家的喜好。

  • 在Mac OS X PlayerPrefs存儲在〜/庫/ Preferences文件夾中,一個名爲統一的文件。[公司名稱] [產品名稱]的.plist,其中公司和產品名稱是名在「項目設置」中設置。在編輯器和獨立播放器中運行的兩個項目都使用相同的.plist文件。

  • 在Windows上,PlayerPrefs存儲在HKCU \ Software [公司名稱] [產品名稱]鍵的註冊表中,其中公司名稱和產品名稱是Project Settings中設置的名稱。

  • 在Linux上,可以在〜/ .config/unity3d/[CompanyName]/[ProductName]中再次使用Project Settings中指定的公司和產品名稱找到PlayerPrefs。

  • 在Windows應用商店的應用程序,播放器偏好設置中可以找到%USERPROFILE%\應用程序數據\本地\封裝[ProductPackageId]> \ LocalState \ playerprefs.dat

+0

這是一個不錯的選擇,但我想了解'DontDestroyOnLoad'的工作原理。謝謝! – Jim

+0

這是**使用DontDestroyOnLoad不是一個好習慣**,這已經在別處討論過了。 – David

+0

爲什麼使用'DontDestroyOnLoad'不再是一個好習慣? – Jim

0

這可能取決於如何將雲陣列正在填充。 MenuScript類可能不會被銷燬,但個別雲可能會被銷燬並重新加載。

如果所有需要保存的是雲的位置,您可以創建一個數組來存儲每個雲在MenuScript上的位置,以確保保存這些值。

+0

場景中已經有5個雲。我只是將它們填充到'MenuScript'類中。 我該怎麼做才能讓雲陣列不被破壞? 謝謝。 – Jim

+0

編輯答案顯示如何設置每個不會在加載時被破壞。 –

+0

這是我得到的結果:''Transform'類型的對象已被銷燬,但您仍然試圖訪問它。 你的腳本應該檢查它是否爲空或者你不應該銷燬該對象。# – Jim

0

終於找到了這個問題的解決方法:

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

public class MenuScript : MonoBehaviour { 

public Transform[] clouds; 
public float speed = 0.2f; 

public static List<Vector3> cloudsPositions; 

void Start(){ 
    if(cloudsPositions == null){ 
     cloudsPositions = new List<Vector3>(); 
     for(int i = 0; i < clouds.Length; i++){ 
      cloudsPositions.Add(clouds[i].transform.position); 
     } 
    }else{ 
     for(int i = 0; i < clouds.Length; i++){ 
      clouds[i].position = cloudsPositions[i]; 
     } 
    } 
} 

public void UpdateCloudsPositions(){ 
    cloudsPositions.Clear(); 
    for(int i = 0; i < clouds.Length; i++){ 
     cloudsPositions.Add(clouds[i].transform.position); 
    } 
} 

void Update() { 
    for(int i = 0; i < clouds.Length; i++){ 
     if(clouds[i].position.x >= 10f){ 
      clouds[i].position = new Vector3(-10f, clouds[i].position.y, 0); 
     } 
     Vector3 vec = clouds[i].position; 
     vec.x += speed * Time.deltaTime; 
     clouds[i].position = vec; 
    } 
} 
} 

我所做的就是我存儲在Start功能雲position靜態列表,以便當場景被重新加載,該腳本將更新自己的立場。

感謝所有協助我的人:)