跳转至

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:struiKey:strcls:class(继承ScreenNode的UI类)、uiScreenDef:strUI定义文件路径,格式为命名空间.文件名 注册UI类与其对应的JSON UI定义。必须在模组加载初始化时调用,通常在ClientSystem.__init__中执行。
CreateUI(nameSpace,uiKey,createParams) 客户端 nameSpace:struiKey:str(须与注册时相同且全局唯一)、createParams:dict ScreenNode 创建并显示UI实例。createParams支持以下键:isHudint,0=普通界面,1=HUD界面)、bindEntityIdstr,绑定实体ID,绑定后UI悬浮在实体头顶)、bindOffsettuple,偏移量,默认(0,1,0))、autoScaleint,绑定实体时是否随距离缩放,默认1)、bindWorldPosition(int,(float,float,float)),绑定到世界坐标)。注意同一uiKey不能创建两次。
GetUI(nameSpace,uiKey) 客户端 nameSpace:struiKey:str ScreenNodeNone 获取已创建的UI实例。
DestroyUI(nameSpace,uiKey) 客户端 nameSpace:struiKey: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:NativeScreenDataTypecustomControlName:strproxyClassName:str bool 在指定原生界面创建时附加自定义控件,并指定代理类模块路径。
UnRegisterCustomControl(nativeScreenType,customControlName) 客户端 nativeScreenType:NativeScreenDataTypecustomControlName: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:stritemName:str 打开网易商店中的指定商品界面。
OpenPauseGui(isForce=False) 客户端 isForce:bool(可选) 打开原版暂停界面。
OpenReportGui() 客户端 打开原版举报界面。
OpenVoiceGui() 客户端 打开原版语音界面。
GetScreenSize() 客户端 tuple(int,int) 获取游戏当前分辨率(宽,高),单位像素。
GetScreenViewInfo() 客户端 tuple(float,float,float,float) 获取当前游戏视角信息(视角宽、高及偏移),用于UI精确适配计算。
SetResponse(uiName,enable) 客户端 uiName:strenable:bool 设置指定原生UI是否响应触摸/点击操作。
ChangeSneakState() 客户端 切换玩家潜行状态(等同按下潜行键)。
SimulateJump() 客户端 模拟玩家跳跃操作。
PlayHudHeartBlinkAnim() 客户端 播放原版受伤时血量变化的动效(心跳动画)。

界面与HUD事件

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

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

HudButtonChangedClientEvent返回值结构

changedList中的每一项都会给出按钮标识以及变化前后的区域信息。常见字段包括areaEnumbeforeSizeafterSize,分别表示原生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:strNone(跟随实体) bool 在世界中的指定位置或绑定实体处播放音效,距离远则音量衰减。
PlayCustomUIMusic(name,volume,pitch,loop) 客户端 name:strvolume:floatpitch:floatloop:bool bool 播放UI音效(全局等音量,不受位置影响),适合按钮音效、背景音乐等。
PlayGlobalCustomMusic(name,volume,pitch,loop) 客户端 name:strvolume:floatpitch:floatloop:bool bool 播放全局广播音效,所有客户端玩家均可听到(需服务端分别向各客户端发送事件)。
StopCustomMusic(name,fadeOutTime) 客户端 name:strfadeOutTime:float(淡出时间,秒) bool 停止指定音效播放,支持淡出效果。
StopCustomMusicById(musicId,fadeOutTime) 客户端 musicId:intfadeOutTime:float bool 通过播放返回的音效ID停止指定音效实例。
SetCustomMusicLoop(name,loop) 客户端 name:strloop:bool bool 更改正在播放的音效的循环状态。
SetCustomMusicLoopById(musicId,loop) 客户端 musicId:intloop: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等接口只修改客户端本地设置,不影响服务端的模拟范围。渲染距离的调整只影响当前客户端的图像渲染,服务端区块加载仍遵循服务端配置。