unity3d游戲開發(fā)之角色的動畫腳本的編寫.doc_第1頁
unity3d游戲開發(fā)之角色的動畫腳本的編寫.doc_第2頁
unity3d游戲開發(fā)之角色的動畫腳本的編寫.doc_第3頁
unity3d游戲開發(fā)之角色的動畫腳本的編寫.doc_第4頁
unity3d游戲開發(fā)之角色的動畫腳本的編寫.doc_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

在上一篇,我們介紹了有關Animation這個類中的部分方法,我后來想了想,這么介紹也不是個辦法(其實有些方法我自己也沒用過),該介紹點實際的東西了,畢竟我們是要做東西出來的。那好,我們就開始吧。 該文章出自【狗刨學習網(wǎng)】 首先我們要介紹的主題是:Animation Blending ,即動畫融合。我們來看官方文檔上的描述: 用我自己的理解就是:在現(xiàn)今的游戲中,動畫融合是一個必不可少的特性用以讓你的的角色能夠產(chǎn)生平滑的動畫。動畫設計師首先為角色創(chuàng)建了一些個動畫片段,例如一個行走循環(huán),跑步循環(huán),還有站立或射擊的。在你運行游戲期間,你需要從站立的動畫狀態(tài)轉換到行走的動畫狀態(tài)并且看上去要足夠平滑,不能突然跳轉。 此時我們就需要 有一種處理方式來完成我們所想要實現(xiàn)的效果。這就是“動畫融合”的用處。在Unity中,一個角色可以有多種不同的動畫片段,Unity可以將這些動畫片段融合起來并以一種組件的形式(即Animation)進行管理,并根據(jù)具體情形來比如腳本來生成最終的動畫。看來我們其實一直在運用“動畫的融合”。size=12.8000001907349px 那么我們來看一個例子吧,我就選官方的CharacterAnimation里的goober為例,直接給出代碼:1.2. using UnityEngine;3. using System.Collections;4.5. public class SuperMarioAnimation : MonoBehaviour 6. 7. public float landBounceTime = 0.6f;/該動畫在0播放到60%時之后立即結束,應該是后來根據(jù)主角在空中滯留的時間而調整的。8. 9. private AnimationState lastJump;/存儲“jump”的動畫狀態(tài)10. / Use this for initialization11. void Start () 12. 13. animation.wrapMode = WrapMode.Loop;/首先設置所有的動畫片段播放時的播放模式為循環(huán)播放模式,之后我們也可以修改單個動畫片段播放時的循環(huán)模式,比如此函數(shù)最后一行。14.15. AnimationState jump = animationjump;/暫存“jump”的動畫狀態(tài),記住,是暫存。僅僅只是用于下面三行代碼中的動畫設置。16.17. jump.layer = 1 ;/設置動畫狀態(tài)jump的動畫層值為1,相對于默認層級值要高,為的是有更多的優(yōu)先級取得動畫權重。18.19. jump.enabled = false;/暫停該動畫的播放,這個我會在后面進行相應的講解,因為它有其獨特的應用情景。20.21. jump.wrapMode = WrapMode.Clamp;/設置動畫狀態(tài)jump的循環(huán)模式為Once(單次,上一篇已經(jīng)證明了)循環(huán)。22. 23. 24. void Update () 25. SuperMarioController marioController = gameObject.GetComponent();26. /取得該角色的SuperMarioController腳本組件。 27.28. float currentSpeed = marioController.GetSpeed();29. /每幀獲取該角色的速度并存儲在臨時變量currentSpeed里。30. 31. if(currentSpeed 0.1)/以速度判斷該播放何種動畫,淡入淡出效果的核心就在這里32. animation.CrossFade(walk);33. /如果當前正在播放某個動畫片段,那么淡出它,淡入名為“Walk”的動畫。34. else35. animation.CrossFade(idle);36. 37. 38. if(marioController.IsJumping()/如果此時goober(我們的主角)還在跳躍39. if(lastJump.time landBounceTime)/如果goober的跳躍動畫播放了60%之后40. lastJump.speed = 0.0f;/讓這個動畫狀態(tài)從頭開始播放。41. 42. 43. 44. 45. public void DidJump()/SendMessage方法調用的,在goober躍起時執(zhí)行46. /lastJump = animation.CrossFadeQueued(Move,0.3f,QueueMode.PlayNow);47. lastJump = animation.CrossFadeQueued(jump, 0.3f, QueueMode.PlayNow);48. 49. 50.51. public void DidLand()/SendMessage方法調用的,在goober著地時執(zhí)行52. 53. lastJump.speed = 1;/將當前播放的動畫lastJump的幀數(shù)調到最后。54. 55. 56. 復制代碼 注意,要想理解好這段代碼,我們必須結合另外一個加在goober上的腳本:SuperMarioController。這個例子里面出現(xiàn)了我們之前提到的一個非常重要的類:AnimationState,即動畫狀態(tài),還涉及到了動畫層的概念。所謂動畫層,即AnimationState.layer,AnimationState這個類中的一個很重要的屬性。在Unity的動畫體系中,默認情況下,所有動畫狀態(tài)的layer值為0,你可以在腳本中動態(tài)的調節(jié)該動畫狀態(tài)的layer值。如上代碼,我們在unity3d中點擊運行按鈕,我們什么都不做時,由于此時獲得的currentSpeed的值肯定是小于0.1的,那么此時goober就會播放idle(站立)動畫,見:size=12.8000001907349px 但是當我們按下了空格鍵,此時就會立即播放跳躍動畫。假如我們將不設置jump的layer值為1,即注釋掉這行:size=12.8000001907349px 我們再運行工程,此時我們還是按下空格鍵,效果如下: 錯誤定位到了: 出錯了,為什么呢?由于此時沒有設置跳躍動畫的layer,導致跳躍動畫的layer與idle的layer的值都為0,擁有同樣的播放優(yōu)先級,所以按下空格鍵時準備播放跳躍動畫,但是在下一幀時程序發(fā)現(xiàn)此時從marioController 腳本組件中得到的currentSpeed變量的值小于0.1,所以又轉為播放idle動畫,可是此時在此動畫腳本中執(zhí)行到了上面藍先的這一行,發(fā)現(xiàn)lastJump此時是空的(因為此時沒有播放跳躍動畫嘛),于是才提示空引用錯誤。所以工程此時就會暫停,我們可以從上面這張圖中得以發(fā)現(xiàn),看,goober此時是不是停在半空中,程序是不是暫停運行了?總結一下:如果某個動畫狀態(tài)的layer越高,執(zhí)行起來就會比layer值較低的動畫狀態(tài)優(yōu)先,且只有此動畫狀態(tài)被Stop或暫停時才有可能執(zhí)行其他動畫狀態(tài)。官方的一個說明是: Lower layer animations only receive blend weights if the higher layers didnt use up all blend weights.size=12.8000001907349px 翻譯過來就是:layer較低的動畫只能在layer較高的動畫沒有占用全部混

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論