[0]适配版spine实现替换骨骼图片

首先原则是不想破坏官方提供的代码,这样更新引擎会非常麻烦。
但是,最终还是添加了引擎提供的代码。
用hook的方式,对class添加方法,修改引擎代码,进行渲染。
其实现效率不高,还没有找到缓存的方式。如果有更好的思路或者缓存方式,请私信我。
下面是hook代码的实现
Laya.SpineSkeleton.prototype.replaceSkin = function (slotName, texture) {
if (!this.skeletonRenderer._diySkin){
this.skeletonRenderer._diySkin = {}
}
this.skeletonRenderer._diySkin[slotName] = {
texture: texture,
uv:{}
}
}
下面是修改引擎代码的实现
if (this._diySkin && this._diySkin[slot.data.name]) {
let _texture = this._diySkin[slot.data.name].texture;
let tuvs = [];
if (tuvs.length == 0) {
let _smallTexture = Laya.Texture.createFromTexture(texture, attachment.region.renderObject.x,
attachment.region.renderObject.y, attachment.region.renderObject.width, attachment.region.renderObject.height);
tuvs = Laya.UVTools.getRelativeUV(_smallTexture.uv, mUVs, tuvs);
tuvs = Laya.UVTools.getAbsoluteUV(_texture.uv, tuvs, tuvs);
}
mUVs = tuvs;
texture = _texture
}
spineSkeletonIns.graphics.drawTriangles(texture, 0, 0, mVertices, mUVs, new Uint16Array(triangles), Laya.Matrix.EMPTY, colors[3], color, blendMode, colorNum);

附带添加了cocos creator在骨骼上添加节点的思路,完全是hook的方式,如果没有改骨骼图片的需求,直接使用即可。
const oldUpdate = Laya.SpineSkeleton.prototype._update;

Laya.SpineSkeleton.prototype._update = function () {
if (!this.attachNode) {
this.attachNode = new Laya.Sprite()
this.attachNode.name = "root"
this.addChild(this.attachNode)
this.child4AttachNodeMap = {};
}
oldUpdate.apply(this, arguments);
for (let bone of this.skeleton.bones) {
let boneName = bone.data.name
if (boneName != "root") {
let child = this.attachNode.getChildByName(boneName)
if (!child) {
child = new Laya.Sprite()
child.name = boneName
this.attachNode.addChild(child)
}
child.x = bone.x
child.y = -bone.y
child.scaleX = bone.scaleX
child.scaleY = bone.scaleY
child.rotation = bone.rotation

if (this.child4AttachNodeMap[boneName]) {
for (let attachChild of this.child4AttachNodeMap[boneName]) {
if (!attachChild.destroyed) {
child.addChild(attachChild)
}
}
this.child4AttachNodeMap[boneName] = []
}
// child.graphics.drawRect(0,0,10,10,"#6a9c5a")
}
}
}

Laya.SpineSkeleton.prototype.addChild2AttachNodeByName = function (_name, _child) {
if (!this.child4AttachNodeMap[_name]) {
this.child4AttachNodeMap[_name] = []
}
this.child4AttachNodeMap[_name].push(_child)
}
已邀请:

Laya_z

赞同来自:

感谢分享

139*****908

赞同来自:

你好楼主,我问下,我按照修改引擎代码的实现功能后,发现替换的纹理素材被旋转了90度,导致不能显示正确的位置,这个你有遇到过吗,方不方便留个联系方式,沟通交流下?

186*****397

赞同来自:


下面是修改引擎代码的实现 


不知应该插入到哪一段?

要回复问题请先

商务合作
商务合作