版本: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動畫里有位移了。