溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

unity中spine怎么用

發(fā)布時間:2022-01-05 14:35:50 來源:億速云 閱讀:809 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)unity中spine怎么用,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

骨骼動畫

首先我們來看到底什么是骨骼動畫:

在早期的機(jī)器上,渲染本身已經(jīng)占用了很多CPU資源,因此,對于渲染,往往采取的是一種空間換時間的策略,以避免在模型的渲染中繼續(xù)加重CPU的負(fù)擔(dān)。幀動畫模型在這種條件下應(yīng)運(yùn)而生。比較著名的幀動畫格式是Quake2所采用的MD2。到今天為止,幀動畫依然存在,只不過幀動畫更多地是來描述小且動作相對少些的物體。

GPU出現(xiàn)后,CPU的問題早已不像以前那么突出,一些新的手段和技術(shù)也可以被應(yīng)用進(jìn)來了。骨骼動畫相對于幀動畫而言,更加靈活多變,但同時,骨骼動畫需要更多的計(jì)算量,因此骨骼動畫往往應(yīng)用在需要著重體現(xiàn)動作細(xì)節(jié)的模型中。

骨骼動畫技術(shù)后于幀動畫技術(shù)出現(xiàn)。最開始,骨骼動畫僅用于非實(shí)時渲染的建模領(lǐng)域,如3DMax這類建模軟件之中,以方便美工的建模。后來,CPU從渲染中解放后,骨骼動畫才用于實(shí)時渲染的游戲中。

骨骼動畫原理

骨骼動畫的想法來源于人體骨骼。例如說,人的上肢所有肌肉和皮膚都受上肢骨胳的影響,而人的踝關(guān)節(jié)則分別承受小腿骨胳和腳骨的影響。根據(jù)這個我們可以將骨骼動畫理解為兩個概念: 骨骼:用以控制蒙皮的一種抽象的概念,如人體骨骼控制皮膚。 蒙皮:被骨骼控制、并顯示在外的因素,如人體的皮膚被骨骼所影響。

蒙皮(SKINMESH)

在最終的渲染結(jié)果中,蒙皮將完全顯示出來,蒙皮實(shí)際上就是頂點(diǎn)、法線和紋理坐標(biāo)等將被渲染的元素。而其中,最關(guān)鍵的當(dāng)然是頂點(diǎn),頂點(diǎn)將直接被骨頭牽扯運(yùn)動,因而使得整個模型呈現(xiàn)骨骼所決定的樣子。

骨骼(SKELETON)

骨骼是一種抽象的概念,在最終的渲染結(jié)果中,它不可見。類如人體骨骼、骨骼是若干骨頭(Bone)成樹狀的集合體,而每塊骨頭又分別與若干數(shù)量的蒙皮頂點(diǎn)關(guān)聯(lián)。當(dāng)骨頭運(yùn)動的時候,與之關(guān)聯(lián)的所有蒙皮頂點(diǎn)也會受骨骼的影響而運(yùn)動。

骨頭與蒙皮頂點(diǎn)的關(guān)聯(lián)需要考慮到每塊骨頭對蒙皮頂點(diǎn)的影響。 盡管大部分情況下,一個頂點(diǎn)將僅僅被一個骨頭的影響,但是關(guān)節(jié)處的頂點(diǎn)往往被多根骨頭影響,例如踝關(guān)節(jié),可能會分別受小腿骨50%和腳骨50%的影響,這種影響叫作權(quán)重(Weight)。
在這種情況下,我們稱踝關(guān)節(jié)的這些頂點(diǎn),受小腿骨影響的權(quán)重是50%,受腳骨影響的權(quán)重也是50%。

Unity的骨骼動畫插件

而在Unity3D中骨骼動畫插件有比較多,例如Uni2D,SmoothMovoe,Puppet2D等等,但為了方便美術(shù)人員編輯我們項(xiàng)目使用是spine

Spine介紹

spine容易上手,并且它提供了mesh,通常來說一張紋理只有4個頂點(diǎn),左下右下左上右上,但是有了mesh,我們可以抓取這個圖片,并設(shè)置大量的頂點(diǎn)給它,之后就能通過對頂點(diǎn)的設(shè)置完成圖片的拉伸形變,比如乳搖功能。

spine中30幀為1s,最新版中也提供了IK,可以將骨骼固定,做動作

在Unity中導(dǎo)入骨骼動畫

1:準(zhǔn)備好unity使用Spine所需要的運(yùn)行庫,可到如下地址https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-unity

使用git下載,或直接下載master.zip文件.

