属性面板里为什么没有tag值选项呢?

属性面板里没有填写tag值或者name值的地方啊,比如一个容器里有100个节点,我想快速获取到指定的一个怎么获取呢?以前都是通过tag值来获取的。比如关卡节点按照顺序摆好,tag值也按照顺序设置,就可以很方便的控制关卡的开启了。

node.children[50]
直接下标查找

lobby_sky_sunny 不就是给你填写 name 的地方吗

自己多尝试下吧。lobby_sky_sunny,就是你自定义的名字,在代码中可以根据相应的方法根据这个名字获取这个对象。

嗯,那tag值还是没地方填写吧?tag值应该是node的属性,按说面板上也该有个地方填写。

目前没有地方填写,之后可能会改进

嗯,还是希望后面会加上吧,

tag值设置什么时候能加上呢?有些情况用name是不能替代tag的,尤其关卡游戏很常用

目前没有具体计划什么时候加上这个

好吧,看样大家都不需要tag值,明明是node的基础属性却没地方填写也挺奇怪的。

因为 tag 是一个本该用 component 模拟的东西,实际上我都不希望有这个属性。tag 纯粹就是 cocos2d 的历史遗留产物,说不定哪天就没了……

你可以用 component 来模拟 tag,我觉得这个才是正确的做法。
模拟方法非常多…… 比如你可以建一个 Tag 组件,里面就一个 string 属性。
甚至你的 tag 有多少种,你就建多少种 component,
然后把 if (node.tag === "monster") 改成 if (node.getComponent(Monster)) 即可
(而且这样每种 component 还能存放一些额外的 data)

比如100个节点代表100个关卡,如果有tag值就可以直接通过父类getChildByTag来决定当前到哪关了,如果是component请问怎么做?节点并没有能通过component来获取子节点啊?比如当前第10关,那我直接通过tag值把10关以内的节点都设成完成,10关之后的设置为未开启。如果用component那每次都得遍历一遍所有的子节点然后根据component的值来判断吧?

getChildByName

之前已经说了,getChildByName 前提是这100个节点命名都的一致才行,比如node1,node2… 这样才好处理,如果这100个节点类型不同,那命名要是一样就很奇怪了。

那只有这种了

getChildByTag 一样要调用 100 次,而且每次调用时都会从头遍历所有子节点来搜索,复杂度是 O(N!)
如果用 getComponent,一样要遍历所有子节点但是就只要遍历一次,复杂度大大降低,只有 O(N)

如果实在不想用 getComponent,我更推荐的是 getChildByName …… 我不明白节点类型和节点名有什么关联,节点名字完全就是可以随便叫的。

没有枪炮就需要自己造了,看我这个方案如何:

//注入魔力
uikiller.bindComponent(this);

//界面上的以“_”开头的节点任意访问
 for (let i = 0; i < 10; i++) {
    // `_box${i}` 返回的字符串为_box0~_box9 没有节点上的$
    let box = this[`_box${i}`];      
    //box.$在这里就是节点后面的数字(0~9)
    cc.log(box.$);  
    //bod.$Component 访问组件对象,下面是访问节点下的Sprite组件
    box.$Sprite.enabled = true; 
    //还可以直接访问box节点下的img节点
    box.img.active = false;
}
1赞

嗯,目前就是和你说的做法一样,之前走入误区了,getChildByTag其实也是遍历所有子节点,不过还是多谢啊!

目前版本已经去掉了,我这就想吐槽一下了,tag这东西cocos2dx里用了一辈子。现在cocos creator2.0干净利落直接去掉了,不知道你们怎么想的,一直用的东西说改就改。虽然说有替代方法,我觉得tag有保留的必要性。而且不是直接一刀切,你们应该多向unity学习学习,8年前api是这样子,8年后还是这样子

要学会看文档,首先文档中 Node 有一个方法 attr() 可以为对象配置属性

var attrs = { myTag: 0 }
node.attr(attrs)
console.log( node.myTag )
node.myTag = 100
console.log( node.myTag )

用户可以用这个方法自己想设置什么 Tag 都可以

1赞