Skip to content
UI 脚本的生命周期及事件说明

UI 脚本的生命周期及事件说明

阅读本文大概需要 5 分钟

UI 脚本中基础的生命周期事件

onStart() : void

  • 当脚本被实例后,会在第一帧更新之前调用 onStart 函数
  • 编辑器在为任何脚本调用 onUpdate 等函数之前,将在所有脚本上调用 onStart 函数

示例:

ts
/** 仅在游戏时间对非模板实例调用一次 */
    protected onStart() { 
    }
/** 仅在游戏时间对非模板实例调用一次 */
    protected onStart() { 
    }

onUpdate(dt : number) : void

  • 编辑器会在游戏每帧调用一次 onUpdate 函数,这是用于帧更新的主要函数
  • 其中(dt : number)为时间差值,表示当前帧与上一帧的延迟 / 秒
  • onUpdate 函数由 canUpdate 控制,默认为关闭,需要手动设置 canUpdate 为 true 才能调用 onUpdate 函数

示例:

ts
/** 仅在游戏时间对非模板实例调用一次 */
    protected onStart() { 
        //5s后设置为开启每帧触发onUpdate,默认情况下不调用onUpdate函数
        console.log(this.canUpdate)
        setTimeout(() => {
            this.canUpdate = true;
            console.log(this.canUpdate)
        }, 5000);
    }

    /**
    * 每一帧调用
    * 通过canUpdate可以开启关闭调用
    * dt 两帧调用的时间差,毫秒
    */
    protected onUpdate(dt :number) {
        console.log("onUpdate")
    }
/** 仅在游戏时间对非模板实例调用一次 */
    protected onStart() { 
        //5s后设置为开启每帧触发onUpdate,默认情况下不调用onUpdate函数
        console.log(this.canUpdate)
        setTimeout(() => {
            this.canUpdate = true;
            console.log(this.canUpdate)
        }, 5000);
    }

    /**
    * 每一帧调用
    * 通过canUpdate可以开启关闭调用
    * dt 两帧调用的时间差,毫秒
    */
    protected onUpdate(dt :number) {
        console.log("onUpdate")
    }

onDestroy(): void

脚本存在的最后一帧执行完,且在 OnUpdate 函数执行完毕后,调用此函数

示例:

ts
/** 仅在游戏时间对非模板实例调用一次 */
    protected onStart() { 
        let behavior=findUIBehaviour(this.uiWidgetBase)
        behavior.destroy()
    }

    /** 
    * 构造UI文件成功后,UI对象再被销毁时调用 
    * 注意:这之后UI对象已经被销毁了,需要移除所有对该文件和UI相关对象以及子对象的引用
    */
    protected onDestroy() {
        console.log("destroy")
    }
/** 仅在游戏时间对非模板实例调用一次 */
    protected onStart() { 
        let behavior=findUIBehaviour(this.uiWidgetBase)
        behavior.destroy()
    }

    /** 
    * 构造UI文件成功后,UI对象再被销毁时调用 
    * 注意:这之后UI对象已经被销毁了,需要移除所有对该文件和UI相关对象以及子对象的引用
    */
    protected onDestroy() {
        console.log("destroy")
    }

UI 脚本中其他的生命周期事件

onAwake(): void

在 onStart 函数调用之前,编辑器会先调用一次此函数

示例:

ts
/** 
     * 场景创建时或prefab实例化时调用,仅执行一次
     * 在onStart函数调用之前
     */
    protected onAwake() {
        console.error("UI Has Create==")
    }
/** 
     * 场景创建时或prefab实例化时调用,仅执行一次
     * 在onStart函数调用之前
     */
    protected onAwake() {
        console.error("UI Has Create==")
    }

onAdded(): void

当 UI 添加到 canvas 的时候会触发这个 UI 的 onAdd()函数

示例:

ts
/** 
     * 构造UI文件成功后,onStart之后 
     * 对于UI的根节点的添加操作,进行调用
     * 注意:该事件可能会多次调用
     */
    protected onAdded() {
        console.error("UI Has Add To Canvas==")
    }
/** 
     * 构造UI文件成功后,onStart之后 
     * 对于UI的根节点的添加操作,进行调用
     * 注意:该事件可能会多次调用
     */
    protected onAdded() {
        console.error("UI Has Add To Canvas==")
    }

onRemoved(): void

每次 UI 对象中动态移除组件后都会调用此函数,目前只能调用 ui 的 destroyObject 达到 remove 的效果

示例:

ts
/** 
     * 构造UI文件成功后,onAdded之后
     * 对于UI的根节点的移除操作,进行调用
     * 注意:该事件可能会多次调用
     */
    protected onRemoved() {
        console.error("UI Has Remove From Canvas==")
    }
/** 
     * 构造UI文件成功后,onAdded之后
     * 对于UI的根节点的移除操作,进行调用
     * 注意:该事件可能会多次调用
     */
    protected onRemoved() {
        console.error("UI Has Remove From Canvas==")
    }

图中执行顺序为 onAwake-创建 UI -> onAdded-添加 UI 到 canvas -> onRemoved-执行 UI 的 destroyObject()

onShow(...params: any[]): void

当 UI 通过 UIService.instance 创建和展示的时候 会先调用 onAdd() 再调用 onShow

示例:

