Global Variables
Global Variables(全局变量值)本质上与 Variables 相同,但它们可以被全局访问和共享,不受限于 某个 Sequine Flow 对象的 作用域。
整个 Global Variables 可以被序列化为二进制数据。因此,我们也可以利用这一点将其保存到文件中,甚至将其作为存档数据使用。
我们可以在 Sequine Global Data 窗口中查看所有的 Global Variables 列表。要打开该窗口,在菜单栏中点击 Tools -> Sequine -> Global Data...

创建 Global Variable
要创建一个 Global Variable,可以点击 Add New Variable 折叠栏来打开变量创建菜单。需要指定变量名称和数据类型。

点击 Add 按钮后,变量会出现在表格中,在那里可以重命名变量并修改初始值。

使用 Global Variable
我们可以通过创建 Command 的上下文菜单(在空白区域右键)为某个 Global Variable 创建 Getter 或 Setter Command。
1. Getter
要创建一个获取 Global Variable 的 Property Command,在空白区域右键,选择 Property -> Data -> Global Variable。

默认情况下,该 Command 会显示一个空的下拉菜单。点击下拉菜单,可以选择它要引用的变量。

请注意,out-point 的颜色会根据变量所引用的数据类型自动改变。

下面是一个将变量值打印到控制台的示例。

通过脚本获取 Global Variable
可以使用 SequineGlobalData 类并调用 GetVariable 方法,通过指定返回类型和变量 ID 来获取全局变量。变量 ID 是在 Sequine Global Data 窗口中变量名称旁显示的整数。
SequineGlobalData.GetVariable<float>(1);
自 1.7.2 版本起,也可以通过变量名称获取全局变量值。
SequineGlobalData.GetVariable<float>("MyGlobalFloat");
2. Setter
要创建一个设置 Global Variable 的 Main Command,在空白区域右键,选择 Data -> Set Global Variable。

默认情况下,Set Global Variable Command 会显示一个空的下拉菜单。点击下拉菜单,可以选择它要引用的变量。

当选择具体变量后,会显示其 in-point、字段以及 out-point。

和普通 Variable 一样,如果希望动态设置值,而不是手动填写字段,可以将该 in-point 连接到其他 Command 的某个 out-point。

通过脚本设置 Global Variable
可以使用 SequineGlobalData 类并调用 SetVariable 方法,通过指定返回类型、变量 ID 以及要设置的值来修改全局变量。变量 ID 是在 Sequine Global Data 窗口中变量名称旁显示的整数。
SequineGlobalData.SetVariable<float>(1, 50f);
自 1.7.2 版本起,也可以通过变量名称设置全局变量值。
SequineGlobalData.SetVariable<float>("MyGlobalFloat", 50f);
序列化 Global Data
如前所述,Global Variables 的状态可以在运行时进行序列化和反序列化。它的实现方式是对 Sequine Global Data 对象中包含的数据进行序列化。
序列化数据只需调用 SequineGlobalData.SerializeToBinary() 方法。反序列化则需要调用 SequineGlobalData.DeserializeFromBinary(bytes)。
下面是一个示例,演示如何创建一个 DataManager,通过按 Ctrl+S 将当前状态保存到文件,通过按 Ctrl+L 将文件加载到当前状态。
using Calcatz.Sequine;
using UnityEngine;
using System.IO;
public class DataManagerExample : MonoBehaviour {
private void Update() {
if (Input.GetKey(KeyCode.LeftControl)) {
if (Input.GetKeyDown(KeyCode.S)) {
SaveData();
}
if (Input.GetKeyDown(KeyCode.L)) {
LoadData();
}
}
}
private void SaveData() {
string filePath = Application.persistentDataPath + "/SaveData.dat";
byte[] bytes = SequineGlobalData.SerializeToBinary();
File.WriteAllBytes(filePath, bytes);
Debug.Log("Saved to " + filePath);
}
private void LoadData() {
string filePath = Application.persistentDataPath + "/SaveData.dat";
byte[] bytes = File.ReadAllBytes(filePath);
SequineGlobalData.DeserializeFromBinary(bytes);
Debug.Log("Loaded from " + filePath);
}
}