2:準(zhǔn)備好Spine導(dǎo)出好的動畫文件,正好最近偶爾玩一個游戲,里面使用了Spine制作的骨骼動畫,我就直接使用它做好的資源記錄一下步驟,僅作筆記使用.

我這里的動畫文件資源如圖:

unity中spine怎么用

這里需要提前做一個準(zhǔn)備工作,把上圖中的enemy_hunter.atlas文件重名為enemy_hunter.atlas.txt,因?yàn)閡nity無法識別.atlas文件,后面無法進(jìn)行資源導(dǎo)入.

3:現(xiàn)在準(zhǔn)備工作ok了,我們可以創(chuàng)建一個unity工程了.

a:把master.zip文件中spine-runtimes-master\spine-unity\Assets\spine-unity文件夾復(fù)制到工程的Assets文件夾中

b:把master.zip文件中spine-runtimes-master\spine-csharp\src文件夾中所有內(nèi)容復(fù)制到工程的Assets\spine-csharp文件夾中

4:導(dǎo)入資源

a:這里我在資源面板右鍵新建一個文件夾,用來存放導(dǎo)入的資源,建議導(dǎo)入順序?yàn)?quot;.png" ".json"  ".atlas.txt",這樣在最后導(dǎo)入".atlas.txt"文件的時候,會自動生成enemy_hunter_Material.mat文件和enemy_hunter_Atlas.asset文件.

b:右鍵新建"spine skeletonData"類型文件,名稱為"enemy_hunter_SkeletonData.asset",這里結(jié)合網(wǎng)上的資料,感覺以前的版本,應(yīng)該都是自動生成的,不知道這里為什么需要手動建立這個文件,之前的版本也沒有使用過,純屬猜測.文件新建好后,需要配置Skeleton JSON屬性,指定"enemy_hunter.json"文件,然后點(diǎn)擊"Attempt Reimport"的按鈕即可.完成后如圖:

unity中spine怎么用

到目前為止,骨骼動畫的導(dǎo)入工作就完成了.

5.現(xiàn)在我們把這個骨骼動畫加入到場景中看看效果.

新建Spine SkeletonAnimation對象,Skeleton Data Asset屬性指定為"enemy_hunter_SkeletonData.asset"文件.然后Advanced中Animation屬性選擇一個動作,Loop屬性勾上,即可循環(huán)播放.

如圖:

unity中spine怎么用

unity中spine怎么用

6:現(xiàn)在即可在Game面板播放觀看效果.至此Spine骨骼動畫導(dǎo)入unity已完成!

在Unity中使用骨骼動畫

可以使用spine制作骨骼動畫來給unity使用。spine提供了unity運(yùn)行包。運(yùn)行包的版本一定要和spine版本一致,不然會報(bào)錯。

導(dǎo)入spine動畫:

由spine導(dǎo)出的動畫文件有3個:xx.atlas,xx.json,xx.png。將這三個文件直接導(dǎo)入unity會報(bào)錯,將xx.atlas改為xx.atlas.txt,這時會自動生成xx_Atlas.asset,xx_Material.mat。然后在unity里面create spine SkeletonData,指定xx_Atlas.asset和xx.json。就可以用SkeletonData生成動畫了。

控制動畫播放:

SkeletonAnimation skeletonAnimation;   //gameobject的component。
Spine.AnimationState spineAnimationState = skeletonAnimation.state;
Spine.Skeleton skeleton;

spineAnimationState.SetAnimation(0, animationName, true);

切換動畫的bug:

由于spine在切換動畫的時候自動補(bǔ)償,用于動畫的平穩(wěn)過度。但是會導(dǎo)致殘影等bug,這時候需要在SetAnimation前調(diào)用

skeletonAnimation.skeleton.SetToSetupPose ();
spineAnimationState.ClearTracks ();

來消除前一個動畫的影響。

添加事件:

skeletonAnimation.state.Start:開始播放
skeletonAnimation.state.End:動畫被清除或者中斷
skeletonAnimation.state.Interrupt:動畫被打斷
skeletonAnimation.state.Complete:播放結(jié)束
skeletonAnimation.state.Event:用戶自定義事件

事件設(shè)置采用lambda表達(dá)式:

skeletonAnimation.state.Complete += (state, trackIndex,loopCount) => {
            Debug.log("");
        };

動態(tài)獲取slot的坐標(biāo):

Vector3 pos = skeletonAnimation.skeleton.FindSlot("hat_1").Bone.GetWorldPosition(transform);

關(guān)于“unity中spine怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI