我的世界开发者工具

推荐使用竖屏浏览哦~

进入官网 下载游戏

我的世界开发者工具 搜索

返回

从零开始创建UI

这篇教程会详细介绍如何创建自己的第一个UI界面(包含文本框和按钮)以及按钮相关的逻辑绑定。将按照以下步骤来进行介绍:

1.如何根据自己的需要来写UI界面json内容(包含一个文本框和一个按钮)

2.如何根据json中的内容进行按钮逻辑python的相关绑定

3.简单介绍使用UIAPI中的SetText来设置我们的文本框内容

一、创建Json界面

假设大家已经看过了上一篇《从零开始创建MOD》,已经会自己搭建一个新的MOD,如果有不清楚的可以参考我们提供的Demo《TestUIMod》,如下图1-1所示:

4-1

BehaviorPack中有了下面的文件夹和文件,并且填好了manifest.json,如下图1-2所示:

4-2

ResourcePack中已经有了下面的目录结构和内容,填写好了manifest.json的内容,如图1-3所示:

4-2

在ui文件夹下,我们创建testUI.json和_ui_defs.json这2个json文件,如下图1-4所示:

4-2

testUI.json文件是我们创建出来的界面文件,用来描述我们这个界面的控件和布局,而_ui_defs.json这个文件名称不能修改,它的作用是提醒MC加载我们给定的UIJson文件,没有写在_ui_defs.json中的UIJson文件不会被MC加载。

_ui_defs.json中的内容如下,其中key不可以修改,list中的内容就是我们需要加载的每一个UIJson界面文件,这里我们写上了我们想加载的testUI.json在ui目录下。

                    {
                        "ui_defs" : [
                            "ui/testUI.json"
                        ]
                    }
            

现在开始我们的testUI.json的内容,这里我们只添加一个文本框和一个按钮。查看《UI说明文档》,我们找到Label和ImageButton这2个控件的json和说明,将其粘贴进来作为模板,然后真正会被显示的内容是main screen下的,这里我们只在界面screen中加入了一个名叫test_label的继承于下面的testUI.label,一个名叫test_button的继承于testUI.button,这些参数的解释参考《UI说明文档》中,这里需要说明的是button中的"$pressed_button_name" : "%testUI.OnTestUIButtonPressed" 这一行,说明了button的绑定函数是OnTestUIButtonPressed,这个函数与Python中的函数名称一致,因此结果如下:

                    {
                        "namespace": "testUI",
                        "main@common.base_screen": {
                            "controls":[
                                {
                                    "test_label@testUI.label": {}
                                },
                                {
                                    "test_button@testUI.button": {}
                                }
                            ]
                        },
                    
                        "label": {
                            "anchor_from" : "top_left",
                            "anchor_to" : "top_left",
                            "auto_expand" : false,
                            "color" : [ 1, 1, 0, 0.8],
                            "font_size" : "large",
                            "layer" : 5,
                            "offset" : [ "40%+0px", "20%+0px" ],
                            "shadow" : false,
                            "size" : [ "50%+0px", "20%+0px" ],
                            "text" : "Hello World",
                            "text_alignment" : "left",
                            "type" : "label",
                            "visible" : true
                       },
                    
                        "button@common.button" : {
                        "$default_color" : [ 1, 1, 1 ],
                        "$default_texture" : "textures/ui/btn",
                        "$hover_texture" : "textures/ui/btn_click",
                        "$labelText" : "",
                        "$label_font_size" : "normal",
                        "$pressed_button_name" : "%testUI.OnTestUIButtonPressed",
                        "anchor_from" : "top_left",
                        "anchor_to" : "top_left",
                        "controls" : [
                         {
                            "default" : {
                               "layer" : 2,
                               "texture" : "$default_texture",
                               "type" : "image"
                            }
                         },
                         {
                            "hover" : {
                               "layer" : 2,
                               "texture" : "$hover_texture",
                               "type" : "image"
                            }
                         },
                         {
                            "pressed" : {
                               "layer" : 2,
                               "texture" : "$hover_texture",
                               "type" : "image"
                            }
                         },
                         {
                            "button_label" : {
                               "color" : "$default_color",
                               "font_size" : "$label_font_size",
                               "layer" : 3,
                               "shadow" : false,
                               "text" : "$labelText",
                               "type" : "label"
                            }
                         }
                        ],
                        "layer" : 1,
                        "offset" : [ "60%", "60%" ],
                        "size" : [ "20%", "20%" ],
                        "visible" : true
                        }
                    }
            

二、创建Python逻辑

创建相应的界面逻辑分为两个部分,第一个部分是在什么时机创建界面,第二个部分是创建的界面自身的逻辑是什么。

第一个部分我们利用API上已有的客户端事件UiInitFinished事件,在引擎初始化完成后就创建我们的testUI界面,上面的部分是监听事件,下面部分是注册和创建界面,具体的内容可以参考testUIMod内容。

4-15

第二个部分是继承引起内部的基类ScreenNode,在我们自身的TestUIScreen中,我们利用《UI说明文档》中的绑定按钮相关逻辑,这里我们绑定了按钮的Down(按下)事件,OnTestUIButtonPressed这个函数的名称是在json中已经确定好的。

这样其实我们已经完成了一个Label和一个Button的功能。但是我们想做多一些。

三、使用UIAPI

我们利用《UI API》文档中对Label的接口,我们找到SetText这个接口用来给我们的Label设置内容,为了炫酷一点,利用了游戏原生支持的格式化,具体可以参考这个网站https://minecraft-zh.gamepedia.com/index.php?title=%E6%A0%B7%E5%BC%8F%E4%BB%A3%E7%A0%81&variant=zh

这里我们将按钮和文本框的内容联系起来,点击按钮会随机改变文本框的内容,这里我们通过改变§+(0-9 a-f)来改变文本框的颜色。其中:

self._colorFlag这个是这个特殊样式代码的起始符

self._textLabelPath是在json中从main节点到该节点的路径,因为我们这个test_label是直接挂接在main下面的,因此路径为/test_label.

4-15

当然,更多API功能还需要你的发现和尝试。

文档和工具

点击上方
分享到朋友圈哦

򠀂 易信公众号:
minecraftchina
򠀅 微信公众号:
Minecraftgf