界面 / UIScript
UIScript Class
UI 的驱动脚本基类
- UIScript 是如何工作的?
当你想要使用编辑器的 UI 功能时,便很大几率要接触 UIScript,除非使用 UserWidget 自定义创建界面。
继承自 UIScript 与继承自 Script 的脚本有所不同,继承自 Script 的脚本挂载在对象管理器中,编辑器会自动帮你调用生命周期函数。但是继承自 UIScript 的脚本放置在对象管理器中,编辑器是不会自动帮你调用生命周期函数的。
他需要依赖 UIService 或 UIPrefab。
- 继承自 UIScript 脚本享受的生命周期有哪些?
🌵 这里有详细的描述
https://docs-028.ark.online/UI/LifeCycleandEventDescriptionofUIScripts.html
- 什么时候编辑器会帮你调用 UI 的生命周期呢?
有两种方式:
使用 UIService 帮你管理此脚本,当 UIService.create 并 show 时,会启动脚本的生命周期。
使用 UIPrefab 。脚本挂载在 UIPrefab 上,并把 UIPrefab 放在对象管理器中。
Hierarchy
Table of contents
Accessors
canUpdate(): boolean client |
---|
获取是否能触发 UI 中 onUpdate 生命周期函数 |
fullScreen(inFull : boolean ): void client |
设置随父节点全屏适配,会验证父节点大小以保证跟随父节点的大小 |
layer(): number client |
获取 UI 的 Layer 层级 |
rootCanvas(): Canvas client |
获取 UI 的根 Canvas 节点 |
uiObject(): Widget |
获取 UI 顶层控件对象 |
uiWidgetBase(): UserWidget client |
获取 UI 顶层控件对象 |
visible(): boolean client |
获取 UI 是否显示 |
Methods
destroy(): void client |
---|
销毁 UI 对象 |
detectDrag(dragKey : Keys ): EventReply client |
触发 DragDrop 事件的检测 |
detectDragIfPressed(inPointEvent : PointerEvent , dragKey : Keys ): EventReply client |
事件检测通过,触发 DragDrop 事件的回复。 |
newDragDrop(inVisualWidget : Widget , inTag? : string , inPayLoad? : any , inPivot? : DragPivot , inOffset? : Vector2 ): DragDropOperation client |
创建 DragDrop 事件 |
remove(): void client |
移除 UI 对象 |
setVisible(inVisible : boolean SlateVisibility , ...params : any []): void client |
设置 UI 是否显示 |
addBehavior(key : string , value : any ): void client |
添加一个全局行为 |
clearBehavior(): void client |
清空全局一个行为 |
getBehavior(key : string ): any client |
执行一个全局的行为 |
removeBehavior(key : string ): void client |
移除全局一个行为 |
Accessors
canUpdate
• | • | ||||
---|---|---|---|---|---|
获取是否能触发 UI 中 onUpdate 生命周期函数 默认是 false Returns
| 设置是否能触发 UI 中 onUpdate 生命周期函数 Parameters
|
fullScreen
• | ||
---|---|---|
设置随父节点全屏适配,会验证父节点大小以保证跟随父节点的大小 Parameters
|
layer
• | • | ||||
---|---|---|---|---|---|
获取 UI 的 Layer 层级 Returns
| 设置 UI 的所在的 Layer 层级 显示可能会影响到 zOrder,使用 UIService 显示 UI 时,会根据 Layer 层级动态设置 zOrder,每一次调用都会重新计算当前 layer 的新 zOrder,确保 UI 位于当前层级的顶端。 Parameters
|
ts
// @description 场景 zOrder开始于0
const UILayerScene: typeof mw.UILayerScene;
// @description 底层 zOrder开始于100000
const UILayerBottom: typeof mw.UILayerBottom;
// @description 中层 zOrder开始于200000
const UILayerMiddle: typeof mw.UILayerMiddle;
// @description 独享层(调用此层会自动隐藏Bottom和Middle层) zOrder开始于300000
const UILayerOwn: typeof mw.UILayerOwn;
// @description 顶层 zOrder开始于400000
const UILayerTop: typeof mw.UILayerTop;
// @description 对话 zOrder开始于500000
const UILayerDialog: typeof mw.UILayerDialog;
// @description 系统 zOrder开始于600000
const UILayerSystem: typeof mw.UILayerSystem;
// @description 错误 这个层级不可以使用,需要增加层级可以使用addUILayerMap zOrder开始于700000
const UILayerError: typeof mw.UILayerError;
// @description 场景 zOrder开始于0
const UILayerScene: typeof mw.UILayerScene;
// @description 底层 zOrder开始于100000
const UILayerBottom: typeof mw.UILayerBottom;
// @description 中层 zOrder开始于200000
const UILayerMiddle: typeof mw.UILayerMiddle;
// @description 独享层(调用此层会自动隐藏Bottom和Middle层) zOrder开始于300000
const UILayerOwn: typeof mw.UILayerOwn;
// @description 顶层 zOrder开始于400000
const UILayerTop: typeof mw.UILayerTop;
// @description 对话 zOrder开始于500000
const UILayerDialog: typeof mw.UILayerDialog;
// @description 系统 zOrder开始于600000
const UILayerSystem: typeof mw.UILayerSystem;
// @description 错误 这个层级不可以使用,需要增加层级可以使用addUILayerMap zOrder开始于700000
const UILayerError: typeof mw.UILayerError;
rootCanvas
• | ||
---|---|---|
获取 UI 的根 Canvas 节点 Returns
|
ts
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
UIService.show(newUI);
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
this.canUpdate = false;
this.layer = UILayerScene;
console.log(this.uiObject.name);
console.log(this.uiWidgetBase.name);
console.log(this.rootCanvas.name);
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "button";
this.button.visibility = SlateVisibility.Visible;
}
}
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
UIService.show(newUI);
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
this.canUpdate = false;
this.layer = UILayerScene;
console.log(this.uiObject.name);
console.log(this.uiWidgetBase.name);
console.log(this.rootCanvas.name);
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "button";
this.button.visibility = SlateVisibility.Visible;
}
}
uiObject
• | ||
---|---|---|
获取 UI 顶层控件对象 Returns
|
ts
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
UIService.show(newUI);
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
this.canUpdate = false;
this.layer = UILayerScene;
console.log(this.uiObject.name);
console.log(this.uiWidgetBase.name);
console.log(this.rootCanvas.name);
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "button";
this.button.visibility = SlateVisibility.Visible;
}
}
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
UIService.show(newUI);
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
this.canUpdate = false;
this.layer = UILayerScene;
console.log(this.uiObject.name);
console.log(this.uiWidgetBase.name);
console.log(this.rootCanvas.name);
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "button";
this.button.visibility = SlateVisibility.Visible;
}
}
uiWidgetBase
• | ||
---|---|---|
获取 UI 顶层控件对象 Returns
|
ts
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
UIService.show(newUI);
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
this.canUpdate = false;
this.layer = UILayerScene;
console.log(this.uiObject.name);
console.log(this.uiWidgetBase.name);
console.log(this.rootCanvas.name);
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "button";
this.button.visibility = SlateVisibility.Visible;
}
}
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
UIService.show(newUI);
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
this.canUpdate = false;
this.layer = UILayerScene;
console.log(this.uiObject.name);
console.log(this.uiWidgetBase.name);
console.log(this.rootCanvas.name);
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "button";
this.button.visibility = SlateVisibility.Visible;
}
}
visible
• | • | ||||
---|---|---|---|---|---|
获取 UI 是否显示 Returns
| 设置 UI 是否显示 会触发绑定的脚本生命周期中 OnShow/OnHide 事件,需要传递参数的可以使用 setVisible 方法。 Parameters
|
Methods
destroy
• destroy(): void
client
销毁 UI 对象
detectDrag
• detectDrag(dragKey
): EventReply
client
触发 DragDrop 事件的检测
Parameters
dragKey Keys | 触发按键 default:mw.Keys |
---|
Returns
EventReply | 返回触发的事件回复 |
---|
detectDragIfPressed
• detectDragIfPressed(inPointEvent
, dragKey
): EventReply
client
事件检测通过,触发 DragDrop 事件的回复。
Parameters
inPointEvent PointerEvent | 传递触发的事件信息 |
---|---|
dragKey Keys | 触发按键 |
Returns
EventReply | 返回触发的事件回复 |
---|
newDragDrop
• newDragDrop(inVisualWidget
, inTag?
, inPayLoad?
, inPivot?
, inOffset?
): DragDropOperation
client
创建 DragDrop 事件
Parameters
inVisualWidget Widget | 拖拽显示的UI控件 |
---|---|
inTag? string | 标签文本 default:"" range:不做限制 |
inPayLoad? any | 拖拽事件数据信息 default:null |
inPivot? DragPivot | 拖拽显示UI的锚点 default:UIType.DragPivot.TopLeft |
inOffset? Vector2 | 拖拽显示UI相对于锚点的偏移的百分比 default:vector2(0,0) |
Returns
DragDropOperation | 返回触发的事件回复 |
---|
remove
• remove(): void
client
移除 UI 对象
setVisible
• setVisible(inVisible
, ...params
): void
client
设置 UI 是否显示
Parameters
inVisible boolean SlateVisibility | 设置是否可见,如果是 boolean 类型设置为 SelfHitTestInvisible ,不可见设置为 Collapsed, 否则为按照枚举拉设置具体的显示类型。 |
---|---|
...params any [] | 传递给onShow的参数 |
会触发绑定的脚本的 OnShow/OnHide 事件,可以传递参数。
addBehavior
• Static
addBehavior(key
, value
): void
client
添加一个全局行为
Parameters
key string | 行为标记 range:字符串长度不受限制,合理即可 |
---|---|
value any | 行为值 |
UI 事件通信的一种更加简便的方式。
使用示例: 创建一个名为 NewScript 的脚本,放置在对象栏中,打开脚本,将原本内容修改为如下内容,保存并运行游戏,会在场景中生成一个屏幕 UI - 按钮,按下P键,按钮文字发生改变。ts
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
//UIService.create(newUI);
UIService.show(newUI);
UIScript.addBehavior("UI",(ui:StaleButton)=>{
ui.text = "change";
});
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
//设置能否每帧触发onUpdate
this.canUpdate = false;
this.layer = UILayerMiddle;
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "Press to turn red";
this.button.transitionEnable = true;
this.button.pressedImagColor = LinearColor.red;
this.button.visibility = SlateVisibility.Visible;
this.button.onClicked.add(() => {
console.log("click");
})
InputUtil.onKeyDown(Keys.P,()=>{
let ui = UIScript.getBehavior("UI");
ui(this.button);
});
}
}
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
//UIService.create(newUI);
UIService.show(newUI);
UIScript.addBehavior("UI",(ui:StaleButton)=>{
ui.text = "change";
});
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
//设置能否每帧触发onUpdate
this.canUpdate = false;
this.layer = UILayerMiddle;
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "Press to turn red";
this.button.transitionEnable = true;
this.button.pressedImagColor = LinearColor.red;
this.button.visibility = SlateVisibility.Visible;
this.button.onClicked.add(() => {
console.log("click");
})
InputUtil.onKeyDown(Keys.P,()=>{
let ui = UIScript.getBehavior("UI");
ui(this.button);
});
}
}
clearBehavior
• Static
clearBehavior(): void
client
清空全局一个行为
getBehavior
• Static
getBehavior(key
): any
client
执行一个全局的行为
Parameters
key string | 行为标记 range:字符串长度不受限制,合理即可 |
---|
Returns
any | 返回一个行为 |
---|
ts
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
//UIService.create(newUI);
UIService.show(newUI);
UIScript.addBehavior("UI",(ui:StaleButton)=>{
ui.text = "change";
});
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
//设置能否每帧触发onUpdate
this.canUpdate = false;
this.layer = UILayerMiddle;
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "Press to turn red";
this.button.transitionEnable = true;
this.button.pressedImagColor = LinearColor.red;
this.button.visibility = SlateVisibility.Visible;
this.button.onClicked.add(() => {
console.log("click");
})
InputUtil.onKeyDown(Keys.P,()=>{
let ui = UIScript.getBehavior("UI");
ui(this.button);
});
}
}
@Component
export default class NewScript extends Script {
protected onStart(): void {
if(SystemUtil.isClient()){
//UIService.create(newUI);
UIService.show(newUI);
UIScript.addBehavior("UI",(ui:StaleButton)=>{
ui.text = "change";
});
}
}
}
class newUI extends UIScript{
button:StaleButton;
protected onStart() {
//设置能否每帧触发onUpdate
this.canUpdate = false;
this.layer = UILayerMiddle;
this.button = StaleButton.newObject(this.rootCanvas);
this.button.text = "Press to turn red";
this.button.transitionEnable = true;
this.button.pressedImagColor = LinearColor.red;
this.button.visibility = SlateVisibility.Visible;
this.button.onClicked.add(() => {
console.log("click");
})
InputUtil.onKeyDown(Keys.P,()=>{
let ui = UIScript.getBehavior("UI");
ui(this.button);
});
}
}
removeBehavior
• Static
removeBehavior(key
): void
client
移除全局一个行为
Parameters
key string | 行为标记 range:字符串长度不受限制,合理即可 |
---|