Unity C# 3D:如何将GameObject存为预制体并实现字符串列表持久化
Unity 字符串列表持久化方案
以下是几种能实现关闭Unity重启后加载字符串列表的可行方案,优先推荐直接序列化列表的实现方式:
方案1:Json序列化到本地文件(优先选择,直接保存列表)
将List<string>序列化为Json字符串后写入本地文件,加载时反序列化还原列表。Unity自带的JsonUtility或第三方的Newtonsoft.Json都能实现,后者更灵活。
用Unity自带JsonUtility实现(需包装类)
[System.Serializable] public class StringListWrapper { public List<string> stringList; } using System.Collections.Generic; using System.IO; using UnityEngine; public class StringListSaver : MonoBehaviour { private string _savePath; private StringListWrapper _listWrapper; void Awake() { // 保存到Unity跨平台通用的PersistentDataPath目录 _savePath = Path.Combine(Application.persistentDataPath, "StringListSave.json"); _listWrapper = new StringListWrapper(); _listWrapper.stringList = new List<string>(); } // 保存列表 public void SaveStringList(List<string> targetList) { _listWrapper.stringList = targetList; string json = JsonUtility.ToJson(_listWrapper); File.WriteAllText(_savePath, json); } // 加载列表 public List<string> LoadStringList() { if (File.Exists(_savePath)) { string json = File.ReadAllText(_savePath); _listWrapper = JsonUtility.FromJson<StringListWrapper>(json); return _listWrapper.stringList ?? new List<string>(); } return new List<string>(); } }
用Newtonsoft.Json实现(无需包装类,更简洁)
先通过Unity Package Manager安装com.unity.nuget.newtonsoft-json包,再使用以下代码:
using System.Collections.Generic; using System.IO; using UnityEngine; using Newtonsoft.Json; public class StringListSaver : MonoBehaviour { private string _savePath; void Awake() { _savePath = Path.Combine(Application.persistentDataPath, "StringListSave.json"); } public void SaveStringList(List<string> targetList) { string json = JsonConvert.SerializeObject(targetList); File.WriteAllText(_savePath, json); } public List<string> LoadStringList() { if (File.Exists(_savePath)) { string json = File.ReadAllText(_savePath); return JsonConvert.DeserializeObject<List<string>>(json) ?? new List<string>(); } return new List<string>(); } }
方案2:使用PlayerPrefs(适合小型列表)
PlayerPrefs仅支持存储基本类型,可将列表转为分隔符连接的字符串存储,加载时拆分还原。
using System.Collections.Generic; using UnityEngine; public class StringListPlayerPrefs : MonoBehaviour { private const string _saveKey = "SavedStringList"; // 用不会在字符串中出现的分隔符,避免拆分错误 private const string _separator = "###SEP###"; public void SaveStringList(List<string> targetList) { string combinedString = string.Join(_separator, targetList); PlayerPrefs.SetString(_saveKey, combinedString); PlayerPrefs.Save(); // 立即写入磁盘,防止数据丢失 } public List<string> LoadStringList() { if (PlayerPrefs.HasKey(_saveKey)) { string combinedString = PlayerPrefs.GetString(_saveKey); return new List<string>(combinedString.Split(new string[]{_separator}, System.StringSplitOptions.None)); } return new List<string>(); } }
方案3:使用ScriptableObject(适合编辑器/运行时共享的列表)
创建ScriptableObject资产存储列表,编辑器下修改自动保存,运行时修改需手动写入磁盘。
第一步:创建ScriptableObject类
using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "StringListData", menuName = "Custom/String List Data")] public class StringListData : ScriptableObject { public List<string> stringList = new List<string>(); }
在Unity编辑器右键菜单选择Custom -> String List Data创建资产,拖入脚本的对应字段。
第二步:保存加载脚本
using System.Collections.Generic; using UnityEngine; public class StringListScriptableSaver : MonoBehaviour { public StringListData stringListData; // Inspector中拖入创建好的资产 // 保存(编辑器下修改资产自动保存,运行时需手动调用) public void SaveStringList(List<string> targetList) { stringListData.stringList = targetList; #if UNITY_EDITOR UnityEditor.EditorUtility.SetDirty(stringListData); UnityEditor.AssetDatabase.SaveAssets(); #endif } // 加载 public List<string> LoadStringList() { return stringListData?.stringList ?? new List<string>(); } }
注:打包后若需运行时修改并持久化,需结合方案1的Json序列化,将ScriptableObject内容写入本地文件。
内容的提问来源于stack exchange,提问作者Damir Shabayev
相关产品推荐
相关产品推荐

