开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[BE教程] [原创][SAPI]Server UI 教程 —— 用Script API在游戏里创造UI!

 发表于 2024-10-27 11:58:03|显示全部楼层|阅读模式 IP:山东省
本帖最后由 星空晶体 于 2024-11-30 22:06 编辑

回帖前请务必观看坛规与版规,本帖不适合灌水

由于本人对Script API不是非常了解,所以本教程可能会出现遗漏或出错,欢迎进行反馈。授权协议请查看帖子最后


Server UI 教程
做一个由 SAPI 制作的游戏内UI!


前言



Server UI 是 Script API 中的一个库,可以在游戏里创建菜单、表单等 UI。它的出现使 Script API 变得更加有创造性,你可以将此功能用到 Script API 的各种地方,例如雪球(时钟)菜单、触发事件的自定义组件或其他。本教程将告诉大家什么是 ActionFormData、MessageFormData 与 ModalFormData 以及它们的使用方法。本人对 Script API 并不过于全知,所以可能会有遗漏,欢迎进行提醒。

如何使用 Server UI



第一个问题来了,我们怎么来使用 Script API 以及 Server UI库呢?

打开行为包文件夹,打开附加包清单文件 manifest.json ,在 modules 数组以下,添加 dependencies 数组,dependencies 这样写:

  1. "dependencies": [
  2.         {
  3.             "module_name": "@minecraft/server",
  4.             "version": "xxx"
  5.         },
  6.         {
  7.             "module_name": "@minecraft/server-ui",
  8.             "version": "xxx"
  9.         }
  10.     ]
复制代码

   
module_name 是库的名字,version 是库的版本,@minecraft/server-ui 就是 Server UI 的库名。截止到目前,@minecraft/server 的最新版本是1.15.0,@minecraft/server-ui 的最新版本是 1.3.0。若想要查看这两个库名的最新版本,可以去
https://www.npmjs.com/package/@minecraft/server
https://www.npmjs.com/package/@minecraft/server-ui
查看

完整的清单文件是这样的:

  1. {
  2.     "format_version": 2,
  3.     "header": {
  4.         "name": "名称",
  5.         "description": "介绍",
  6.         "uuid": "自行填写",
  7.         "version": [
  8.             0,
  9.             0,
  10.             1
  11.         ],
  12.         "min_engine_version": [
  13.             x,
  14.             x,
  15.             x
  16.         ]
  17.     },
  18.     "modules": [
  19.         {
  20.             "type": "script",
  21.             "language": "javascript",
  22.             "uuid": "自行填写",
  23.             "entry": "scripts/xxx.js",//自行选择xxx部分
  24.             "version": [
  25.                 0,
  26.                 0,
  27.                 1
  28.             ]
  29.         }
  30.     ],
  31.     "dependencies": [
  32.         {
  33.             "module_name": "@minecraft/server",
  34.             "version": "1.15.0"
  35.         },
  36.         {
  37.             "module_name": "@minecraft/server-ui",
  38.             "version": "1.3.0"
  39.         }
  40.     ]
  41. }
复制代码


在行为包的 script 文件夹,在JS文件中写入

  1. import { ActionFormData, MessageFormData, ModalFormData } from "@minecraft/server-ui"
复制代码


接下来将讲解三个 UI 是什么,不再赘述 Script API 其他内容。

ActionFormData



此 UI 相当于一个菜单,在游戏里显示为以下:
名称
简介
菜单按钮1

菜单按钮2

菜单按钮3

...

BBCode 表格无法完全清楚显示 ActionFormData UI ,请参考游戏内

写法:
  1. function Functionname(player) {
  2.     const Test = new ActionFormData()
  3.     .title(``)
  4.     .body(``)
  5.     .button(``)
  6.     .button(``)
  7.     .button(``)
  8.     .show(player)
  9.     .then((Test) => {
  10.         
  11.     })
  12. }
复制代码

代码讲解
const Test = new ActionFormData() 此代码是创建 ActionFormData UI 的语句,Test 是这个 ActionFormData 对象的名字,可替换为其他名字。
.title(``) 菜单最上面的标题,可见上方图例。
.body(``) 菜单中靠上的简介部分,可见上方图例。
.button(``) 菜单的按钮部分,可见上方图例。还可以写为 .button(``, `textures/...`),后者资源包的 textures 图片路径指定按钮左旁的图片。可多个添加。

