跳转至

UI与交互接口

本页列出中国版模组SDK中与自定义UI创建管理、原生HUD控制、按键控制、音效及游戏设置相关的客户端接口。所有接口均仅在客户端可用,服务端若需触发UI操作,需通过事件通知机制(NotifyToClient)向客户端发送消息后由客户端执行。接口域总览入口见中国版ModAPI接口域索引。

与国际版脚本API分开使用

本页接口属于中国版Python模组SDK客户端体系,与国际版@minecraft/server或@minecraft/server-ui脚本API无关。中国版自定义UI使用JSON UI格式(.json定义文件),与原版UI文件格式共用但命名空间不同。

自定义UI创建与管理

自定义UI全部通过mod.client.extraClientApi的直接方法创建,无需通过组件工厂。UI类需继承ScreenNode基类,并在模组初始化时通过RegisterUI注册。

接口 端 参数 返回值 说明
RegisterUI(nameSpace,uiKey,cls,uiScreenDef) 客户端 nameSpace:str、uiKey:str、cls:class(继承ScreenNode的UI类)、uiScreenDef:str(UI定义文件路径,格式为命名空间.文件名) 无 注册UI类与其对应的JSON UI定义。必须在模组加载初始化时调用,通常在ClientSystem.__init__中执行。
CreateUI(nameSpace,uiKey,createParams) 客户端 nameSpace:str、uiKey:str(须与注册时相同且全局唯一)、createParams:dict ScreenNode 创建并显示UI实例。createParams支持以下键:isHud(int,0=普通界面,1=HUD界面)、bindEntityId(str,绑定实体ID,绑定后UI悬浮在实体头顶)、bindOffset(tuple,偏移量,默认(0,1,0))、autoScale(int,绑定实体时是否随距离缩放,默认1)、bindWorldPosition((int,(float,float,float)),绑定到世界坐标)。注意同一uiKey不能创建两次。
GetUI(nameSpace,uiKey) 客户端 nameSpace:str、uiKey:str ScreenNode或None 获取已创建的UI实例。
DestroyUI(nameSpace,uiKey) 客户端 nameSpace:str、uiKey:str 无 销毁并移除指定UI实例。
PopScreen() 客户端 无 无 关闭当前最顶层显示的UI屏幕,类似按下返回键。
CheckCanBindUI(entityId) 客户端 entityId:str bool 检查实体是否可以绑定头顶UI;实体刚创建时可能需等待1–3帧后再绑定。
import mod.client.extraClientApi as clientApi

class MyClientSystem(clientApi.GetClientSystemCls()):
    def __init__(self, namespace, systemName):
        super().__init__(namespace, systemName)
        # 注册UI
        clientApi.RegisterUI("myMod", "hud_ui", MyHudScreen, "myMod.hud_ui")

    def ShowHud(self):
        ui = clientApi.CreateUI("myMod", "hud_ui", {"isHud": 1})
        return ui

    def ShowEntityLabel(self, entityId):
        if clientApi.CheckCanBindUI(entityId):
            clientApi.CreateUI("myMod", "label_" + entityId, MyLabelScreen, {
                "bindEntityId": entityId,
                "bindOffset": (0, 2, 0),
                "autoScale": 1
            })

原生界面附加

旧版中国版资料还提供了一套“把自定义UI附加到原生界面上”的框架。它不是简单覆盖原版JSON UI文件,而是在指定原生界面创建时,额外挂接一个自定义控件树,并由代理类负责其生命周期。

可选原生界面枚举

原生界面附加能力依赖clientApi.GetMinecraftEnum().NativeScreenDataType。旧版资料明确列出的常用枚举包括:

枚举值 说明
INVENTORY_CONTENT_PANEL 背包界面
POCKET_INVENTORY_CONTENT_PANEL 口袋版背包界面
CRAFTING_CONTENT_PANEL 合成台界面
POCKET_CRAFTING_CONTENT_PANEL 口袋版合成台界面
SMALL_CHEST_PANEL 小箱子界面
POCKET_SMALL_CHEST_PANEL 口袋版小箱子界面
LARGE_CHEST_PANEL 大箱子界面
POCKET_LARGE_CHEST_PANEL 口袋版大箱子界面
ENDER_CHEST_PANEL 末影箱界面
POCKET_ENDER_CHEST_PANEL 口袋版末影箱界面
FURNACE_PANEL 熔炉界面
POCKET_FURNACE_PANEL 口袋版熔炉界面

