You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:55:30