每当AdventureCreator保存和加载游戏时,它都会检查是否存在某些“脚本挂钩”,如果存在则调用它们。这些钩子可以用来保存和加载游戏可能需要的自定义数据。请注意,这是一个高级主题,因此需要了解脚本接口!

虽然保存场景数据是一个单独的过程,但这些挂钩用于全局数据,这些数据存在于场景之外,例如资产文件中。在本教程中,我们将创建一个简单的示例,其中包含保存人名。

在我们的保存游戏文件中,这个名称将临时存储为一个全局变量,所以第一步是创建一个可以被我们的钩子使用的变量。由于名称是字符串,我们将创建字符串Variable。转到Variables Manager,然后单击创建新的Global variable

新建Global Variable

将这个新变量的Label设置为SaveText,将Type设置为String。它的初始值与此无关,但请记下它的ID号。在本例中,它是3:

变量ID号

现在,让我们创建脚本挂钩。创建一个名为MyName的新C#脚本文件,并让它导入AC命名空间:

1
2
3
4
5
6
7
8
using UnityEngine;
using System.Collections;
using AC;

public class MyName : MonoBehaviour
{

}

声明名为myOwnName的公共字符串。实际上,这里可能会引用自定义资产而不是字符串,但此示例将允许我们在Inspector中轻松查看和编辑。我们还需要一个整数varID来存储上述全局变量的ID号。

1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;
using System.Collections;
using AC;

public class MyName : MonoBehaviour
{

public string myOwnName;
public int varID;


}

我们将在保存时将此脚本变量的值写入全局变量,并在加载时从全局变量中检索。为此,我们将使用OnBeforeSavingOnAfterLoading自定义事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using UnityEngine;
using System.Collections;
using AC;

public class MyName : MonoBehaviour
{

public string myOwnName;
public int varID;

private void OnEnable ()
{
EventManager.OnBeforeSaving += BeforeSave;
EventManager.OnFinishLoading += AfterLoad;
}

private void OnDisable ()
{
EventManager.OnBeforeSaving -= BeforeSave;
EventManager.OnFinishLoading -= AfterLoad;
}

private void BeforeSave (int saveID)
{}

private void AfterLoad ()
{}

}

(注意:BeforeSave中的“saveID”整数参数是在AC v1.66.4中引入的。如果您使用的是早期版本,只需将BeforeSave函数参数保留为无。)

BeforeSave中,我们将myOwnName的值写入AC全局变量:

1
GlobalVariables.SetStringValue (varID, myOwnName);

AfterLoad中,我们将从AC全局变量更新myOwnName的值:

1
myOwnName = GlobalVariables.GetStringValue (varID);

从这里GlobalVariables查看AC的GlobalVariable提供的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using UnityEngine;
using AC;

public class MyName : MonoBehaviour
{
public string myOwnName;
public int varID;

private void OnEnable()
{
EventManager.OnBeforeSaving += BeforeSave;
EventManager.OnFinishLoading += AfterLoad;
}

private void OnDisable()
{
EventManager.OnBeforeSaving -= BeforeSave;
EventManager.OnFinishLoading -= AfterLoad;
}

private void BeforeSave(int saveID)
{
GlobalVariables.SetStringValue(varID, myOwnName);
}

private void AfterLoad()
{
myOwnName = GlobalVariables.GetStringValue(varID);
}
}

我们现在只需要确保这个脚本出现在我们的所有场景中。有几种方法可以做到这一点:

  • 将其设置为prefab,并在每个场景中放置prefab的实例
  • 更新脚本以标记为DontDestroyOnLoad
  • 将其附加到AC的PersistentEngine,它可以自动在场景更改后幸存下来

要执行后者,请在Assets/AdventureCreator/Resources中找到PersistentEngine的prefab。将MyName组件添加到其组件堆栈的底部:

附加在PersistentEngine上

我们的myOwnName字符串现在将在保存游戏中存储和检索。您可以通过在Inspector的myName字段中输入名称、保存、更改名称并重新加载来测试这一点。