NativeScreenManager

NativeScreenManager是一个单例管理类,可通过extraClientApi.GetNativeScreenManagerCls()获得。它用于在原生界面创建和销毁时注册或移除额外的自定义控件。

接口 端 参数 返回值 说明
instance() 客户端 无 NativeScreenManager 获取单例实例。
RegisterCustomControl(nativeScreenType,customControlName,proxyClassName) 客户端 nativeScreenType:NativeScreenDataType、customControlName:str、proxyClassName:str bool 在指定原生界面创建时附加自定义控件,并指定代理类模块路径。
UnRegisterCustomControl(nativeScreenType,customControlName) 客户端 nativeScreenType:NativeScreenDataType、customControlName:str 无 取消指定原生界面的自定义控件附加。
import mod.client.extraClientApi as clientApi

NativeScreenManager = clientApi.GetNativeScreenManagerCls()
NativeScreenDataType = clientApi.GetMinecraftEnum().NativeScreenDataType

NativeScreenManager.instance().RegisterCustomControl(
    NativeScreenDataType.INVENTORY_CONTENT_PANEL,
    "UIDemo.image0",
    "uidemoScripts.modClient.ui.UIDemoProxy.UIDemoProxy"
)

CustomUIControlProxy

CustomUIControlProxy可通过extraClientApi.GetCustomUIControlProxyCls()获得。该类本身保存附加到原生界面的BaseUIControl根节点,并暴露生命周期函数;开发者通常继承它并重写回调。

成员 端 参数 返回值 说明
GetCustomUIControl() 客户端 无 BaseUIControl 获取附加在原生界面上的自定义UI根控件。
OnCreate() 客户端 无 无 自定义UI在原生界面创建完成后调用。
OnDestroy() 客户端 无 无 原生界面关闭、自定义UI销毁后调用。
OnTick() 客户端 无 无 每帧调用一次。
import mod.client.extraClientApi as clientApi

CustomUIControlProxy = clientApi.GetCustomUIControlProxyCls()

class UIDemoProxy(CustomUIControlProxy):
    def __init__(self, customData, customUIControl):
        CustomUIControlProxy.__init__(self, customData, customUIControl)

    def OnCreate(self):
        root = self.GetCustomUIControl()
        label = root.GetChildByName("label0").asLabel()
        if label:
            label.SetText("10")

使用边界

原生界面附加的设计目标是“在原生界面上叠加少量自定义内容”,而不是完全接管原生界面逻辑。旧版资料特别强调,这套能力只开放给少数经过筛选的原生界面,以避免过度改写原版交互。

原生HUD控制

原生UI控制接口均为mod.client.extraClientApi的直接方法,全部为客户端接口,可控制原版HUD各元素的显示与隐藏。

