一个服务端开发者学creator碰到的官方例子“腾讯合作开发的 21 点游戏”中预制体挂的脚本初始化的问题。

例子中一个排行列表中用到了预制体:rankItem, 该预制体中用到了脚本:RankItem.js, 代码如下:

cc.Class({
extends: cc.Component,

properties: {
    spRankBG: cc.Sprite,
    labelRank: cc.Label,
    labelPlayerName: cc.Label,
    labelGold: cc.Label,
    spPlayerPhoto: cc.Sprite,
    texRankBG: cc.SpriteFrame,
    texPlayerPhoto: cc.SpriteFrame
    // ...
},

// use this for initialization
init: function (rank, playerInfo) {
    if (rank < 3) { // should display trophy
        this.labelRank.node.active = false;
        this.spRankBG.spriteFrame = this.texRankBG[rank];
    } else {
        this.labelRank.node.active = true;
        this.labelRank.string = (rank + 1).toString();
    }

    this.labelPlayerName.string = playerInfo.name;
    this.labelGold.string = playerInfo.gold.toString();
    this.spPlayerPhoto.spriteFrame = this.texPlayerPhoto[playerInfo.photoIdx];
},

// called every frame
update: function (dt) {

},

});

该脚本会在另一个脚本中初始化:

populateList: function() {
for (var i = 0; i < this.rankCount; ++i) {
var playerInfo = players[i];
var item = cc.instantiate(this.prefabRankItem);
item.getComponent(‘RankItem’).init(i, playerInfo);
this.content.addChild(item);
}
},

原始项目运行都没问题,但我照着实现的在init: function (rank, playerInfo)中这一行会报错,this.texRankBG为null
this.spRankBG.spriteFrame = this.texRankBG[rank];

我在原始项目中找了一天也没找到在如初始化了this.texRankBG,将原始项目其它不相干场景和结点都一一删除到和我建的一样还是不行。求高手指点一下!

你看一下你的属性检查器里面,有没有挂上这个
image

rankItem预制体上会有一个texRankBG的属性。这应该是一个精灵图数组。你要把对应的图片拖入这个数组里面

感谢楼上朋友的回复,可以正常运行的预制体里对应的textRankBG属性里是空着的。也没有在代码中找到这一项的初始化。image 这是预制体脚本属性。这个是可以运行的,不能运行的在设置上和这个完全一样。

原始项目中rankItem预制体上的texRankBG不是空的,把代码中的texRankBG: cc.SpriteFrame改成texRankBG: [cc.SpriteFrame]后可以在编辑器中看到image

非常感谢!确实是这样。

但是好奇怪啊,我一开始也以为楼主没挂上,但是他说原始项目是空的,我也去下了一个,发现的确是空的,没挂的,而且运行之后出来的确是个数组。然后我复制了这个预制,重新挂一次脚本,发现就直接报错了

按照它运行出来的结果的确是这么操作,但是我想不通为什么原项目显示的是没挂的而且还不会错

你这个应该是改过后的吧,不是它原始项目,不然下面那个texPlayerPhoto应该同理弄成数组,而不是空的

是原始项目,代码中texRankBG和texPlayerPhoto这两个属性类型不对,打开rankItem.prefab可以看到这两个都是有的

卧槽还真是,但是编辑器显示居然是空的 :joy:我还抓头那么久

我建议你从3.6版本开始学,不然又得重新学一遍 :joy:

感谢各位的回复,rankItem.prefab居然可以直接用文本编辑器打开,又学到了一招。今天又碰上一个问题,一个脚本的代码是:
properties: {

    winAudio: {

        default: null,

        url: cc.AudioClip

    },

    loseAudio: {

        default: null,

        url: cc.AudioClip

    },

    cardAudio: {

        default: null,

        url: cc.AudioClip,

    },

    buttonAudio: {

        default: null,

        url: cc.AudioClip

    },

    chipsAudio: {

        default: null,

        url: cc.AudioClip

    },

    bgm: {

        url: cc.AudioClip,

        default: null            

    }

},

对应的属性面板却成了:


点Create也没有反应,用creator 2.3版本确能正常显示。

谢谢你的建议,先用这个例子感受一下,下一个例子打算从3.6开始搞。

url: cc.AudioClip

url废弃了,用type

非常感谢!