Unity 2D 学习手札(三) 不同场景间的资料存取

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jasper_ding/article/details/85938298

单一场景( Scene )的数据的存取,在相对应的脚本( Script )中定义成员变量即可,但仅限于此场景中,并不能将这些变量传递到另一个场景。

为了解决不同场景之间数据的传递,以下提供两种解决的方法:

一、使用 PlayerPrefs 类

PlayerPrefs 类是 Unity 3D 提供的一个用于本地持久保存与读取的类。以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出所保存的数值。

PlayerPrefs 类只支持三种数据类型:浮点数、整数及字符串。

保存的代码:

PlayerPrefs.SetString("Name", myName);
PlayerPrefs.SetInt("Level", myLevel);
PlayerPrefs.SetFloat("Score", myScore);

读取的代码:

myName = PlayerPrefs.GetString("Name", “default”);
myLevel = PlayerPrefs.GetInt("Level", 0);
myScore = PlayerPrefs.GetFloat("Score", 0.0f);

除了 SetXXX, GetXXX 之外,还提供 HasKey, DeleteKey, DeleteAll, Save等方法。

由于 PlayerPrefs 类是本地永久的储存装置,所以在不同的场景之间可作为数据的传递之用。

二、利用单例设计模式的全局对象

基本工作流程如下图:

在场景转换之前,先将数据保存,然后在转换后,立刻读取数据。

首先,在第一个场景中建立一个新的空游戏对象( GameObject ),并将它取一个适合的名称,如:GlobalMaster 或 GlobalObject。

接下来,创建一个新的 C# 脚本,并给它一个名称,例如:GlobalControl。然后将此脚本附加到新的游戏对象。

将此代码放入 GlobalControl 脚本中:

public class GlobalControl : MonoBehaviour {
    public static GlobalControl Instance;
    void Awake() {
        if (Instance == null) {
            DontDestroyOnLoad(gameObject);
            Instance = this;
        } else if (Instance != this) {
            Destroy(gameObject);
        } 
    }
}

这是一个单例设计模式的写法。在此可以添加要保存的变量 HP, Ammo, XP等。

public class GlobalControl : MonoBehaviour {
    public static GlobalControl Instance;
    public float HP;
    public int Ammo;
    public float XP;
    
    void Awake() {
        //.....
    }
}

相关代码如下:

public class PlayerState : MonoBehaviour {
    public float HP;
    public int Ammo;
    public float XP;
    
    void Start () {
        HP = GlobalControl.Instance.HP;
        Ammo = GlobalControl.Instance.Ammo;
        XP = GlobalControl.Instance.XP;
    }
    public void SavePlayer() {
        GlobalControl.Instance.HP = HP;
        GlobalControl.Instance.Ammo = Ammo;
        GlobalControl.Instance.XP = XP;
    }
}

在此范例中,只有三个变量要传递,所以用这种方式并不困难,但如果变量很多时,就不能用这种方式了。

首先,创建一个新的脚本,但不继承 MonoBehavior 类,也不附加到任何对象。通常称之为〝Serializables〞,它看起来像这样:

public class PlayerStatistics {
    public float HP;
    public int Ammo;
    public float XP;
}

正如您所看到的,没有函数、没有名称空间,只有一个没有构造函数的类,及三个已知的变量。

接下来,把 GlobalControl 中的相对应三个变量删除,改成这样子:

public class GlobalControl : MonoBehaviour {
    public PlayerStatistics savedPlayerData = new PlayerStatistics();
    // .....
}

然后 PlayerState 也相对的修改:

public class PlayerState : MonoBehaviour {
    public PlayerStatistics localPlayerData;
    
    void Start() {
        localPlayerData = GlobalControl.Instance.savedPlayerData;
    }
    public void SavePlayer() {
        GlobalControl.Instance.savedPlayerData = localPlayerData;
    }
}

至此,我们将所有与玩家相关的资料都保存在代表玩家数据的类中,增删变量只要修改此类即可,操作上就更简便了。

参考数据:
Saving Data Between Scenes in Unity
By Zdravko Jakupec

前端游戏巨制! CSS 居然可以做 3D 游戏了

↓推荐关注↓ …,?,?,?,????,?,?,?,?,?,?,?,?,?,?,?,?,?,?];然后我们去遍历这个数组, 得到地图.写一个方法去创建地图格子, 同时返回格子数组和节点数组.这里的block是在html中创建的一个预制体, 他是一个正方体.…

批评太多会形成“负脑”,养成“胜脑”才能让孩子学习更专注

国际脑神经外科和脑力开发权威林成之教授,著有不少儿童专注力相关书籍,他在其中一本书里提到很多不利于注意力发展的禁词,而上面几句“经典”话语,恰恰就在其中。看到这里可能很多家长还不理解:“孩子事情没做好,我们只是批评几句,为什么会对注意力有影响?”

教育产品的游戏化设计

的行为,玩具是儿童的天使。”如果能把“玩”代入教育是否能缓解教育带来的“复制性”?在高分纪录片《他乡的童年》中,我看到了不同国家的儿童教育差异:印度的教育注重“思辨”,在课堂上看到的大多是对知识/观点辩驳;芬兰的教育注重“真实的生活”,老师带着学生在森林里上课,素材都是大自然的材料,他们主张学习的目的是为了生活而非应试;日本的教育是为了“为他人着想”,以此为

某游戏服务运维架构进化史(上云方案)

网站架构百度百科:网站架构,一般认为是根据客户需求分析的结果,准确定位网站目标群体,设定网站整体架构,规划、设计网站栏目及其内容,制定网站开发流程及顺序,以最大限度地进行高效资源分配与管理的设计。

Unity 内存管理和profiler详解

Unity Memory Management Unity 的 Memory 构造 实际上Unity游戏使用的内存一共有三种:程序代码、托管堆(Managed Heap)以及本机堆(Native Heap)。 程序代码包括了所有的Unity引擎,使用的库,以及你所写的所有的游戏代码。在编译后,得到的运行文件将会被加载到设备中执行,并占用一定内存。 这部分内存实际上是没有办法去“管理”的,它们...