Table of Contents

事件

Note

不再推荐使用事件,请参阅最佳实践

中级 程序员

事件(Events)便于脚本之间的通信。它们是单向工作的,从广播者(broadcasters)广播到接收者(receivers)。事件有两种形式:非泛型版本用于基本的事件广播,泛型版本用于需要向接收者传递数据的情况。

例如,假设你的游戏在玩家死亡时进入"游戏结束"状态。为此,你可以创建一个"游戏结束"事件,将其广播给所有监听该事件的脚本接收者。当事件被广播时,接收者会运行相应的脚本来处理游戏结束事件(例如重置敌人、替换关卡对象、启动新的计时器等)。你还可以发送与"游戏结束"状态相关的信息(例如游戏统计、谁获胜等)。

Note

事件完全在脚本中处理,无法在 Game Studio 中配置它们。

创建并广播事件

Stride API 中的广播者是 EventKey 或 EventKey<T> 类型。它们使用 Broadcast 或 Broadcast(T) 方法向接收者广播事件。

例如,以下代码创建了两个"游戏结束"事件:一个使用非泛型版本的 EventKey,另一个使用泛型版本:

public static class GlobalEvents
{
    public static EventKey GameOverEventKey = new EventKey("Global", "Game Over");
    public static EventKey<string> GameOverWithDataEventKey = new EventKey<string>("Global", "Game Over With Data");

    public static void SendGameOverEvent()
    {
        GameOverEventKey.Broadcast();
        GameOverWithDataEventKey.Broadcast("Player 1");
    }
}

创建接收者

Stride API 中的接收者是 EventReceiver 或 EventReceiver<T> 类型。

要接收上面描述的"游戏结束"事件,请使用:

var gameOverListener = new EventReceiver(GlobalEvents.GameOverEventKey);
var gameIsOver = gameOverListener.TryReceive();

var gameOverListenerWithData = new EventReceiver<string>(GlobalEvents.GameOverWithDataEventKey);
if(gameOverListenerWithData.TryReceive(out string data))
{
	//data == "Player 1"
}

//或者以异步方式
await gameOverListener.ReceiveAsync();
string asyncData = await gameOverListenerWithData.ReceiveAsync();
//asyncData == "Player 1"

另请参阅