cocosCreator 之 Button

news2024/11/18 2:22:20

版本: 3.4.0

参考:Button组件


简介

Button组件主要用于响应用户的点击操作,属性检查器中的示意图:

请添加图片描述

Button组件的主要属性有:

  • Interactable 表示按钮是否可交互,如果未勾选表示禁用
  • Transition表示按钮状态变化的类型,支持图片,缩放,颜色的变化
  • ClickEvents 表示按钮的点击事件回调相关,默认为空

Button组件上的Sprite组件有个属性叫做Grayscale可将按钮图片置灰,如果按钮不包含子节点相关,在脚本中使用:

onLoad() {
  // 获取节点下的Sprite组件,将其设置置灰
  this.node.getComponent(Sprite).grayscale = false;
  // 获取节点下的Button组件,将其设置为禁用
  this.node.getComponent(Button).interactable = false;
}

如果按钮节点包含不同类型的子节点相关,该置灰效果就会有问题。


基本使用

在脚本中使用按钮组件,一般通过**@property(Button)** 来获取按钮组件,它的常用情况有:

import { _decorator, Button, Component, Label, Node, Vec3 } from 'cc';
const { ccclass, executeInEditMode, property } = _decorator;
 
@ccclass('UI_DemoLayer')
@executeInEditMode(true)
export class UI_DemoLayer extends Component {
  @property(Button)
  btn: Button = null;

  protected onLoad(): void {
    // 设置按钮的交互
    this.btn.interactable = true;
    // 设置按钮的标题,先获取按钮的子节点,然后获取子节点下的文本组件
    let titleNode = this.btn.node.getChildByName("Label");
    titleNode.getComponent(Label).string = "按钮";
  } 

  protected onEnable(): void {
    // 点击事件回调
    this.btn.node.on(Button.EventType.CLICK, this.clickEvent, this);
  }

  protected onDisable(): void {
    this.btn.node.off(Button.EventType.CLICK, this.clickEvent, this);
  }

  // 参数返回的是button的node属性相关
  private clickEvent(button:Button) {
    console.log(button);
  }
}

针对于点击事件注册相关建议放到onEnableonDisable中。

点击事件的处理也可以在编译器的ClickEvents中添加,可设置为1,然后设置:

  • Target 带脚本组件的节点
  • Component 脚本组件名称
  • Handler 脚本组件的回调方法,该方法必须为public
  • customEventData 自定义字符串相关

请添加图片描述

export class UI_DemoLayer extends Component {
  // 返回的是eventTouch对象和自定义数据
  public ClickCloseEvent(event:any, customData: string) {
    console.log(event)
    console.log(customData)
  }
}

点击音效

按钮的点击需要支持播放音效, 这个主要来通过AudioSource组件的方法playOneShot来实现。

对于音乐音效的播放,一般会封装一个管理类来使用,可参考cocosCreator笔记 之背景音乐

在此不一一罗列,关于点击音效的实现:

export class audioManager {
  // 播放音效(音效名字,指定音量倍数)
  public playSound(name: string, volumeScale: number = 1) {
    resources.load("prefab/sound/" + name, AudioClip, (err, clip) =>{
      if(err) {
        warn("load audioClip failed:" + err);
        return;
      }
      // 音量的大小限制在[0,1]之间
      let volume = clamp01(this._musicVolme * volumeScale);
      this._audioSource.playOneShot(clip, volume);
    });
  }
}

在指定按钮点击事件中,可以调用音效的播放

import { audioManager } from '../manager/audioManager';

export class Adapter_Btn extends Component {
  public ClickCloseEvent(event:any, customData: string) {
		audioManager.instance.playSound("click");
  }
}

拓展

在项目中使用按钮,更多的时候我们希望按钮支持是否禁止快速点击,是否置灰,是否播放特定的音效名。我们可以创建一个按钮适配器的组件来帮助我们实现这些。

如下代码参考于cocosCreator编译器内的项目案例:快上车

import { _decorator, Button, Color, Component, Sprite } from 'cc';
const { ccclass, property, requireComponent } = _decorator;
import { audioManager } from '../manager/audioManager';

@ccclass('Adapter_Btn')
// 指定当前组件依赖的组件,默认为null; 
// 如果当前依赖的组件不存在,引擎会自动将依赖组件添加到同一个节点上,防止脚本出错
@requireComponent(Button)
export class Adapter_Btn extends Component {
    @property({tooltip: "是否播放点击音效"})
    isPlaySound = true;
    @property({tooltip: "音效名"})
    soundName = "click";
    @property({tooltip: "是否禁止快速点击"})
    isForbidQuickClick = true;
    @property({tooltip: "快速点击后,按钮是否置灰,按钮节点需要包含Sprite组件"})
    isNeedGray = true;
    @property({tooltip: "快速点击间隔秒数"})
    onceTime = 0.5;

