Skip to main content

元信息-附加信息

介绍

在处理 action 时,我们可以通过 FlowContext.userId 可以很方便得到当前玩家 id。

如果开发者想在处理 action 时,携带上一些自定义的信息,可以通过元附加信息特性来完成。 将一些自定义信息保存到元附加信息后,之后的每个 action 请求可以通过 FlowContext 来得到这些自定义信息。

比如保存当前玩家的英雄角色信息、玩家昵称,又或者是你的项目的 userId 是 string 或其他类型则可以通过元信息这一特性来兼容。

简单的说,就是你想在 FlowContext 中获取一些玩家特有的信息数据时,可以通过这个特性来实现。

如何使用

自定义元信息类

自定义一个元信息类,实现 Attachment 元附加信息接口

@ProtobufClass
public class MyAttachment implements Attachment {
@Getter
long userId;
public String nickname;
}

更新元信息

  • code 7,更新元信息
@ActionMethod(1)
public void attachment(FlowContext flowContext) {
MyAttachment myAttachment = new MyAttachment();
myAttachment.userId = flowContext.getUserId();
myAttachment.nickname = "Michael Jackson";

flowContext.updateAttachment(myAttachment);
}

获取元信息

  • code 7,获取元信息,这个是在上面的方法中设置的元信息对象
@ActionMethod(2)
public MyAttachment printAttachment(FlowContext flowContext) {
var attachment = flowContext.getAttachment(MyAttachment.class);
return attachment;
}

配合自定义 FlowContext

我们可以配合自定义 FlowContext 特性 ,做一些更符合定制的扩展,如下。

  • code 5,调用 MyFlowContext.getNickname() 方法
  • code 9,自定义 MyFlowContext,我们可以在该类中添加任意的便捷方法。
@ActionController(1)
public class DemoAction {
@ActionMethod(1)
public String getNickname(MyFlowContext flowContext) {
return flowContext.getNickname();
}
}

public class MyFlowContext extends FlowContext {
MyAttachment attachment;

@Override
public MyAttachment getAttachment() {
if (Objects.isNull(attachment)) {
this.attachment = this.getAttachment(MyAttachment.class);
}

return this.attachment;
}

public String getNickname() {
MyAttachment attachment = this.getAttachment();
return attachment.nickname;
}
}

注意事项

由于 Attachment 实现了 Serializable 接口,所以我们需要将该类放到一个公共包中,之后在游戏对外服、Broker(游戏网关)、游戏逻辑服的 pom.xml 中添加这个公共包。

Example Source Code

可参考综合示例源码目录。

/spring-game-logic-hall/ ... /LoginAction.java