[ 编写插件,通过 callSceneScript 改变自定义数据类数据无法正常显示? ]

手动操作,正常效果


使用命令


因为需要导入多条数据,使其在监视面板上可再编辑,不可能一个个去点,

  • 请问有什么办法可用解决嘛?是不是真正控制监视器上的数组显示其实不是 length ?

  • 另外问下有没有获取 编辑器 当前 选中节点的 UUID 或者 路径 的 API 有嘛?


//package.json

{
  "name": "0718",
  "version": "0.0.1",
  "scene-script": "scene-walker.js",
  "main": "main.js",
  "main-menu": {
    "i18n:MAIN_MENU.package.title/0718/change_ar": {
      "message": "0718:open"
    }
  }

}

//main.js

'use strict';

module.exports = {
  load () {
    // execute when package loaded
  },

  unload () {
    // execute when package unloaded
  },

  // register your ipc messages here
  messages: {
    'open' () {
      // open entry panel registered in package.json
      Editor.Scene.callSceneScript('0718', 'import-label-string', function (err) {
        console.log("change");
      });
    }
    
  },
};

//scene-walker.js

module.exports = {
    'import-label-string': function (event,id,str) {

        cc.find('Canvas').getComponent("HelloWorld").ar.length= 2
        cc.find('Canvas').getComponent("HelloWorld").a.length= 2
        if (event.reply) {
            //event.reply(null,str);
        }
    }
};
//HelloWorld.js

var player = cc.Enum({
    player1: 1,
    player2: 2,
});

var Item = cc.Class({
    name: 'Item',
    properties: {
        SpeakerName:{
            default: 1,
            type: player
        },
        words: ""
    }
});

cc.Class({
    extends: cc.Component,

    properties: {
        ar:{
            default: [],
            type: Item
    },
        a:{
            default: [],
            type: cc.Node
    }
    },

});

测试demo↓
0718.rar (216.5 KB)

creator 版本:1.5.2

设置完 length 之后,你要给里面的元素赋值啊?否则都是空的当然显示不了

var uuid = Editor.Selection.curActivate(‘node’);
var node = cc.engine.getInstanceById(uuid);
var path = _Scene.NodeUtils.getNodePath(node);

感谢回复。


我尝试用:

//scene-walker.js

        function newitem(){  
        var item = new Object();  
            item.SpeakerName=1;  
            item.words="str";  
        return item;  
        }; 

        var one = newitem()
        var ar=new Array()
        ar[0]=one

        cc.log(ar[0].SpeakerName)  // 输出1
        cc.log(ar[0].words)       // 输出str
        
        cc.find('Canvas').getComponent("HelloWorld").ar=ar             //不报错,监视器显示错误
        //cc.find('Canvas').getComponent("HelloWorld").ar.length= 1    //不报错,监视器显示错误
        //cc.find('Canvas').getComponent("HelloWorld").ar[0]=ar[0]     //不报错,监视器显示错误

        cc.log(cc.find('Canvas').getComponent("HelloWorld").ar[0].SpeakerName)  // 输出1
        cc.log(cc.find('Canvas').getComponent("HelloWorld").ar[0].words)       // 输出str

        cc.find('Canvas').getComponent("HelloWorld").a.length= 2

我发现场景里的值是确实有改变的,只是监视器无法正常识别出来?

如果直接使用:

        cc.find('Canvas').getComponent("HelloWorld").ar[0].SpeakerName=ar[0].SpeakerName;
        cc.find('Canvas').getComponent("HelloWorld").ar[0].words=ar[0].words
报错TypeError: Cannot set property 'SpeakerName' of undefined

数组里的元素类型错了,one 必须是 Item 类型的

1赞

最终解决方案:

新建一个 define_Item.js:

//define_Item.js

var player = cc.Enum({
    player1: 1,
    player2: 2,
});


var Item = cc.Class({
    name: 'Item',
    properties: {
        SpeakerName:{
            default: 1,
            type: player
        },
        words: ""
    }
});

module.exports = Item

HelloWorld.js 修改如下:

//HelloWorld.js

var Item = require("define_Item");

cc.Class({
    extends: cc.Component,

    properties: {
        ar:{
            default: [],
            type: Item
    },
        a:{
            default: [],
            type: cc.Node
    }
    },

});

scene-walker.js 修改如下:

//scene-walker.js

module.exports = {
    'import-label-string': function (event,id,str) {
        var Item = window.require("define_Item");
 
        cc.find('Canvas').getComponent("HelloWorld").ar.length= 6
        for (var i=0;i<cc.find('Canvas').getComponent("HelloWorld").ar.length;i++)
        {
            cc.find('Canvas').getComponent("HelloWorld").ar[i]= new Item();
        }

    }
};


监视器即可正常显示自定义数据。

为啥这么重要的api都不暴露出来,害我找了半天

1赞