    private _button: Button = null;             // 按钮组件
    
    protected onLoad(): void {
        this._button = this.node.getComponent(Button);
    }

    protected onEnable(): void {
        this.node.on(Button.EventType.CLICK, this._clickBtnEvent, this);
    }

    protected onDisable(): void {
        this.node.off(Button.EventType.CLICK, this._clickBtnEvent, this);
    }

    private _clickBtnEvent() {
        // 检测是否快速点击
        if (this.isForbidQuickClick) {
            this._button.interactable = false;
          	// 如果是快速点击,设置间隔时间
            this.scheduleOnce(() => {
                if (this._button.node) {
                    this._button.interactable = true;
                }
            }, this.onceTime);
        }

        // 音效相关
        if (this.isPlaySound && (this.soundName.length > 0)) {
            audioManager.instance.playSound(this.soundName);
        }
    }
}

该脚本组件挂载到对应的Button组件下即可,需要注意的是:该组件不会影响到其他脚本组件的按钮点击事件相关,相当于各司其职,互不干涉。


End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/789098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EAP设备自动化控制系统在设备数采和控制方面的优势

随着科技的不断进步和工业自动化的发展,EAP(Equipment Automation Program)设备自动化控制系统在各个行业中扮演着越来越重要的角色。作为连接MES(Manufacturing Execution System)和设备层的沟通桥梁,EAP系…

周训龙老兵参观广西森林安全紧急救援装备演练

7月21日上午,周训龙老兵参观广西紧急救援促进中心在南宁市青秀山举行森林安全紧急救援装备演练,多功能水罐消防车、无人救援机等先进设备轮番上阵,展示了广西应对突发事件的紧急救援速度和水平。广西壮族自治区应急厅不情愿参此次演练活动。 …

平板用的触控笔什么牌子好?ipad第三方电容笔推荐

随着技术的发展,出现了各种各样的平板电容笔。一支好的电容笔,不但可以极大地提升我们的工作效率,还可以极大地提升我们的学习效果。平替的电容笔,无论是在技术方面,还是在质量方面,都还有很大的提升空间&a…

Visio文件编辑查看工具Visio Viewer for Mac

Visio Viewer for Mac可以打开和查看Visio文件(.vsd、.vdx和.vsdm文件)。它具有简单易用的用户界面,可以快速加载和显示Visio文件。此外,它还支持导出文件为PDF、PNG、JPEG等格式,方便用户进行文件转换和共享。 Visio…

spring初识

一、如何快速创建一个spring项目? 1. 首先在网页https://start.spring.io/中进行项目配置 2. 将下载下来的安装包进行解压,并在IDEA中打开项目。 3. 在application.propertie文件中进行数据库连接的相关配置 spring.datasource.urljdbc:mysql://127.0.0…

【ICCV2023】 MRN:一种多路复用路由网络的增量多语言文本识别方法

一句话总结 这项工作作为文本识别领域在增量学习设定下的第一次尝试。我们提出了增量多语言文本识别任务,以及该场景独有的挑战:回放不平衡问题,实验结果和可视化表明模型成功解决了这一问题。 相关资源 论文链接: arxiv.org/a…

掌握Python的X篇_8_数字与字符串之间的转换(字符串转数字int;数字转字符串str)

本篇将会介绍如何使用Python中的内置函数将数字型变量与字符串变量进行相互转换。 文章目录 1. 字符串转数字2. 数字转字符串 在上篇中写如下代码会报错 In [12]: num1input("请输入num1") 请输入num1345 In [13]: print(num1*10) 345345345345345345345345345345In…

TOOD Task-aligned One-stage Object Detection 论文学习

1. 解决了什么问题? 目标检测通过多任务学习的方式,协同优化目标的分类和定位。分类任务会学习目标的判别特征,关注于目标的显著性或关键区域,而定位任务则学习准确地定位目标的边界。因为定位和分类的学习机制不同,这…

Java调用ChatGPT(基于SpringBoot和Vue)实现连续对话、流式输出和自定义baseUrl

