Table of Contents

同步脚本

初级 程序员

同步脚本在游戏的每一帧运行。它具有与启动脚本相同的方法,另外还增加了 Update()。

public class Example : SyncScript
{
    public override void Start()
    {
        // 脚本加载时执行的操作
    }
    
    public override void Update()
    {
        // 需要每帧执行的操作
    }
    
    public override void Cancel()
    {
        // 脚本卸载时执行的操作
    }
}

何时使用

同步脚本用于实现需要每帧执行、或需要对变化(如用户输入)做出响应的游戏逻辑。

不过,如果你的代码需要等待异步方法,那么建议改为使用异步脚本。

初始化

同步脚本通常需要访问游戏其他部分的内容。每帧都这样做并无必要,因此建议在 Start 方法中完成初始化,然后在 Update 中访问其中的数据。

public class Example : SyncScript
{
    private MyExampleService service;
    
    // 初始化脚本
    public class Start()
    {
        service = Services.GetService<MyExampleService>();
    }
    
    // 每帧执行逻辑
    public class Update()
    {
        service.DoSomething();
    }
}

Update 之间的时间

同步脚本经常使用帧与帧之间的时间来计算某些值(例如每帧改变实体的位置,使其以恒定速度移动)。为此,我们使用 Game.UpdateTime.Elapsed。

public class Example : SyncScript
{
    public override void Update()
    {
        // 这会让实体以恒定速率持续向上移动
        Entity.Transform.Position += (float)Game.UpdateTime.Elapsed.TotalSeconds * Vector3.UnitY;
    }
}

请注意,这个值不受时间因子的影响,后者是一个可以修改以加快或减慢游戏速度的变量。它最常用于暂停游戏,而在上面的例子中,暂停不会产生任何效果。

为此,我们可以将 Elapsed 乘以 Factor,或者直接使用 WarpElapsed。

public class Example : SyncScript
{
    public override void Start()
    {
        // 暂停游戏
        Game.UpdateTime.Factor = 0;
    }
    
    public override void Update()
    {
        // 由于因子被设为 0,这不会产生任何效果
        Entity.Transform.Position += (float)Game.UpdateTime.WarpElapsed.TotalSeconds * Vector3.UnitY;
    }
}

可重写的方法

同步脚本具有 3 个可重写的方法,用于执行游戏逻辑。

Note

这些方法只会在运行时被调用 - 它们永远不会在 Game Studio 中被调用。

Start()

Start 方法在脚本被添加到游戏时被调用。例如:

  • 当脚本所在的场景被加载时
  • 当包含该脚本的新实体被添加到场景时
  • 当脚本被添加到已存在的实体时

如果脚本附加到的实体先从场景中移除、随后又被添加回来,该方法可能会执行多次。

Update()

Update 方法在脚本处于场景中时每帧被调用。

Cancel()

Cancel 方法在脚本从游戏中移除时被调用。包括:

  • 当脚本所在的场景被卸载时
  • 当脚本附加到的实体从其场景中移除时
  • 当脚本从场景实体上移除时
  • 当游戏关闭时

如果脚本附加到的实体先被重新添加、随后又从场景中移除,该方法可能会执行多次。