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

Unity中如何创建可全局访问的PlayerData类以跨脚本调用?

实现Unity中跨脚本访问的全局PlayerData类

下面是几种Unity开发中常用的全局类实现方案,直接就能用,不用在其他脚本里重复定义:

1. 单例模式(最常用,适合带MonoBehaviour的场景)

把PlayerData做成单例,确保全局只有一个实例,其他脚本直接通过静态入口访问:

public class PlayerData : MonoBehaviour
{
    // 全局访问的静态实例
    public static PlayerData Instance { get; private set; }

    // 存储已购买技能的字段,根据你的需求调整类型
    public List<string> purchasedSkills = new List<string>();

    void Awake()
    {
        // 保证单例唯一,避免重复创建
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
        }
        else
        {
            Instance = this;
            DontDestroyOnLoad(gameObject); // 场景切换时保留该对象
        }
        // 初始化时加载存档数据
        LoadFromSaveFile(Application.persistentDataPath + "/save.json");
    }

    // 从外部存档文件加载数据的方法
    public void LoadFromSaveFile(string filePath)
    {
        // 这里写读取存档文件并赋值给purchasedSkills的逻辑,比如JSON反序列化
    }
}

使用方式:其他脚本里直接写PlayerData.Instance.purchasedSkills就能访问数据,不用任何额外引用。

2. 静态类(适合无MonoBehaviour依赖的纯数据类)

如果PlayerData不需要挂载到GameObject上,直接做成全静态类,所有字段和方法都是静态的:

public static class PlayerData
{
    // 全局共享的技能数据
    public static List<string> purchasedSkills = new List<string>();

    // 静态加载方法
    public static void LoadFromSaveFile(string filePath)
    {
        // 读取存档逻辑
    }
}

使用方式:直接通过PlayerData.purchasedSkills访问,无需实例化,适合纯数据存储场景,但注意静态数据在游戏重启时会重置,要记得在游戏启动时加载存档。

3. ScriptableObject(适合可配置的全局数据)

如果需要在Unity编辑器里直接编辑初始数据,或者数据需要序列化保存,用ScriptableObject:

[CreateAssetMenu(fileName = "NewPlayerData", menuName = "Game/Player Data")]
public class PlayerData : ScriptableObject
{
    public List<string> purchasedSkills = new List<string>();

    public void LoadFromSaveFile(string filePath)
    {
        // 读取存档逻辑
    }
}

然后在Project窗口右键 → Game/Player Data创建一个PlayerData实例,再写个简单的管理器做全局访问:

public class PlayerDataManager : MonoBehaviour
{
    public static PlayerData Instance;

    [SerializeField] private PlayerData playerDataAsset;

    void Awake()
    {
        Instance = playerDataAsset;
        DontDestroyOnLoad(gameObject);
        Instance.LoadFromSaveFile(Application.persistentDataPath + "/save.json");
    }
}

使用方式:通过PlayerDataManager.Instance.purchasedSkills访问,适合需要编辑器可视化配置初始数据的场景。

注意事项

  • 单例模式要注意避免重复创建对象,用DontDestroyOnLoad保证场景切换时不丢失。
  • 静态类的数据不会自动持久化,必须手动写入外部存档文件。
  • ScriptableObject的资源文件不能直接修改(会改变编辑器里的初始数据),玩家修改后的数据要单独存到外部存档。

内容的提问来源于stack exchange,提问作者G-han

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:38:26