在Unity中的场景中保存并加载游戏对象的状态

时间:2016-04-14 08:42:47

标签: unity3d

所以我想要完成的是当我加载一个场景时,我想让某些对象处于活动或非活动状态,具体取决于它们保存在我的文件中的信息。

示例:

在我的游戏中,当我加载我的一个场景时,有一面墙,然后我将一个书柜推到某个点并触发墙被设置为不活动状态。我退出这个场景并回到现场,墙再次活动。我想要的是当墙被设置为非活动状态时,即使我离开场景也会保持不活动状态,并且当我稍后回到现场时它不会出现。

我遇到的麻烦是如何做到这一点。我现在所拥有的是当玩家点击“新游戏”时#34;按钮我生成一个新的Game_Info并选择Default():

[Serializable]
public class Game_Info {

    public bool WoodWallEnabled;

    public void Default(){
        WoodWallEnabled = true;
    }
}

我的WoodWall脚本:

public class Get_WoodWall_Info : MonoBehaviour {

    void Awake () {
        gameObject.SetActive (Helper_Manager.instance.gameInfo.WoodWallEnabled);
    }
}

我有一种感觉,我没有以正确的方式做到这一点,并且有更好的方法来处理这个问题,特别是因为这样做需要为每个游戏对象提供一个独特的脚本,我想通过我保存的文件进行操作( Get_WoodWall_Info,Get_WoodWall_Info1等...)但即使我创建了大量的脚本来执行此操作,我也无法找到保存游戏对象状态的方法。

您将如何处理和传递此类数据?

2 个答案:

答案 0 :(得分:1)

我认为PlayerPref在这种情况下是一个不错的选择。 你可以这样做:

  • 致电PlayerPrefs.SetInt("wall enabled", active ? -1 : 0);以保存木墙的状态active是墙的状态。

  • Get_WoodWall_Info中,不使用帮助管理器中的值,而是使用 PlayerPrefs.GetInt("wall enabled") != 0

PlayerPrefs中的值将通过游戏会话保存,因此您可能希望在开始新游戏时将wall enabled键设置为0.

修改

@JoeyL为什么不为所有游戏对象创建一个脚本,如下所示:

public class StateHandler : MonoBehaviour {
    void Awake () {
        string keyName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name + gameObject.name;
        if (PlayerPrefs.GetInt(keyName) == 0)
            gameObject.SetActive(false);
    }
    public void SetActiveState (bool state) {
        string keyName = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name + gameObject.name;
        PlayerPrefs.SetInt(keyName, state ? -1 : 0);
        gameObject.SetActive(state);
    }
}

这将使用您当前的场景名称和附加的游戏对象名称作为键,因此您只需要确保使用此脚本的所有游戏对象都有不同的名称。

答案 1 :(得分:1)

如果您只保存WoodWallEnabled变量,那么只需使用PlayerPref,如上所述。现在,如果要保存整个场景信息,例如对象位置或Game_Info类中的每个变量,则必须使用{{将转换为 Json 1}},然后使用JsonUtility.ToJson 保存。然后要加载它,您可以使用PlayerPref加载它,然后使用PlayerPref将其序列化回Game_Info类。

包含数组的完整工作示例:

Serialize and Deserialize Json and Json Array in Unity