CocosCreator的ToggleGroup组件使用

用了CocosCreator也有一段时间,对ToggleGroup始终没有仔细的学习过,只停留在用过的水平。所以因为认识有限,所以以为ToggleGroup对自定义支持得没那么好,这两天因为项目,再学习了一下,发现ToggleGroup的toggleItems属性有着很大的作用。

ToggleGroup的toggle事件对checkmark作的仅仅是隐藏和显示,而对background节点着没有作用,如果有一天,我们想要点击的时候checkmark显示,而background隐藏的话,就可以用到toggleItems。

这里还有一个提示:当给toggleGroup动态增加toggle的时候,toggle组件的toggleGroup属性是ToggleGroup组件,而不是挂着ToggleGroup组件的节点

代码为:

var node = cc.instantiate(this.prefab);
node.getComponent(cc.Toggle).toggleGroup = this.getComponent(cc.ToggleGroup);
node.parent = this.node;

当然如果,想要获取toggleGroup的toggle节点,也可以用getChildByName或者类似的api来获取,但是这种方法并不全面,因为虽然toggle节点基本上都是toggleGroup的子节点,但是总有例外,程序员不应该有这样不严谨的逻辑。

而我个人对getChildByName这样的api有点恐惧,因为这样意味着会被束缚,这样一来节点和子节点的关系会被束缚,子节点的名字会被束缚,而且代码可读性很差。

下面就写一个点击toggle的时候显示checkmark隐藏background的实例。

代码很简单,而且写一遍后,还可以用在其他toggle上面,复用性很好。

cc.Class({
    extends: cc.Component,

    properties: {
        // foo: {
        //    default: null,      // The default value will be used only when the component attaching
        //                           to a node for the first time
        //    url: cc.Texture2D,  // optional, default is typeof default
        //    serializable: true, // optional, default is true
        //    visible: true,      // optional, default is true
        //    displayName: 'Foo', // optional
        //    readonly: false,    // optional, default is false
        // },
        // ...
    },

    // use this for initialization
    onLoad: function () {
        this.node.on("toggle", this.onToggleChangeSpriteFrame, this);
    },

    onToggleChangeSpriteFrame : function() {
        var toggle = this.getComponent(cc.Toggle);
        var items = toggle.toggleGroup.toggleItems;
        for(var i = 0; i < items.length; i++) {
            items[i].target.active = true;
        }
        toggle.target.active = !toggle.isChecked;
    },

    // called every frame, uncomment this function to activate update callback
    // update: function (dt) {

    // },
});


<think>我们正在讨论Unity中的Toggle Group组件。根据引用内容,Toggle Group用于管理一组Toggle组件,确保在同一时间只有一个Toggle被选中(类似于单选按钮组)。 使用步骤: 1. 创建一个父物体(例如空物体),并为其添加Toggle Group组件。 2. 在父物体下创建多个子物体,每个子物体添加Toggle组件。 3. 将每个子物体上的Toggle组件的Group属性设置为父物体上的Toggle Group组件(通过拖拽父物体到Group属性框)。 4. 根据需要设置Toggle Group组件的属性,例如是否允许所有Toggle都不被选中(Allow Switch Off)。 注意:根据引用[4],如果Allow Switch Off为false,而初始时所有Toggle的isOn都为false,那么程序运行时需要手动设置一个Toggle为true,但要注意事件触发的时机。 下面是一个简单的步骤说明:</think>### 如何使用 Toggle Group 组件 在 Unity 中,Toggle Group 组件用于管理一组 Toggle 组件(开关按钮),实现单选按钮组的功能。以下是详细使用步骤: #### 基础配置步骤 1. **创建父物体** 在 Hierarchy 中创建空 GameObject(如命名为 `ToggleGroup`),并为其添加 **Toggle Group 组件**: ```csharp // 通过代码添加(可选) gameObject.AddComponent<ToggleGroup>(); ``` 2. **创建子 Toggle** 在父物体下创建多个 UI > Toggle 子物体(如 `Toggle1`, `Toggle2`)。 3. **绑定 Group** 选中每个子 Toggle,在 Inspector 面板中找到 **Group 属性**,将父物体拖拽到该属性框: ![Toggle Group 绑定示意](https://docs.unity3d.com/uploads/Main/UI_ToggleGroup.png) [^3] 4. **关键属性设置** - **Allow Switch Off**(父物体上): - ✅ 允许所有 Toggle 取消选中 - ❌ 必须至少有一个 Toggle 被选中(默认) #### 代码控制示例 ```csharp // 获取 Toggle Group 组件 ToggleGroup group = GetComponent<ToggleGroup>(); // 获取当前选中的 Toggle Toggle activeToggle = group.ActiveToggle(); // 设置第一个 Toggle 为选中状态 transform.GetChild(0).GetComponent<Toggle>().isOn = true; // 注册值变化监听 activeToggle.onValueChanged.AddListener((isOn) => { if(isOn) Debug.Log("选中了: " + activeToggle.name); }); ``` #### 注意事项 1. **事件触发规则** - 当 `Allow Switch Off=false` 时,如果初始所有 Toggle 的 `isOn=false`,需在代码中设置默认选中项,否则首次切换不会触发事件 [^4]: ```csharp void Start() { if(!group.AnyTogglesOn()) transform.GetChild(0).GetComponent<Toggle>().isOn = true; } ``` 2. **动态添加 Toggle** ```csharp Toggle newToggle = Instantiate(togglePrefab, transform); newToggle.group = group; // 关键绑定 ``` 3. **自定义扩展** 通过 `group.ToggleItems` 属性可遍历所有 Toggle,实现复杂逻辑(如动态生成选项)[^5]。 > **最佳实践**:在选项卡切换、难度选择、角色属性选择等需要单选功能的场景使用 Toggle Group [^1][^3]。 --- ### 相关问题 1. Toggle Group 的 `Allow Switch Off` 属性具体会产生哪些影响? 2. 如何实现 Toggle Group 与数据系统的动态绑定? 3. 当 Toggle Group 的子物体非直接嵌套时如何处理? 4. 在 Toggle Group 中如何实现多级联动选择? 5. Toggle Group 与 Radio Button Group 的区别是什么? [^1]: 通过 Group 属性实现父子物体绑定,形成单选逻辑 [^2]: Toggle Group 组件提供单选容器功能 [^3]: 拖拽绑定是 Toggle 加入组的关键操作 [^4]: 初始状态需注意事件触发条件 [^5]: ToggleItems 属性支持高级自定义需求
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值