最优雅得获取脚本组件 ( ̄_, ̄ )

突然想起来以前论坛有这么个帖子
其实只要在添加脚本组件的时候,把脚本对象的地址存在节点属性里
属性名字可以随便取,例如:handle
node[‘handle’] = node.addComponent(XXX);
从此以后,不论何时何地,node[‘handle’]就可以取到node的脚本组件。
是不是很优雅啊哈哈哈
文艺青年也可以封装成全局函数,增加报错提醒
image
至于怎么弄成全局函数,可以参照我之前发的帖子
【包教包会】CocosCreator怎么用namespace实现类似于cc的全局变量

其实直接通过对象查找组件名字或类型就是最优雅和高效的写法,你这样弄不光增加了内存占用还把一个局部问题变成了全局问题增加了耦合度,参考某知名引擎的做法

你都知道脚本类型的话,直接getComponent(脚本类型)就好了啊。
这么做的意义是,在不知道脚本类型的情况下,也能从node取到脚本组件。

其实像U3D那样直接通过组件名字或类型查找就是最优雅和高效的写法,

你没明白我意思,我现在讨论的是在不知道组件名称或类型的前提下,获取node的脚本组件
这种情况很常见

不认同,你这个是不好的思维,因为耗内存。而且官方的方式也没有多多少麻烦。
其实我这边是通过脚本找到节点,而不是通过节点找到脚本,改一改思维,立马见到新世界

1赞

比如获取属于一个类型的多个动画控制脚本中的一个?

一个节点如果有多个脚本?

不好,你这个代码返回的还是个ANY类型,很不方便。
我一般都是和一个寻找节点的方法合在一起用,找到节点的同时还能找组件。

:expressionless:使用时才去找. 找到就缓存.且并不暴露到全局 是我的做法

统一回复:
1、首先,这个方法只用来找你自己的脚本组件,例如Hero,Enemy,而不会用来找cc.Sprite,cc.Animation这样的引擎组件
2、为什么不用getComponent来找脚本组件?
因为有时候你不知道你要取的脚本组件具体是什么,因此getComponent的参数你根本没法填,才会需要用这种方法来取

我来回复一下你的第二点,在大多数情况下我都会知道自己想要获取的脚本组件具体是什么,叫什么,因为我的脚本一般跟节点名称相同或者相差不大,很少会出现不知道这个节点下绑定的脚本名称是什么,包括我的项目大也一样的做法,所以看怎么去命名节点和脚本名。
但其实更多时候通过节点来获取脚本是一种愚蠢的做法,所以官方文档只是给出一般做法,但是我们应该聪明点,通过导入脚本不是更加方便吗?具体的实现方式每个人不同,但是起码不用为了找到一个脚本而去find(“xxxx”).getComponet(“ScriptName”)这样多痛苦?你不觉得痛苦吗?

导入脚本具体说下怎么做

看来真的全论坛可能只有我这么做,实现的方式其实有很多种,但我一时半会没法描述清楚,改天改天哈。。。

对于获取脚本上的组件,我觉得也是有那么点头疼,按照官方的写法可能会写得长一些。
这位兄台的初衷应该是想让这个更方便吧,可能每个人想法不同,所以觉得便利程度方面大家都觉得不同。在这里这样设置应该是想获取默认脚本对吧(通常一个节点只挂一个自定义脚本,挂多个的不多)。

获取到脚本就要调用方法或者获取属性,到了这一步那当然说明你是知道这个是什么脚本。
比如Hero.attack() Enermy.hp
所以可以直接以脚本名来命名啊,就不用handle了。
例:
this.node[‘Hero’].attack();
this.node[‘Enermy’].die();

我觉得大家喜好不同吧,我就喜欢把常用组件直接放在节点下面,比如sprite , label
一个场景通常都超不过百节点,多几个变量也多不了几个内存,多几KB?无所谓啊。
哈哈,我就是喜欢这样暴力的东西,我就不需要一个个在脚本前面声明变量,再从编辑器拖过去。
也不用这种 find(‘enermyRoot/enermy2/hpLabel’, this.node).getComponent(Label).string = ‘100’;

直接就
TS
this.node[‘enermyRoot’][‘enermy2’][‘hpLabel’].label.string = ‘100’;
this.node[‘enermyRoot’][`enermy${index}`][‘hpLabel’].label.string = ‘100’;

JS
this.node.enermyRoot.enermy2.hpLabel.label.string = ‘100’;
this.node.enermyRoot[`enermy${index}`].hpLabel.label.string = ‘100’;

每个人的方法都不同而已,选择自己喜欢的