保存首选项并在其他平台中使用它们

时间:2018-01-04 21:04:06

标签: c# unity3d

我想询问是否可以在Unity编辑器中保存首选项,并在构建项目时使用它们并从其他平台访问它们。

例如,我设置了n = 5,然后在统一编辑器中使用playerprefs保存它,然后我想在构建项目时在其他平台上获得相同的整数。

有没有办法解决这类问题?

2 个答案:

答案 0 :(得分:2)

听起来您最好使用JSON并序列化数据。在桌面中,Unity将PlayerPrefs保存到注册表中。在Android中,它会保存到清单文件中。所以,换句话说..不,PlayerPrefs不是一个跨平台的事情。此外,如果这是“保存游戏”数据,您应该知道PlayerPrefs用于存储简单数据,如“选项”菜单。为了保存整个保存游戏文件,您将需要使用更强大的东西。

答案 1 :(得分:1)

听起来您想要的是将数据(示例中的n的值)转换为构建中的资源。
PlayerPrefs不符合您的需要,因为它不会在构建时创建可在运行时加载的资产。相反,它用于将运行时生成的数据序列化到用户的设备并在应用程序会话中使用(通过会话,我指的是从启动到退出应用程序的时间)。

我的建议是找到将您的数据序列化为Unity可以阅读的资产。至少有两种方法可以做这样的事情:

  1. 使用ScriptableObjectScriptableObject是一个继承自UnityEngine.Object的类,用于将数据序列化为资产。这是一个简单的例子:

    [CreateAssetMenu("my_data.asset", "My Data")]
    public class Data : ScriptableObject
    {
        [SerializeField]
        private int _n;
    
        [SerializeField]
        private string _someString;
    
        public int N { get { return _n; }}
        public string SomeString { get { return _someString; }}
    }
    

    正常用法是定义继承自Data的数据类,例如ScriptableObject。然后,您将所需数据作为序列化字段(此处为_n_someString)放入其中。属性CreateAssetMenu用于在Unity编辑器中创建菜单项,以便您创建资产 完成此操作后,您可以使用MonoBehaviour中的数据,通过标有[SerializeField]的字段引用它,就像任何其他Unity资源(如材料或精灵)一样:

    public class SomeMono : MonoBehaviour
    {
        [SerializeField]
        private Data _data;
    
        void Awake()
        {
            Debug.Log("Data.SomeString is " + _data.SomeString);
        }
    }
    
  2. 将数据序列化为您自己的格式(JSON,BSON,XML,无论您喜欢什么)并保存并以TextAsset的形式回读。这是一个例子:

    public class SomeMono2 : MonoBehaviour
    {
        [SerializeField]
        private TextAsset _text;
    
        void Awake()
        {
            // Assumes that the data is just a plain string sequence.
            // However, it could be any text data you like.
            Debug.Log(_text.text);
            // Or you can serialize your data as bytes
            // byte[] byteData = _text.bytes
        }
    }
    

    请注意,Unity仅会自动识别扩展名为txt的文件(可能json?对此文件不太确定)作为文字资源。