[开发者心得] 【2D UI使用大全】各种2DUI的使用方法!大佬们快看过来!

[复制链接]
3263 |5
空伊伊 发表于 2023-2-23 17:02:38 | 显示全部楼层 |阅读模式

本帖最后由 空伊伊 于 2023-11-8 17:38 编辑

UI使用大全

目录

⭐创建UI文件

⭐用法一:直接拖到屏幕上当装饰

⭐用法二:拖动到场景中当世界UI

⭐用法三:编写UI脚本让UI执行逻辑

⭐用法四(推荐):使用“导出所有脚本”功能,并结合 UIService 动态展示UI

⭐用法五:用代码创建UI,并将UI显示出来

</br>

创建UI文件

万事开头难!咱们先来拼UI!

UI(User Interface) 就是我们在游戏进行中时在屏幕中显示的用户界面,如游戏中的头像、血条、背包、技能按钮等。在口袋方舟编辑器中,为了方便开发者方便区分游戏逻辑与UI逻辑,所以将UI开发部分进行了分离。

当我们创建UI时,首先要在编辑器界面创建一个独立的UI文件进行开发,具体步骤如下:

在“工程窗口”单击UI选项切换到UI资源窗口,然后单击“新建UI”按钮,编辑器会给我们创建一个UI文件,这里命名为 "MyUI" ,如图:

image-20231009102805480

双击 "MyUI" 文件,打开UI编辑器进行UI制作,如图:我创建了一个老虎图片以及一个文本按钮

img

在编辑器的工具栏中,包含了一个“保存”按钮,每次我们在UI编辑器中操作后,都一定要在这里单击“保存”按钮,才会把修改信息保存到UI文件中,如图:

img

</br>

用法一:直接拖到屏幕上当装饰

这是最低阶的用法了,UI除了当装饰,啥用也没有

img

</br>

用法二:拖动到场景中当世界UI

这是稍微低阶的用法,因为你学会了用世界UI

img

</br>

用法三:编写UI脚本让UI执行逻辑

这是最基本,但是比较繁琐的用法。

在开始步骤讲解前,先进行一个知识点补充:

知识点补充:“物体脚本”和UI脚本

1.物体脚本:

”物体脚本“是我自己取的名字哈,我把继承 Script 的脚本统称为”物体脚本“ 。

我们点击脚本窗口的 “新建脚本” 创建出的脚本默认继承 Script

物体脚本的特点:

  • 具有自己的生命周期函数(onStart、onUpdate、onDestroy)

    image-20231009104325412

  • 可以通过 this.gameObject 获得自己挂载的物体

    image-20231009104702928

2.UI脚本:

我把继承 UIScript 的脚本统称为 “UI脚本”

我们点击脚本窗口的 “新建UI脚本”, 创建出来的脚本默认继承 UIScript

img

UI脚本的特点:

  • 有自己的生命周期函数

    这里就有很多了,创建一个UI脚本会默认把各个生命周期函数都加进去,大家可以自行了解 (当UI被拖动到场景上,且身上绑定了UI脚本,那么UI脚本将会执行自己的生命周期)

    image-20231009105442886

步骤1:创建UI脚本并挂载到UI上

img

步骤2:在UI脚本里找到对应控件并添加逻辑

查找对应控件需要使用 findChildByPath,并传入UI的完整路径

img

选中UI,右键,可以复制组件的完整路径

export default class MyUI extends UIScript {

    /** 
     * 构造UI文件成功后,在合适的时机最先初始化一次 
     */
    protected onStart() {
        //设置能否每帧触发onUpdate
        this.canUpdate = false;
        this.layer = UILayerMiddle;

        // 根据UI组件的路径,从UI对象上找到对应的组件,并as成对应的类型
        let btn = this.uiWidgetBase.findChildByPath("RootCanvas/mMyButton") as StaleButton

        // 给文本按钮的点击事件添加一个逻辑
        btn.onClicked.add(() => {
            // 当按钮被点击后,改变按钮的文本
            btn.text = "我被点击啦!"
        })
    }
}

步骤3:将UI拖动到场景上,执行看效果

img

img

</br>

用法四(推荐):使用“导出所有脚本”功能,并结合 UIService 动态展示UI

前面三种方式,都是需要将UI拖到场景中才能使用,这里介绍一种不用将UI拖到场景中也能使用的方法!

步骤1:点击“导出所有脚本”按钮,创建「UI生成脚本」

img

导出结果:

导出的脚本会被自动存放在ui-generate文件夹里,在这里我将这些脚本称之为“「UI生成脚本」”

img

「UI生成脚本」的作用:帮我们完成了查找控件

image-20231009110914278

