开发技巧:批量添加组件&设置组件属性
2018-12-22 本文已影响0人
iqxtreme
应用情景
- 场景中有大量节点需要添加某种组件。
- 场景中有大量节点需要设置某种组件的属性。
- 将拖拽组件一个一个的手动附加到需要的节点上,再一个一个设置这些属性会非常繁琐。
应用举例
场景中有大量节点需要添加拖拽组件(geoDraggable),
拖拽组件
并且还要把这些拖拽组件的lockTarget、dragMoveEvents、dragEndEvents设置为相同的。
拖拽组件的属性
- 假设场景中已经有一个节点refinedNode,已经附加了拖拽组件,并且配置好了各项属性。
- 现在要为节点rawNode下的所有携带标记“drag=a”的子孙节点添加拖拽组件,并且将属性:lockTarget、dragMoveEvents、dragEndEvents,设置为与refinedNode相同。
- 在游戏开始处(或需要的时候),使用下列代码,就能完成组件的附加和配置,不用在编辑器中手动操作:
var Utils = require('geoUtils');
// 定义要获取的组件
var Draggable = require('geoDraggable');
// 或者直接用组件类名(文件名)
var Draggable = 'geoDraggable';
// 获得已配置好的组件
var refinedCom = refinedNode.getComponent(Draggable);
// 构建要复制的属性承载结构
var attrs = Utils.obj.getAttrs(refinedCom, ['lockTarget', 'dragMoveEvents', 'dragEndEvents']);
// 为rawNode的子孙附加拖拽组件并设置属性
Utils.node.setComponentAttrs(
rawNode, // 以该节点为起点执行操作
Draggable, // 目标是拖拽组件
attrs, // 要将拖拽组件的属性依据attrs进行设置
true, // 考虑(遍历)rawNode到子孙节点
'drag', // 只关注携带drag=a标记到节点
'a', // 只关注携带drag=a标记到节点
true // 若遍历到的节点没有Draggable组件就自动附加
);
方法详解
- 方法原型:
/**
* 设置一个节点(或包含其子孙节点)某类组件的指定属性值。
*/
setComponentAttrs(
node, // 被设置的节点
componentTypeOrName, // 目标组件类型或名称
attrs, // 要设置的组件属性名及值
includeHierarchy, // 是否考虑node子孙
markNameInHierarchy, //列为考虑对象的子孙的标记名
markValueInHierarchy, // 列为考虑对象的子孙的标记值
addIfNotExists, // 若组件不存在是否自动添加,
validateFunc // 验证是否对遍历到到节点实施操作
)
延展阅读
- 更方便的操作方式批量配置组件