元信息-附加信息
介绍
在处理 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