GUI组件介绍
在使用GUI部分功能时,建议先了解以下列出的十二种组件.
每种组件的第一行索引名可以自定义,
type决定了你所选用的组件类型.组件有一些相通的属性字段例如,tooltip,initDos等,且每个组件内不需要的字段都是可以删除的,例如options的startX,如果不需要可以整行删除
基本选项
一个GUI界面最多只能有一个基本选项(options)
#options标识符表示设置这个GUI的参数(该标识符可全部删除)
options:
#设置起始坐标轴,你可以根据你的习惯来设置这个界面的原点。(如果删除此行,默认为MC界面的最上边)
startX: "w*0.01"
#设置起始坐标轴,你可以根据你的习惯来设置这个界面的原点。(如果删除此行,默认为MC界面的最左边)
startY: "10"
#此界面的优先级 优先级越大 越不会被遮住 (物品模型的默认优先级都很大,要想把物品模型遮住,Z轴就要很大) 不懂不要管 直接删去就可以 默认为 0
startZ: "10"
#当width不为零时 设置 startX 为 right center 分别会将startX的坐标起始点设置为 最右边 中间
width: "0"
#当height不为零时 设置 startY 为 bottom center 分别会将startY的坐标起始点设置为 最下边 中间
height: "0"
#打开一次后就在客户端删除该界面的缓存(就是打开并关闭后,需要重载才能再打开,给写插件时用的,写配置直接删去)可删除 默认false
consume: false
#是否开启编辑模式,开启后将会绘制指针的坐标位置(可删除,默认为false)
#开启后可用鼠标拖动组件位置和大小,按下S键切换至大小设置模式,按下V键切换至位置设置模式,设置时可中途右键鼠标放弃当前任务
guide: false
#变量检测器刷新频率,单位tick,默认1tick
watchdog: 1
#详细教程看 https://wiki.germmc.com/docs/gui/client-script
#一般用来做脚本处理时的数据,填写json
data: |
{
num:10,
}
#variables字段,例如下方的示例,则可以在该ui内的字段里直接使用 `{{a}}` `{{c.d}}` 来获取variable内的值
variables: |
{
a:1,
c:{
d:3
}
}
#导入GermPlugin/jexl目录下的js脚本文件,省略该目录路径
scriptjs: |
@import main1.js;
#也可以在界面内直接嵌入脚本;未标明client/server时默认为客户端脚本
script:
#可复用方法
methods: |
var add = (x,y)->{
return x+y;
}
#界面更新时执行,频率受客户端帧率影响
updateScript: |
Log.chat('cycle '+updateCount);
#每次渲染调用,HUD界面慎用
renderScript: |
Log.chat('render '+renderCount);
#tick执行,一秒20次
tickScript: |
Log.chat('tick '+tickCount);
#脚本初始化时执行,支持客户端和服务端分别填写
openScript:
client: |
Log.chat('open');
server: |
Log.info('open');
#收到服务端下发数据时执行
dataScript: |
Log.chat('data');
#服务端响应脚本,客户端可通过 GermScreen.post(path, data) 主动请求服务端
#服务端在响应里写入内容后,会触发这里对应path的脚本
responseScript:
germplugin_test1: |
Log.chat('response '+responseContent.toString());
#脚本卸载时执行,支持客户端和服务端分别填写
closeScript:
client: |
Log.chat('close');
server: |
Log.info('close');
#滚轮时执行
scrollScript: |
Log.chat('scroll '+scrollChange);
#滚动前执行,返回false可以阻止滚动
scrollPreScript: |
return true;
#按键脚本,可以按 keyDown@按键 / keyUp@按键 区分
keyScript:
keyDown@U: |
Log.chat('key down '+str(keyType));
#通用按下/松开脚本
keyDownScript: |
Log.chat('key down');
keyUpScript: |
Log.chat('key up');
#当点击无组件的地方时 是否要丢出鼠标上的物品 (在颠覆界面无需使用)
dropCursorItem: false
#是否取消ESC关闭界面 (可删除默认为 false)
escCancel: false
#是否是置顶的HUD 默认为false
topperHud: false
#是否需要与hud交互 默认为false 开启后打开界面可以直接与HUD交互,可以做到把GUI的物品拖到HUD上之类的操作
interactiveHud: false
#如果该界面在最顶层 开启下面选项后 按下ESC只会关闭这个界面 (关闭escCancel才有效,可删除默认为false)
escCloseOnly: false
#是否开启背景虚化 默认为false 也可以设置虚化的具体时间 例如 1000 代表1秒
blur: false
#当界面被关闭的时候会触发
closeDos:
- "message<->thisGui界面被关闭了"
#当玩家在此界面按下按键时触发
#不支持keyup的组合按键
#不支持鼠标滚轮点击的响应
keyDos:
keyDown@U:
- "message<->按下了 U 键"
keyDown@LSHIFT@A:
- "message<->按下了 左SHIFT + A 键"
keyDown@LSHIFT@MLEFT:
- "message<->按下了 左SHIFT + 鼠标左键"
keyUp@U:
- "message<->松开了 U 键"
#点击到拖动bar是否吞掉点击操作
#这样就不会穿透点击到其他组件了
dragSwallow: true
#这里设置窗口拖动的参数 删掉代表无法拖动
drag:
#可拖动区域的坐标
locationX: "0"
locationY: "0"
#可拖动区域的宽度
width: "100"
#可拖动区域的高度
height: "100"
#布局器 它可以帮助你填充组件进去
#如果在options参数中使用需要设置options内的width和height
layout:
#布局器类型 FLOW 将根据组件的宽高 自动瀑布流式的填充进容器
type: FLOW
# 组件间隙
gapX: "5"
gapY: "5"
# 组件填充 每个组件前填充一个指定大小的空白距离
# 与组件间隙的区别在于 第一个组件前是否有空隙
fillX: "5"
fillY: "5"
#打开界面时的声音,删除此行默认无声
openSound: "minecraft:block.anvil.use"
#打开GUI时执行一些关于GUI的特殊操作 以下称为dos(可删除)
#dos都是以 标记<->参数 的形式书写 不同的标记拥有不同的功能
openDos: |
message<->开了界面thisGui
#每次滚动滚轮会触发的dos %scroll_change% 为本次滚动了多少距离 有正负之分
scrollDos:
- "message<->滚动了%scroll_change%"
#所有dos都还支持列表的这种写法
#但是更推荐上面的长字符串的这种写法,可以利用缩进格式增加可读性
#openDos:
# - "openChild<->default3" #打开一个子窗口(default3也是一个gui目录下的yml文件)
#这个界面中支持动画的部件共有的动画,目前动画还不是所有部件兼容,但是后面会一个一个兼容直到全部兼容(可删除)
#目前兼容动画的部件有 GIF 图片 按钮 字符串 物品模型
animations:
- "default_move"
最简GUI配置【可直接复制】
在服务端插件目录中新建 GermPlugin/gui/hello.yml,写入下面配置。重载后使用 /gp open <玩家名> hello 打开。
hello:
title:
type: label
locationX: "w*0.5"
locationY: "h*0.5"
align: center
texts:
- "&a你好,%player_name%"
- "&7这是我的第一个萌芽GUI"
上面的 hello 是界面名,title 是组件索引名。options 可以整块不写;每个真正要显示的组件必须写 type,否则客户端会跳过这个组件。
图片组件
#图片组件
#该索引名(下面第一行的名称)仅为示例,请在正式配置时进行修改,每个组件的索引名均不可重复!!
texture:
#是否开启这个组件 (关闭后任何效果、显示、互动、功能啥的都不存在了,就跟没有似的) (可删除默认为显示)
# 如果将 enable 后面的 true或false 设置某个条件 将自动匹配条件开关
# 例如填写 enable: "%player_health% = 100" 当玩家的血量到达100时才会开启该组件
# 例如填写 enable: "str(%player_has_permission_germ_gui%,true) || str(%player_has_permission_germ_gui%,true) " 当玩家拥有权限germ_gui时才会显示
#以下每个部件都有这个选项 不再列出
enable: true
#悬浮时候显示的tooltip就跟原版悬浮到道具时显示的lore界面一样(可删除 默认为不显示)
#以下每个部件都有这个选项 不再列出
tooltip:
- '&c我是悬浮的时候被显示出来的那个'
#type作为标记这个部件是什么类型
type: texture
#吞掉点击 默认false
#这样就不会穿透点击到其他组件了
swallow: false
#视口剔除 默认为false
#根据组件的位置和大小来剔除不在视口内的组件 (视口指 游戏窗口和滚动框形成的可视窗口)
#注意的是 开启后如果组件的位置和大小设置不正确可能会被隐藏 例如实体模型组件
viewportCulling: false
#图片的材质路径地址可以使用 local<->地址
#还支持base64编码的图片 例如 base64<->base64Code 萌芽自带的api=com.germ.germplugin.api.util.ImageUtil.bufferedImageToBase64(bufferedImage, formatName) 其他编码方法java.util.Base64.getEncoder().encodeToString
#同时支持网络连接地址 前面必须加上标记 url<-> 例如:url<->https://s1.ax1x.com/2020/06/19/NnqzVK.png
#其中 local<->可以省略,但是url<->必须加上
#当这样写 path: 'url<->https://xxx.png' 时,萌芽MOD会将图片缓存在GermCache根目录下
#但是也可以这样写 path: 'textures/url<->https://xxx.png' 这样萌芽MOD会将图片缓存在 GermCache/textures/目录下方便分类管理
path: 'local<->textures/misc/logo.png'
#图片的显示起始坐标(图片的左上角为起始点)
locationX: "w-90"
locationY: "h-90"
#优先级 通常情况下删了就可以了
locationZ: "0"
#这里也可以直接使用x代替locationX y代替locationY z代替locationZ
#x: "w"
#y: "h"
#z: 100
#宽度width和高度height也同样支持运算符和 w h 变量 w代表整个MC的宽度
#使用 tw1 可以代表在path填下的图片的真实宽度
width: "50"
#使用 th1 可以代表在path填下的图片的真实高度
height: "50"
#简写 w h
#w: "50"
#旋转
rotateY: "0"
rotateX: "0"
rotateZ: "0"
#width/height尺寸锚点,默认left_top;可选 left_top top right_top left center right left_bottom bottom right_bottom
sizeAnchor: "left_top"
#额外渲染缩放,1为原大小;scaleAnchor和rotateAnchor默认center
scale: "1"
scaleAnchor: "center"
rotateAnchor: "center"
#这四个参数可以截取图片的一部分渲染 详情见wiki https://wiki.germmc.com/docs/gui/components
#小技巧 当UV大于图片本身的真实宽高时 会自动循环截取图片 可以用来做平铺到满屏的背景效果
startU: '10'
startV: '10'
endU: "20"
endV: "20"
#从startU开始 截取后面的10个像素 (4.4.0+)
widthU: "10"
heightV: "10"
#自动九宫格缩放
#在调整宽时 水平方向上 会只缩放 splitU 指定的一段
#在调整高时 垂直方向上 会只缩放 splitV 指定的一段来
#填固定数字时 注意是图片的真实纹理大小
#注意使用了 startU endU startV endV 时 splitU splitV 需要根据裁剪后的区域设置splitU splitV
splitU: '10'
splitV: '10'
#当界面打开的时候 组件第一次加载后触发该Dos
#所有组件都有这个Dos因为篇幅 下面不在罗列
initDos:
- "message<->我是界面 thisGui 的组件 thisPart"
#所有组件都有这个Dos 下面不在罗列
tickDos: |
message<->我是tickdos
#这个图片的动画(可删除)
animations:
- "default_scale"
图片组件【简略版例子】
texture:
type: texture
path: 'local<->textures/misc/logo.png'
locationX: "w-tw1/2"
locationY: "h-th1/2"
width: "tw1"
height: "th1"
UV为截取图片中的一部分显示出来,其中黑框为图片原始大小,红框为图片截取范围,灰线的长度为对应UV的大小

locationZ可以理解为组件离下图红色框体的距离,
要注意的是在设置实体与物品的locationZ时,因为实体和物品是立体的,所以其本身也占了一定的Z轴大小