.show(player)
.then((Test) => {
        
    }

展现给玩家的语句,在里面括号里写入当点击按钮时会发生什么。这里使用IF语句
  1. if (Test.selection == 0) {
  2.     ...
  3. }
复制代码

里面的其他函数以及其他的这是当点击按钮1时会执行的,如果 Test.selection 为1,就是第2个按钮点击后发生的。以此类推。
可以执行另一个 UI 函数,也可以执行命令。使用 player.runCommand,比如:
  1. player.runCommand(`effect ${player.nameTag} instant_health 99999 255 true`)
复制代码


ModalFormData



此 UI 相当于一个表单,里面内含输入框、下拉栏、滑动栏、拉杆。
在游戏里显示如下:
名称
输入框
下滑栏

▪▪▪



...
提交


BBCode 表格无法完全清楚显示 ModalFormData UI ,请参考游戏内

写法:
  1. function Functionname(player) {
  2.     const Test = new ModalFormData()
  3.     .title(``)
  4.     .textField(``,``)
  5.     .toggle(``,true)
  6.     .dropdown(``,[``,``,``,``],0)
  7.     .slider(``,0,64,1,32)//不要在意这些数字
  8.     .show(player)
  9.     .then((Test) => {
  10.         if (xxx.formValues[0] == xxx) {
  11.             ...
  12.         } else {
  13.             ...
  14.         }
  15.     })
  16. }
复制代码

代码讲解
.textField(``,``) 输入框,前者反引号为输入框上面的输入文字,后者为输入框里面的提醒文字。
.toggle(``,true) 前者反引号是拉杆选项是文字,后者布尔值是默认为开还是关。true 是默认为打开,false 是默认不打开。
.dropdown(``,[``,``,``,``],0) 下拉栏,前者反引号是下拉栏说明,中间的数组下拉栏内容,也是用反引号为一个,内容直接用英文逗号隔开。最后的数字是下拉栏默认的内容,0 是 第一个,1 是 第二个,以此类推。
.slider(``,,,,) 滑动条,这样写:
  1. .slider(`滑动条名字`,最小值,最大值,分度值,默认值)
复制代码
分度值是每次滑动一次时会滑动多少。比如最大值为10,分度值为2,每次滑动数值都会滑动±2,从开头/结尾滑动5次就会拉到头。默认值是设置滑动条的默认数值。
如何获取表单内容进行判断:如果有的表单内容需要判断,要获取一个部分的值并判断,写为以下代码
  1. if (Test.formValues[0] == xxx) {
  2.             ...
  3.         } else {
  4.             ...
  5.           }
复制代码

Test.formValues[0] == xxx 是索引值为某一数值、字符串或布尔值的判断部分。当点击提交,就会安装IF语句里执行其他内容。

MessageFormData



此 UI 相当于一个弹窗,在游戏里显示如下:
名称
弹窗内容


BBCode 表格无法完全清楚显示 MessageFormData UI ,请参考游戏内

写法
  1. function Functionname(player) {
  2.     const Test = new MessageFormData()
  3.     .title(`标题`)
  4.     .body(``)
  5.     .button(``)
  6.     .button(``)
  7.     .show(player)
  8.     .then((Test) => {
  9.         if (Test.selection == 0) {
  10.             ...
  11.         }
  12.         if (Test.selection == 1) {
  13.             ...
  14.         }
  15.     })
  16. }
复制代码


弹窗有两个按钮,当点击第一个按钮后执行第一个IF语句内容,第二个同理。
.body(``) 弹窗内容

实例


下面内容来自我的资源帖子[原创][1.21.2+][Script API][测试插件]雪球游戏菜单-2



以上内容包括本教程帖的所有内容,可进行参考。
可去原帖找到资源进行改编。本人表示欢迎。

结语



感谢您观看本教程,本教程共花费了本人几个小时的编写。包括查阅资料、文字编写已经BBCode排版。这也是本人第一次写这样体量的教程,若有遗失欢迎补充。感谢支持,愿大家制作自己的作品,让Minecraft论坛社区变得更好!

帖子信息
[原创][SAPI]Server UI 教程 —— 用Script API在游戏里创造UI!
字数(包括BBCode):大于12000字
用时:大于4小时
完毕时间:11:30
转载协议:本教程根据 CC BY-NC-SA 4.0 进行授权,转载请标注原作者以及原帖子地址
本教程作者:星空晶体
帖子地址:https://klpbbs.com/thread-150351-1-1.html


评分

参与人数 3铁粒 +570收起理由
 liy*** + 30感谢大佬
 小*** + 40推荐奖励
 Meow*** + 500神马都是浮云

查看全部评分

苦力怕论坛,感谢有您~
 发表于 2024-10-27 12:04:54|显示全部楼层 IP:安徽省
看不懂,但是感谢分享。
2#2024-10-27 12:04:54回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

 发表于 2024-10-27 13:10:23 来自手机|显示全部楼层 IP:广东省
感谢分享
3#2024-10-27 13:10:23回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

 发表于 2024-10-27 13:22:16|显示全部楼层 IP:广东省
感谢分享!
不过,个人建议尽量避免使用版本号带 alpha beta 的测试版组建——这些组建每次更新 SAPI 都要更新,相当麻烦,还要打开“测试版API”才能用。
(当然,用到测试版才有的内容的话那就没办法了)
4#2024-10-27 13:22:16回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

 发表于 2024-10-27 18:25:45 来自手机|显示全部楼层 IP:广东省
那能否使用Script API检测玩家发送的消息然后做出特定的行为吗🤔
就和自定义指令一样
5#2024-10-27 18:25:45回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

 发表于 2024-10-27 23:36:23 来自手机|显示全部楼层 IP:广西
感谢楼主教程
6#2024-10-27 23:36:23回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

 发表于 2024-11-17 17:13:33 来自手机|显示全部楼层 IP:浙江省
ActionForm:按钮表单 [button UI]

MessageForm:消息表单(也叫双按钮表单)[dual button UI]

ModalForm:自定义表单 [custom UI]

我一般不用MessageForm

7#2024-11-17 17:13:33回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

 发表于 2024-11-24 04:41:01 来自手机|显示全部楼层 IP:河北省
本帖最后由 liyuzuo 于 2024-12-2 16:56 编辑

感谢大佬让我弄懂了怎么写UI
这是我写的钟表菜单
https://klpbbs.com/thread-152072-1-1.html
8#2024-11-24 04:41:01回复收起回复
苦力怕论坛,感谢有您~
回复支持

使用道具举报

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

粤公网安备 44200002445329号 | 由 木韩网络 提供支持 | GMT+8, 2024-12-27 22:01

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4 粤ICP备2023071842号-3