版本:2.3.4
參考:
網上搜了一下Spine動畫位置的解決方案,參考了兩篇文章吧。在制作spine動作時,不可避免的動畫會產生位置,動畫師不能一直將動畫固定在原地。
比如跑步動畫,這個可以原地踏步,動畫做在原地就行了。

但是做出攻擊,或者一些炫酷動作時,難免會產生位移。這個位移可能是曲線的,非線性運動,直接讓程序或者策划去微調出和動畫師制作的一樣效果有些困難。
例如如下攻擊動畫。人物位置移動了,但是動畫位置還在原地呢。這樣做碰撞檢測或者其他位置相關判斷的時候,還在檢測原地的位置,這顯然是不合適的。

這個解決方案就是讓動畫師制作動畫時,讓根骨骼root跟隨動畫一起移動。
下圖root根骨骼就是人物腳下那個十字圖標

在cocos中獲取root的位置。在做位置相關判斷時,加上root的位置就行了。
start() {
let sk:sp.Skeleton = this.hero.getComponent(sp.Skeleton);
sk.setAnimation(0,"attack1_1",true);
let root = sk.findBone("root");
let rootX = root.x;
let rootY = root.y;
console.log("root位置:",rootX , rootY);
console.log("動畫位置:",sk.node.x + rootX, sk.node.y + rootY);
}
如果要在人物身上掛載碰撞BoxCollider,選擇骨骼動畫,點擊生成掛點。

生成掛點,會顯示人物的骨骼樹

我們在root下掛上一個BoxCollider做碰撞檢測

在代碼里顯示碰撞檢測debugDraw
onLoad(){
var manager = cc.director.getCollisionManager();
manager.enabled = true;
manager.enabledDebugDraw = true;
}
運行游戲,可以看到碰撞檢測的BoxCollider掛載root上后,是和人物顯示的位置是一致的。
這樣做使用BoxCollider做碰撞檢測,就不用擔心spine動畫里有位移了。