接口 端 参数 返回值 说明
HideHudGUI(hide) 客户端 hide:bool 无 整体隐藏/显示游戏HUD(等同F1键效果),点击区域仍可响应操作。
HideHealthGui(hide) 客户端 hide:bool 无 隐藏/显示HUD血量界面。
HideHungerGui(hide) 客户端 hide:bool 无 隐藏/显示HUD饥饿值界面。
HideArmorGui(hide) 客户端 hide:bool 无 隐藏/显示HUD护甲值界面。
HideExpGui(hide) 客户端 hide:bool 无 隐藏/显示非创造模式下的经验条。
HideAirSupplyGUI(hide) 客户端 hide:bool 无 隐藏/显示玩家氧气值界面。
HideSlotBarGui(hide) 客户端 hide:bool 无 隐藏/显示底部物品栏(快捷栏)。
HideCrossHairGUI(hide) 客户端 hide:bool 无 隐藏/显示十字准心。
HideMoveGui(hide) 客户端 hide:bool 无 隐藏游戏中移动摇杆按钮,隐藏后点击原位置不再响应。
HideJumpGui(hide) 客户端 hide:bool 无 隐藏跳跃按钮,隐藏后点击原位置不再响应。
HideSneakGui(hide) 客户端 hide:bool 无 隐藏潜行按钮,隐藏后点击原位置不再响应。
HideInteractGui(hide) 客户端 hide:bool 无 隐藏交互按钮(如喂食、交易等场景中的按钮),隐藏后不响应。
HideChatGUI(hide) 客户端 hide:bool 无 隐藏聊天按钮(新版聊天模式下不生效)。
HideVoiceGUI(hide) 客户端 hide:bool 无 隐藏语音按钮;开启新版聊天时不生效。
HideWalkGui(hide) 客户端 hide:bool 无 隐藏跑/走切换按钮,隐藏后原位置不再响应。
HidePauseGUI(hide) 客户端 hide:bool 无 隐藏暂停按钮。
OpenInventoryGui(categoryName=None,isForce=False) 客户端 categoryName:str(可选,背包分页名)、isForce:bool(可选) 无 打开原版背包界面;支持直接定位到指定分页。
OpenChatGui(isForce=False) 客户端 isForce:bool(可选) 无 打开原版聊天栏;若当前已打开is_showing_menu=true的界面,通常需要强制模式。调用后会触发PlayerChatButtonClickClientEvent。
OpenEmoteGui() 客户端 无 无 打开原版表情界面。
OpenFoldGui() 客户端 无 无 打开原版下拉界面。
OpenNeteaseStoreGui(categoryName,itemName) 客户端 categoryName:str、itemName:str 无 打开网易商店中的指定商品界面。
OpenPauseGui(isForce=False) 客户端 isForce:bool(可选) 无 打开原版暂停界面。
OpenReportGui() 客户端 无 无 打开原版举报界面。
OpenVoiceGui() 客户端 无 无 打开原版语音界面。
GetScreenSize() 客户端 无 tuple(int,int) 获取游戏当前分辨率(宽,高),单位像素。
GetScreenViewInfo() 客户端 无 tuple(float,float,float,float) 获取当前游戏视角信息(视角宽、高及偏移),用于UI精确适配计算。
SetResponse(uiName,enable) 客户端 uiName:str、enable:bool 无 设置指定原生UI是否响应触摸/点击操作。
ChangeSneakState() 客户端 无 无 切换玩家潜行状态(等同按下潜行键)。
SimulateJump() 客户端 无 无 模拟玩家跳跃操作。
PlayHudHeartBlinkAnim() 客户端 无 无 播放原版受伤时血量变化的动效(心跳动画)。

界面与HUD事件

除了直接调用界面接口外,中国版模组SDK还提供一组与原生界面、自定义界面和HUD变化相关的事件,适合用于处理布局适配、界面联动和输入拦截。

事件 端 参数 说明
UiInitFinished 客户端 无 UI框架初始化完成后触发;切换维度后会再次触发,适合在此之后创建界面。
PushScreenEvent 客户端 screenName、screenDef 某个界面刚被创建时触发。
PopScreenEvent 客户端 screenName、screenDef 某个界面开始弹出时触发。
PopScreenAfterClientEvent 客户端 screenName、screenDef 某个界面完全弹出后触发;更适合获取弹出后的最顶层界面状态。
ScreenSizeChangedClientEvent 客户端 beforeX、beforeY、afterX、afterY 屏幕尺寸变化时触发,仅支持PC。
GridComponentSizeChangedClientEvent 客户端 path 自定义UI中grid组件的格子数量发生变化时触发。
HudButtonChangedClientEvent 客户端 changedList 原生HUD按钮位置或大小变化时触发,可用于避免自定义按钮与原生按钮重叠。
AchievementButtonMovedClientEvent 客户端 oldPosition、newPosition 使用自定义成就系统时,成就入口拖动结束后触发。
PlayerChatButtonClickClientEvent 客户端 无 玩家点击聊天按钮或按回车呼出聊天窗口时触发。
OnItemSlotButtonClickedEvent 客户端 slotIndex 点击快捷栏、背包栏、盔甲栏或副手栏物品槽时触发。
ClientPlayerInventoryOpenEvent 客户端 isCreative、cancel 客户端打开背包界面时触发,可直接取消打开。
ClientPlayerInventoryCloseEvent 客户端 无 客户端关闭背包界面时触发。
ClientChestOpenEvent 客户端 playerId、x、y、z 客户端打开箱子界面时触发。
ClientChestCloseEvent 客户端 无 客户端关闭箱子界面时触发。
CloseNeteaseShopEvent 客户端 无 商城界面关闭时触发,脚本商城与Apollo插件商城都会进入此事件。
PlayerInventoryOpenScriptServerEvent 服务端 playerId、isCreative 某个客户端打开背包界面时由服务端接收,可用于服务器侧判定创造背包状态。

