通过组件挂载节点还是通过getChildByName获取节点哪个会好点?

经观察,
1.使用组件挂载节点,来获取节点
优点:节点方便,通过编辑器中修改节点名时,在脚本中定义的变量依然可用
缺点:会增加编译出来的json文件增大

2.通过getChildByName() API时
优点:编译出来的json文件大小不会很大(挂载多个节点)
缺点:麻烦,不优雅,当访问更深一点的子节点可能需要写很长一段代码或者直接find()API;如果在编辑器修改节点名,脚本中也要修改

不知道各位大佬用啥?还有没有其他的方法

看项目需求吧,对包体文件大小不在意的,用第一种肯定方便些。第二种嫌获取麻烦可以挂个脚本在onLoad的时候把node.name赋值到特定的一个类变量,然后其他组件在start里面使用类变量的值去获取节点,这样不管你改成啥样都不影响,但是麻烦的就是需要获取的地方都得添加这么个字段拖个脚本

我还是喜欢cc.find

好像你这种方法也挺好的,统一管理一个类啥的,总好过分散。

哈哈哈哈,我也有点喜欢用这个了,主要是真的比较方便

自己在基类写了一个类似find的方法

// 基类
/**
 * 获取子节点或组件
 */
protected $(name: string): cc.Node
protected $<T extends cc.Component>(name: string, type: { prototype: T }): T
protected $<T extends cc.Component>(name: string, type ?: { prototype: T }) {
    if (!this._$) {
        this._$ = utils.mark(this.node)
    }
    const item = this._$[name] || cc.find(name, this.node)
    if (item && type) {
        return item.getComponent(type)
    }
    return item
}

// mark
export function mark(node: cc.Node): any {
    const obj = {}
    for (const child of node.children) {
        if (!(child.name in obj)) {
            obj[child.name] = child
        }
        _mark(obj, child)
    }
    return obj
}
function _mark(obj: any, node: cc.Node) {
    for (const child of node.children) {
        if (!(child.name in obj)) {
            obj[child.name] = child
       }
        _mark(obj, child)
    }
}

不受node层级变化而改名 获取组件时代码长度更短

// 示例
this.$("nickname", cc.Lable).string = "name"

膜拜大佬!

哪里哪里 只是偷点懒罢了

缺点: 同名节点只能取第一个
建议: 此时可以使用cc.find来获取

大佬,没有看明白您的这个方法,能贴一小段示例代码吗 想学习