同步脚本
初级 程序员
同步脚本在游戏的每一帧运行。它具有与启动脚本相同的方法,另外还增加了 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 方法在脚本从游戏中移除时被调用。包括:
- 当脚本所在的场景被卸载时
- 当脚本附加到的实体从其场景中移除时
- 当脚本从场景实体上移除时
- 当游戏关闭时
如果脚本附加到的实体先被重新添加、随后又从场景中移除,该方法可能会执行多次。