所以我想要完成的是当我加载一个场景时,我想让某些对象处于活动或非活动状态,具体取决于它们保存在我的文件中的信息。
示例:
在我的游戏中,当我加载我的一个场景时,有一面墙,然后我将一个书柜推到某个点并触发墙被设置为不活动状态。我退出这个场景并回到现场,墙再次活动。我想要的是当墙被设置为非活动状态时,即使我离开场景也会保持不活动状态,并且当我稍后回到现场时它不会出现。
我遇到的麻烦是如何做到这一点。我现在所拥有的是当玩家点击“新游戏”时#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等...)但即使我创建了大量的脚本来执行此操作,我也无法找到保存游戏对象状态的方法。
您将如何处理和传递此类数据?
答案 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
类。
包含数组的完整工作示例: