diff --git a/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md b/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md index 30883e7..1c4258d 100644 --- a/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md +++ b/mcguide/20-玩法开发/18-性能优化/代码进阶优化.md @@ -92,32 +92,30 @@ playerId = clientApi.GetLocalPlayerId() ClientComp.CreateQueryVariable(levelId).Register("query.mod.ysm_is_create_flying", 0) ClientComp.CreateQueryVariable(levelId).Register("query.mod.ysm_is_elytra_flying", 0) +# key为需要监听的attr名称,value为需要设置的对应Molang变量名称 +queryDict = { + "playerIsFlying": "query.mod.ysm_is_flying", + "playerIsElytraFlying": "query.mod.ysm_is_elytra_flying" +} + +# 根据queryDict自动配置监听,简化代码 +def CreateAttrCallBack(bindQuery): + def _eventFuckCallBack(args): + ClientComp.CreateQueryVariable(args["entityId"]).Set(bindQuery, args["newValue"]) + return _eventFuckCallBack + class PlayerActionClientSystem(ClientSystem): def __init__(self, namespace, systemName): ClientSystem.__init__(self, namespace, systemName) # 注册本地玩家的属性值变化回调函数 - modAttr = ClientComp.CreateModAttr(playerId) - modAttr.RegisterUpdateFunc("playerIsCreateFlying", self.PlayerCreateFlyStateChanged) - modAttr.RegisterUpdateFunc("playerIsElytraFlying", self.PlayerElytraFlyStateChanged) + for attr, query in queryDict.items(): + ClientComp.CreateModAttr(playerId).RegisterUpdateFunc(attr, CreateAttrCallBack(query)) def OnAddPlayerAOIClient(self, args): """玩家加入游戏或进入视野时触发,注册属性值变化回调""" pId = args["playerId"] - modAttr = ClientComp.CreateModAttr(pId) - modAttr.RegisterUpdateFunc("playerIsCreateFlying", self.PlayerCreateFlyStateChanged) - modAttr.RegisterUpdateFunc("playerIsElytraFlying", self.PlayerElytraFlyStateChanged) - - def PlayerCreateFlyStateChanged(self, args): - """创造飞行状态变化回调""" - molangVar = args["newValue"] # 属性变化后的值 - pId = args["entityId"] # 属性变化对应的实体Id - ClientComp.CreateQueryVariable(pId).Set("query.mod.ysm_is_create_flying", molangVar) - - def PlayerElytraFlyStateChanged(self, args): - """鞘翅飞行状态变化回调""" - molangVar = args["newValue"] # 属性变化后的值 - pId = args["entityId"] # 属性变化对应的实体Id - ClientComp.CreateQueryVariable(pId).Set("query.mod.ysm_is_elytra_flying", molangVar) + for attr, query in queryDict.items(): + ClientComp.CreateModAttr(pId).RegisterUpdateFunc(attr, CreateAttrCallBack(query)) ``` ### 工作流程说明