ts
/**
     * 设置显示时触发,手动设置显示或者UIService调用show时触发
     */
    protected onShow(): void {
        console.error("UI Has OnShow==")
    }
/**
     * 设置显示时触发,手动设置显示或者UIService调用show时触发
     */
    protected onShow(): void {
        console.error("UI Has OnShow==")
    }

onHide(...params: any[]): void

当 UI 通过 UI.UIManger.instance 创建和隐藏的时候 会调用 onHide

示例:

ts
/**
     * 设置显示时触发,手动设置显示或者UIService调用show时触发
     */
    protected onHide(): void {
        console.error("UI Has OnHide==")
    }
/**
     * 设置显示时触发,手动设置显示或者UIService调用show时触发
     */
    protected onHide(): void {
        console.error("UI Has OnHide==")
    }

下图调用顺序为 UIService.instance 内函数方法: onAwake-创建 UI -> OnShow-使用 showUI 函数 ->OnHide-使用 hideUI 函数 >OnShow-使用 showUI 函数

输入事件

onTouchStarted(InGemotry: Geometry, InPointerEvent: PointerEvent): EventReply

当 UI 界面被设置为 visible 时可以接收点击 UI 界面的 touch 事件

示例:

ts
/**
     * 当这个UI界面是可以接收事件的时候
     * 手指或者鼠标触发一次Touch时触发
     * 返回事件是否处理了
     * **如果处理了,那么这个UI界面可以接收这次Touch后续的Move和End事件**
     *** 如果没有处理,那么这个UI界面就无法接收这次Touch后续的Move和End事件**
     */
    protected onTouchStarted(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onTouchStarted===")
        return EventReply.handled; //EventReply.unHandled
    }
/**
     * 当这个UI界面是可以接收事件的时候
     * 手指或者鼠标触发一次Touch时触发
     * 返回事件是否处理了
     * **如果处理了,那么这个UI界面可以接收这次Touch后续的Move和End事件**
     *** 如果没有处理,那么这个UI界面就无法接收这次Touch后续的Move和End事件**
     */
    protected onTouchStarted(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onTouchStarted===")
        return EventReply.handled; //EventReply.unHandled
    }

onTouchMoved(InGemotry: Geometry, InPointerEvent: PointerEvent): EventReply

当 UI 界面被设置为 visible 时在 UI 界面滑动会执行此事件

示例:

ts
/**
     * 手指或者鼠标在UI界面上移动时
     */
    protected onTouchMoved(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onTouchMoved===,"+InPointerEvent.getScreenSpacePosition())
        return EventReply.handled
    }
/**
     * 手指或者鼠标在UI界面上移动时
     */
    protected onTouchMoved(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onTouchMoved===,"+InPointerEvent.getScreenSpacePosition())
        return EventReply.handled
    }

onTouchEnded(InGemotry: Geometry, InPointerEvent: PointerEvent): EventReply

当 UI 界面被设置为 visible 时抬起手指时会触发 end 函数

示例:

ts
/**
     * 手指或者鼠标离开UI界面时
     */
    protected onTouchEnded(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onTouchEnded===")
        return EventReply.handled; //EventReply.unHandled
    }
/**
     * 手指或者鼠标离开UI界面时
     */
    protected onTouchEnded(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onTouchEnded===")
        return EventReply.handled; //EventReply.unHandled
    }

下图调用顺序为 : onTouchStarted-手指或鼠标按下 -> onTouchMoved-手指或鼠标滑动 ->onTouchEnded-手指或鼠标释放

onMouseEnter(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply

当鼠标进入此 UI 范围内时会触发此函数

示例:

ts
/**
     * 当鼠标进入此UI范围内时会触发此函数
     */
    protected onMouseEnter(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onMouseEnter===")
        return EventReply.handled; //EventReply.unhandled
    }
/**
     * 当鼠标进入此UI范围内时会触发此函数
     */
    protected onMouseEnter(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onMouseEnter===")
        return EventReply.handled; //EventReply.unhandled
    }

onMouseLeave(InPointerEvent:PointerEvent) :EventReply

当鼠标离开此 UI 的范围时会触发此函数

示例:

ts
/**
     * 当鼠标离开此UI 的范围时会触发此函数
     */
    protected onMouseLeave(InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onMouseLeave===")
        return EventReply.handled; //EventReply.unhandled
    }
/**
     * 当鼠标离开此UI 的范围时会触发此函数
     */
    protected onMouseLeave(InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onMouseLeave===")
        return EventReply.handled; //EventReply.unhandled
    }

onMouseWheel(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply

在此 UI 上面滑动鼠标滚轮会执行此函数

示例:

ts
/**
     * 在此UI上面滑动鼠标滚轮会执行此函数
     */    
    protected onMouseWheel(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onMouseWheel===")
        return EventReply.handled; //EventReply.unhandled
    }
/**
     * 在此UI上面滑动鼠标滚轮会执行此函数
     */    
    protected onMouseWheel(InGemotry :Geometry,InPointerEvent:PointerEvent) :EventReply{
        console.error("UI Has onMouseWheel===")
        return EventReply.handled; //EventReply.unhandled
    }

下图调用顺序为 : onMouseEnter-鼠标进入此 UI 范围内 -> onMouseWheel-滑动鼠标滚轮 ->onMouseLeave-鼠标离开此 UI 范围内