目录 版本更新说明1. 配置阶段1.1 依赖引入1.2 配置application.yml文件1.3 注解添加 2. 使用2.1 生成回答2.1.1 测试 2.2 生成图片2.2.1 测试 2.3 下载图片2.3.1 测试 2.4 生成流式回答2.4.1 流式回答输出到IDEA控制台2.4.2 流式回答输出到浏览器页面2.4.3 流式回答结合Vue输出…

Python TypeError: unsupported operand type(s) for +: ‘int‘ and ‘str‘

在键入数值进行相加运算时,报了这样一个错误 类型错误:不支持操作类型为整数和字符串 错误分析:sumsuminput() 未被系统识别,导致程序错误 解决方法:给键入的数值定义,声明为整数 sumsumint(input()) 即…

开源大模型LLaMA 2会扮演类似Android的角色么?

在AI大模型没有商业模式?等文章中,我多次表达过这样一个观点:不要把大模型的未来应用方式比喻成公有云,大模型最终会是云端操作系统的核心(新通用计算平台),而它的落地形式会很像过去的沃森&…

消息队列(一)-- RabbitMQ入门(3)

延迟队列 延迟队列是用来存放需要在指定时间被处理的元素的队列。队列内部是有序的&#xff0c;最重要的特性就体现在它的延时属性上。 使用场景&#xff1a;订单在十分钟之内未支付则自动取消。 整合SpringBoot 新建一个SpringBoot的Module 添加依赖 <!--RabbitMQ依赖-…

Kafka集群——(区别于Master/Slave架构的的分布式集群)

Kafka角色介绍&#xff1a; 1. Producer:消息生产者&#xff1a; 2. Broker: kafka实例&#xff0c;可以理解为一台kafka服务器&#xff0c;kafka cluster 是由多个broker构成的集群。 3. Topic: 消息主题&#xff0c;理解为消息队列&#xff0c;kafka数据就保存在topic里。…

vue+Element-ui实现树形组件、表格树

需求 要做出如下图所示的 树形表格&#xff0c;也就是数据之间有父子类关系的这种&#xff0c;可以点击展开、收缩 像上图这样的表格树 实现 1.使用树形组件 在学习树形表格之前&#xff0c;肯定得先搞懂普通的树形组件是怎么搞的&#xff0c;然后将其套到表格中就好了&…

基于JavaSE的手机库存管理系统

1、项目背景 基于JavaSE完成如下需求&#xff1a; 功能需求&#xff1a; 1、查询库存量 2、可以修改库存中不同品牌手机的个数 3、退出系统 实现步骤&#xff1a; 1、把List当做库房 2、把手机存放在库房中 3、使用封装的方法区操作仓库中的手机 2、项目知识点 面向对象 集合…

存储过程——case函数、while函数、repeat函数的应用、loop函数

1.case循环 存储过程中&#xff0c;几种循环格式的语法讲解。 create procedure p6(in month int) begindeclare result varchar(10);casewhen month > 1 and month < 3 thenset result : 第一季度;when month > 4 and month < 6 thenset result : 第二季度;whe…

spring cloud sentinel

初始时 并不能将sentinel实例显示出来的 需要修改加配置clent-ip spring:cloud:sentinel:transport:#本机ipclient-ip: 192.168.10.108#dashboard服务端的grp端口 监听心跳的port: 8719#dashboard服务端地址dashboard: 192.168.12.14:8080

数据结构【栈和队列】

第三章 栈与队列 一、栈 1.定义&#xff1a;只允许一端进行插入和删除的线性表&#xff0c;结构与手枪的弹夹差不多&#xff0c;可以作为实现递归函数&#xff08;调用和返回都是后进先出&#xff09;调用的一种数据结构&#xff1b; 栈顶&#xff1a;允许插入删除的那端&…

了解Unity编辑器之组件篇Physics(四)

Physics&#xff1a;用于处理物理仿真和碰撞检测。它提供了一组功能强大的工具和算法&#xff0c;用于模拟真实世界中的物理行为&#xff0c;使游戏或应用程序更加真实和可信。 主要用途包括&#xff1a; 碰撞检测&#xff1a;Unity Physics 提供了高效的碰撞检测算法&#x…

【Unity实战篇 】| 游戏中实现镂空遮罩效果【矩形、圆形镂空遮罩】

前言【Unity实战篇 】 | 游戏中实现镂空遮罩效果【矩形、圆形镂空遮罩】一、制作原理二、矩形中间镂空遮罩效果2.1 实现镂空显示2.2 镂空区域内事件穿透三、圆形中间镂空遮罩效果总结前言 本文来写一下怎样在Unity中完成一个 镂空遮罩 的效果。镂空遮罩 比较常用的有两种:矩形…