HudButtonChangedClientEvent返回值结构

changedList中的每一项都会给出按钮标识以及变化前后的区域信息。常见字段包括areaEnum、beforeSize和afterSize,分别表示原生HUD枚举名、变化前区域和变化后区域。

音效

音效接口通过GetEngineCompFactory().CreateCustomAudio(levelId)获取AudioCustomComponentClient,仅客户端可用。音效资源文件需位于资源包的sounds/目录下,并在sound_definitions.json中注册。

接口 端 参数 返回值 说明
DisableOriginMusic(disable) 客户端 disable:bool bool 禁用/启用原版背景音乐;为True时停止播放原版BGM,通常在自定义音乐播放前调用。
PlayCustomMusic(name,pos,volume,pitch,loop,entityId) 客户端 name:str(音效标识符)、pos:tuple(float,float,float)(播放位置)、volume:float(音量,默认1.0)、pitch:float(音调,默认1.0)、loop:bool(是否循环)、entityId:str或None(跟随实体) bool 在世界中的指定位置或绑定实体处播放音效,距离远则音量衰减。
PlayCustomUIMusic(name,volume,pitch,loop) 客户端 name:str、volume:float、pitch:float、loop:bool bool 播放UI音效(全局等音量,不受位置影响),适合按钮音效、背景音乐等。
PlayGlobalCustomMusic(name,volume,pitch,loop) 客户端 name:str、volume:float、pitch:float、loop:bool bool 播放全局广播音效,所有客户端玩家均可听到(需服务端分别向各客户端发送事件)。
StopCustomMusic(name,fadeOutTime) 客户端 name:str、fadeOutTime:float(淡出时间,秒) bool 停止指定音效播放,支持淡出效果。
StopCustomMusicById(musicId,fadeOutTime) 客户端 musicId:int、fadeOutTime:float bool 通过播放返回的音效ID停止指定音效实例。
SetCustomMusicLoop(name,loop) 客户端 name:str、loop:bool bool 更改正在播放的音效的循环状态。
SetCustomMusicLoopById(musicId,loop) 客户端 musicId:int、loop:bool bool 通过音效ID更改指定音效实例的循环状态。
import mod.client.extraClientApi as clientApi

levelId = clientApi.GetLevelId()
audioComp = clientApi.GetEngineCompFactory().CreateCustomAudio(levelId)

# 禁用原版背景音乐并播放自定义BGM
audioComp.DisableOriginMusic(True)
audioComp.PlayCustomUIMusic("mymod:custom_bgm", 0.8, 1.0, True)

# 在某位置播放3D音效
audioComp.PlayCustomMusic("mymod:explosion", (10, 64, 10), 1.0, 1.0, False, None)

按键控制

按键控制接口通过mod.client.extraClientApi直接调用(接口\控制.md中的接口),仅客户端可用,用于监听和模拟玩家按键操作。

接口 端 参数 返回值 说明
GetKeyState(key) 客户端 key:int(键码枚举) bool 获取指定按键的当前按下状态;True表示正在按住。
SetOperationType(opType) 客户端 opType:int(操作类型枚举) bool 切换玩家操作类型(如从触屏模式切换到键鼠模式)。
GetCurrentInputMode() 客户端 无 int 获取当前输入模式枚举值(触屏/键鼠/手柄等)。

游戏设置

游戏设置接口通过mod.client.extraClientApi直接调用(接口\游戏设置.md中的接口),仅客户端可用。

接口 端 参数 返回值 说明
GetPlatform() 客户端 无 int 获取当前设备平台类型枚举值(安卓/iOS/PC等),用于针对不同平台做差异化处理。
GetDeviceType() 客户端 无 int 获取设备类型(手机/平板/PC)。
GetEngineVersion() 客户端 无 str 获取当前客户端引擎版本字符串。
SetRenderDistance(distance) 客户端 distance:int(区块数) bool 设置客户端渲染距离(区块单位)。
GetRenderDistance() 客户端 无 int 获取当前客户端渲染距离。

客户端游戏设置作用域

SetRenderDistance等接口只修改客户端本地设置,不影响服务端的模拟范围。渲染距离的调整只影响当前客户端的图像渲染,服务端区块加载仍遵循服务端配置。