cocosCreator 之 Button

版本: 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JDK9 接口特性(heima)

JDK9 接口特性(heima) 将log方法私有化

three.js-解决外部模型太暗的问题

先看效果 优化前 优化后的效果 在网上找了好久,好多方法都过时了,还有调整自发光都不行,后来又调金属度的,试了下很ok, child.material.metalness 0.58;,完整例子看下边。 解决方案 调整模型的金属度 loader.lo…

web前端tips:js继承——原型链继承

原型链继承 原型链继承是 JavaScript 中实现继承的一种方式,它通过使用原型来实现对象之间的继承关系。 在 JavaScript 中,每个对象都有一个原型(prototype),它是一个指向另一个对象的引用。当我们访问一个对象的属性…

java项目之社区生活超市管理系统(ssm+mysql+jsp)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的社区生活超市管理系统。技术交流和部署相关看文章末尾! 开发环境: 后端: 开发语言:Java 框…

Redis高级篇(二)

Redis高级篇之多级缓存 什么是多级缓存 JVM进程缓存 Lua语法入门 实现多级缓存 缓存同步 一、什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题:…

TCP/UDP的首部

TCP/UDP首部信息 TCP首部第一个4字节第二个4字节与第三个4字节第四个4字节第五个4字节选项最大报文段长度(MSS)选项窗口扩大选项时间戳选项 什么时候发送RST包UDP首部 TCP首部 TCP 首部长度为20字节,加上选项部分最大可达60字节。 第一个4…

云原生|kubernetes|kubernetes集群部署神器kubekey安装部署高可用k8s集群(半离线形式)

前言: 云原生|kubernetes|kubernetes集群部署神器kubekey的初步使用(centos7下的kubekey使用)_晚风_END的博客-CSDN博客 前面利用kubekey部署了一个简单的非高可用,etcd单实例的kubernetes集群,经过研究,…

STM32MP157驱动开发——LED 驱动( GPIO 子系统)

文章目录 编写思路GPIO子系统的LED驱动程序(stm32mp157)如何找到引脚功能和配置信息在设备树中添加 Pinctrl 信息leddrv.cledtest.cMakefile编译测试 编写思路 阅读:STM32MP157驱动开发——GPIO 和 和 Pinctrl 子系统的概念可知利用GPIO子系统去编写LED驱动&#x…

【每日一题】—— B. Ternary String (Educational Codeforces Round 87 (Rated for Div. 2))

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

华为数通HCIP-OSPF基础

路由协议 作用:用于路由设备学习非直连路由; 动态路由协议:使路由设备自动学习到非直连路由; 分类: 按照算法分类: 1、距离矢量路由协议;(RIP、BGP) 只交互路由信息…

了解 3DS MAX 3D摄像机跟踪设置:第 4 部分

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 项目设置 步骤 1 打开“后效”。 打开后效果 步骤 2 转到合成>新合成以创建新合成。 将“宽度”和“高度”值分别设置为 1280 和 720。将帧速率设置为 25,将持续时间设置为 12 秒。单…

前端开发中的常见优化

目录 外观 兼容 不同尺寸(包裹,height:100%) 不同 浏览器 隐藏滚动条 的 不同属性名 重排->重绘 不显示 display:none->禁用disable 性能 导航重复(修改原型push、replace方法) 搜索防抖 import { debo…

LLM - Chinese-Llama-2-7b 初体验

目录 一.引言 二.模型下载 三.快速测试 四.训练数据 五.总结 一.引言 自打 LLama-2 发布后就一直在等大佬们发布 LLama-2 的适配中文版,也是这几天蹲到了一版由 LinkSoul 发布的 Chinese-Llama-2-7b,其共发布了一个常规版本和一个 4-bit 的量化版本…

Animator Animator Controller Avatar relationship

Animator 组件用于将动画分配给场景中的游戏对象。Animator 需要对Animator Controller 的引用,该控制器定义要使用的动画剪辑,并控制何时以及如何在它们之间混合和过渡。 如果 GameObject 是具有 Avatar 定义的人形角色,则 Avatar 也应在此组…

FlatBuffers 使用编译器

1、前言 可能刚接触的人会思考为啥要使用编译器: 一般跨平台、跨语言的都有一套固定的流程,大致可分为: 撰写IDL文件 -> 使用对应语言的编译器,编译成对应的语言 -> 序列化 ->持久化 -> 反序列化 这里就对应着这个…

[ELK安装篇]:基于Docker虚拟容器化(主要LogStash)

文章目录 一:前置准备-(参考之前博客):1.1:准备Elasticsearch和Kibana环境:1.1.1:地址:https://blog.csdn.net/Abraxs/article/details/128517777 二:Docker安装LogStash(数据收集引擎&#xff…

Flutter系列(2):解决Flutter打包成APP无法访问网络资源

将flutter项目打包成Android后&#xff0c;发现无法访问网络图片&#xff0c;权限不足&#xff0c;没有授权网络权限&#xff0c;解决办法如下&#xff1a; 在android/app/src/main/AndroidManifest.xml中添加如下代码即可 <uses-permission android:name"android.perm…

3、基于Zookeeper实现分布式锁

目录 3.1、Zookeeper安装和相关概念3.1.1 安装启动3.1.2 相关概念3.1.3 Java客户端 3.2 Zookeeper实现分布式锁的思路分析3.3 ZooKeeper分布式锁的基本实现 3.1、Zookeeper安装和相关概念 3.1.1 安装启动 # 解压到/mysoft文件夹下 tar -zxvf zookeeper-3.7.0-bin.tar.gz # 重…

剑指offer61.扑克牌中的顺子

我的想法非常简单&#xff0c;就是先给数组排序&#xff0c;然后统计里面有几个0&#xff0c;然后遍历数组&#xff0c;如果是0或者比后面一个数小1就直接进入下一次循环&#xff0c;如果比后面一个数小2&#xff0c;就用掉一个0&#xff0c;0的数量减1&#xff0c;如果比后面的…

MySQL基础(二)SQL语句

目录 前言 一、SQL语句类型 二、数据库操作 查看 创建 进入 删除 更改 三、数据表操作 &#xff08;一&#xff09;、数据类型 1.数值类型 2.时间\日期类型 3.字符串类型 4.二进制类型 &#xff08;二&#xff09;、查看 1.查看表内的数据 2.查看表格的属性 &…