步骤2:创建一个脚本,继承「UI生成脚本」

img

(大家可能有个疑问,为什么已经导出了UI脚本了,这里还要来创建一个? 这是因为UI编辑器每次导出UI都会重新覆盖UI生成脚本,所以如果直接把逻辑写在UI生成脚本当中,就会导致自己写的代码被覆盖)

步骤3:在脚本里编写自己想要的逻辑

export class MyUI extends MyUI_Generate {

    protected onAwake(): void {
        // 由于继承了「UI生成脚本」所以可以直接通过this.来获取到父类的组件
        this.mMyButton.onClicked.add(() => {
            this.mMyButton.text = "我被点击了!"
        })
    }
}

步骤4:通过 UIService.show() 展示UI

用 UIService 的好处在于,你可以方便的显示和隐藏你想操作的UI,只需要传入类名就可以实现

import MyUI from "./MyUI";

@Component
export class GameStart extends Script {

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        if (SystemUtil.isClient()) {
            // 显示出MyUI
            UIService.show(MyUI)
        }
    }
}

</br>

用法五:用代码创建UI,并将UI显示出来

提一句,用法四其实也是动态创建了UI。当调用 UIService 的 show 方法时,如果UI没被创建,那么就会创建一个新的UI;如果已经被创建了,那么就会直接将UI进行显示。

创建方式1:通过UI名字创建(createUIByName)

缺点:这种方式就只是创建了一份不会执行任何逻辑的UI,UI组件的逻辑需要重新书写

let ui = mw.createUIByName("MyUI")
ui.addToViewport(1)

创建方式2:通过绝对路径创建(createUIByPath)

缺点:这种方式就只是创建了一份不会执行任何逻辑的UI,UI组件的逻辑需要重新书写

let ui = mw.createUIByPath("D:...\\Projects\\EmoDemo\\UI\\MyUI.ui")
ui.addToViewport(1)

创建方式3(推荐):通过UI名字以及UI派生类的类名创建(creatUI)

这种方式不仅可以创建UI,并且UI脚本上的逻辑也会相应执行

let ui = mw.createUI("MyUI", MyUI)
ui.uiWidgetBase.addToViewport(1)

创建方式4:(无中生有!)完全使用代码创建UI

这种方式可以省去拼UI的那一步操作,以后就没人敢叫你UI仔了

if (SystemUtil.isClient()) {

    // 创建一个UI对象
    let ui = mw.UserWidget.newObject();
    // 将UI添加到屏幕上
    ui.addToViewport(1)

    // 创建一个画布组件
    let rootCanvas = mw.Canvas.newObject()
    rootCanvas.size = new Vector2(1920, 1080);
    rootCanvas.position = Vector2.zero

    // 将Ui的根画布设置为rootCanvas
    ui.rootContent = rootCanvas

    // 创建一个UI添加到画布上
    let text = mw.TextBlock.newObject(rootCanvas)
    text.position = new Vector2(500, 500)
    text.size = new Vector2(1000, 100)
    text.text = "欲买桂花同载酒 终不似 少年游"
}

img

imgimgimg

祝你早日成为UI大师!

更多图片 小图 大图
组图打开中,请稍候......
回复

使用道具 举报

喵喵哭唧唧 发表于 2023-2-23 17:08:41 | 显示全部楼层
细还是你细,真的细
回复

使用道具 举报

JellyFish 发表于 2023-2-24 09:58:57 | 显示全部楼层
本帖最后由 JellyFish 于 2023-2-24 10:03 编辑

用法五的前两个创建方法也是可以有逻辑的
let myUI = UI.createUIByName("MyUI");
let uiBehavior = UI.findUIBehavior(myUI) as TestUI;
uiBehavior.showText();


需要在ui root节点上的TS脚本挂载该ui的逻辑脚本
image.png



回复

使用道具 举报

三分之一的雪碧 发表于 2023-2-24 10:20:21 | 显示全部楼层
创建UI也可以使用let ui = UI.getUI("MyUI", MyUI);
回复

使用道具 举报

空伊伊楼主 发表于 2023-2-24 10:29:38 | 显示全部楼层
三分之一的雪碧 发表于 2023-2-24 10:20
创建UI也可以使用let ui = UI.getUI("MyUI", MyUI);


getUI的完整写法应该是UI.UIManager.instance.getUI()吧,这是UIManager封装的方法,本质上还是用的creatUI
image.png
回复

使用道具 举报

空伊伊楼主 发表于 2023-2-24 10:30:06 | 显示全部楼层
JellyFish 发表于 2023-2-24 09:58
用法五的前两个创建方法也是可以有逻辑的

牛哇牛哇!我补充到教程里!
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表