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

你的产品有必要投广告么?亚马逊站内广告策略常见问题解答

对于亚马逊站内广告,投放与否,其所带来的订单结果几乎是立竿见影的,一条表现不太差的Listing。只要投放了站内广告,其订单数量必然会有所增长。

Unity 内存管理和profiler详解

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

Unity在Android设备中的icon适配

应用icon图标适配 前言: 游戏上了 Google Play 之后,若没有做 Android 8.0 及更高版本的 icon 适配. 就会出现以下3个不适配的图标样式. 谷歌从 Android 8.0 后就设计了一套将 icon 分为前景和背景的方式拼接,这样还可以实现很好的 icon 效果。 详细科普请见以下链接: Understanding Android Adaptive Icons...

unity圆圈自动吸附屏幕边缘

效果: 设置如下:

Unity 导出 iOS 游戏并上架 App Store

logread/1878Unity 导出 iOS 游戏并上架 App Store 0. 前言 因为之前已经上架过一款 App(Swift 语言),所以开发者账号、证书这些都已经搞定了,如果你是第一次上架 iOS 应用,具体流程可以参考本文末尾列出的教程。这