Unity3D遊戲開發之MatchTarget實現角色攀爬效果

今天我們來一起學習在Unity3D中如何實現角色攀爬效果。

    在RPG遊戲中,某些遊戲場景常常需要玩家沿着牆壁或者***攀爬到高處,例如《仙劍奇俠傳三》的九龍坡場景中,玩家需要沿着***爬到高處才能收集場景中的物品,而在《古劍奇譚一》中的翻雲寨,玩家則需要爬到頂層才能開啓遊戲裏的機關。那麼今天我們就來利用Mecanim動畫系統中的MatchTarget來實現角色攀爬效果。在正式開始今天的內容前,首先讓我們來了解下MatchTarget的具體概念。MatchTarger即匹配目標,是Animator類中的一個方法,該方法可以實現在執行動畫的過程中使角色身體的某個部位與指定位置進行匹配,比如我們在攀爬的過程中,手、腳及身體應該是和牆壁接觸的,那麼這時我們就可以考慮使用這個方法,該方法定義如下:

[csharp] view plaincopyprint?

1.     void MatchTarget (Vector3 matchPosition, Quaternion matchRotation, AvatarTarget targetBodyPart, MatchTargetWeightMask weightMask,  

[csharp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片

更多精彩請到http://www.gopedu.com/


1.     float startNormalizedTime,float targetNormalizedTime)  

可以看出,在該方法中,我們指定了匹配的位置、角度、身體的具體部分、權重、匹配開始及匹配結束的時間。由此,我們就可以開始今天的內容了,首先我們來創建一個簡單的場景:

wKiom1QRClaQT60VAAEsC-hUkTI424.jpg在這個場景中,我們希望角色可以沿着牆壁爬到牆上。那麼具體怎麼做呢?首先我們在場景中創建一個空的遊戲體,將其命名爲RightHandTarget,它將作爲角色在攀爬時右手的一個匹配點,我們將其拖放到合適的位置,然後將其拖放到牆模型下,使其成爲它的一個子物體。如圖所示:wKiom1QRCnCQTWjwAACtDGdNkco473.jpg好了,這樣我們完成了場景部分的搭建和準備工作,接下來我們來製作角色的動畫模型,新建一個Animator Controller,命名爲JumpGrab,雙擊打開Animator窗口,這裏我們只拖入兩個動畫Idle'和JumpUp,這裏我們新建兩個float類型的參數MatchStart、MatchEnd及Bool類型的參數Jump,觸發JumpUp動畫的條件是Jump爲True。如圖wKioL1QRCp_jvmVGAAGM2Ku9jJc955.jpg

其中JumpUp是一個完整的攀爬牆壁的動畫,在這個動畫中,角色首先會伸出右手進行攀爬,因此我們可以將其右手與我們在場景中定義好的RightHandTarget進行匹配,從而保證角色在攀爬的過程中總是緊緊貼着牆壁。好了,現在讓我們來編寫腳本來將動畫模型和角色關聯起來:

[csharp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片

1.     using UnityEngine;  

2.     using System.Collections;  

3.       

4.     public class TargetMatching : MonoBehaviour  

5.     {  

6.         //動畫組件  

7.         private Animator animator;  

8.         //右手着力點  

9.         public Transform RightHand;  

10.      //是否完成跳躍  

11.      bool hasJumped = false;  

12.    

13.      AnimatorStateInfo mState;  

14.    

15.      void Start ()   

16.      {  

17.          //獲取動畫組件  

18.          animator = GetComponent<Animator>();  

19.      }  

20.    

21.      void Update ()   

22.      {  

23.    

24.          if (animator)  

25.          {  

26.              //獲取動畫狀態  

27.               mState = animator.GetCurrentAnimatorStateInfo(0);  

28.    

29.              if (Input.GetButton("Fire1")) animator.SetBool("Jump", true);  

30.              if (mState.IsName("Base Layer.JumpUp") || mState.IsName("Base Layer.FullJump"))   

31.              {  

32.                  animator.SetBool("Jump", false);  

33.                  //調用MatchTarget方法                 

34.                  animator.MatchTarget(RightHand.position, RightHand.rotation, AvatarTarget.RightHand, new MatchTargetWeightMask(new Vector3(1, 1, 1), 0), animator.GetFloat("MatchStart"), animator.GetFloat("MatchEnd"));  

35.                  hasJumped = true;  

36.              }  

37.          }  

38.        

39.      }  

40.  }  


   好了,下面我們來看最終的效果吧!

wKioL1QRCr-BYMgaAAHdSiDidA0555.gif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章