Unity3D - 保持云位置

时间:2015-10-14 04:33:44

标签: 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);
     }
 }
}

3 个答案:

答案 0 :(得分:0)

用户PlayerPrefs替换DontDestroyOnLoad:

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

要获取值,请使用

PlayerPrefs.GetFloat("x");
  

PlayerPrefs在游戏会话之间存储和访问玩家偏好。

  • 在Mac OS X上,PlayerPref存储在〜/ Library / Preferences文件夹中,名为unity。[公司名称]。[产品名称] .plist,其中公司和产品名称是设置的名称项目设置。相同的.plist文件用于在编辑器和独立播放器中运行的两个项目。

  • 在Windows上,PlayerPrefs存储在HKCU \ Software [公司名称] [产品名称]键下的注册表中,其中公司和产品名称是在项目设置中设置的名称。

  • 在Linux上,可以使用项目设置中指定的公司和产品名称再次在〜/ .config / unity3d / [CompanyName] / [ProductName]中找到PlayerPref。

  • 在Windows应用商店应用中,可在%userprofile%\ AppData \ Local \ Packages [ProductPackageId]&gt; \ LocalState \ playerprefs.dat

  • 中找到播放器首选项

答案 1 :(得分:0)

这可能取决于云阵列的填充方式。可能不会破坏MenuScript类,但可能会破坏并重新加载各个云。

如果所有需要保存的是云的位置,您可以创建一个数组来存储MenuScript上每个云的位置,以确保保存这些值。

答案 2 :(得分: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;
    }
}
}

我做的是我存储了云彩&#39; position到静态列表,所以当重新加载场景时,脚本会更新Start函数的位置。

感谢所有帮助我的人:)