1. 程式人生 > >Unity3D - Animator骨骼動畫的實現

Unity3D - Animator骨骼動畫的實現

利用Animator實現骨骼動畫:

1> 確保人物能夠正常移動、Camera能夠正常跟隨

2> 使用WSAD對人物不同運動狀態進行切換與連線

3> LeftShift:加速、Space:跳躍

4> 對於移動所產生的場景旋轉以及視野跟隨問題解決,可以參考我的另一篇文章:https://blog.csdn.net/qq_42292831/article/details/84400575

5> 模型資源下載請訪問遊戲蠻牛官網 ( http://www.manew.com )

****************************************************************************************************************************************

 

一:執行效果

 

二:操作以及注意事項

0> 首先需要在Anumator中選擇自己新建的Animator Controller檔案:

1> 在Project中的動畫資料夾中建立Animator Controller (狀態控制機),雙擊開啟

2> 設定左側這些Float變數的目的:

拿W_Code舉例:

當W鍵按下時,W_Code的鍵值就會變為1,鬆開按鍵,鍵值為0,這樣人物的狀態會切換為Walk狀態;而且因為W還在Input.GetAxis("Vertical")的影響下沿著世界座標的Z軸移動,Idle->Walk之間的切換完全依靠W鍵來確定。

3> 右側箭頭表示各個動作之間可以轉換的方向與條件

這裡就拿Run->Jump這個箭頭舉例,在Run的狀態下當出現Jump_Code>0(1)時,就會觸發跳躍動畫

4> 注意事項:

在本Demo中出現了這樣的情況:給人物與其他物體均新增的剛體屬性,而且Camera屬於人物的子物體,當兩個剛體碰撞,Camera視角會莫名出現旋轉。

取消被碰撞物體的剛體屬性即可解決這種問題;

 

三:Scripts

1> 視角跟隨:直接將Camera作為人物的子物體即可實現Camera的視角跟隨

2> 視角移動:右鍵實現Camera視野左右移動(上下可將程式碼中的尤拉角指向y,但是範圍過大而且無法更改,這裡使用了x)

      因為Camera是作為人物的子物體,所以將該指令碼直接拖動到人物上將會直接是人物轉向與Camera轉向同步;

  Camera_Follow.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Camera_Follow : MonoBehaviour {

    public Transform Camera;
    bool Model_IsRotate = false;
    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(1))
        {
            Model_IsRotate = true;
        }
        if (Input.GetMouseButtonUp(1))
        {
            Model_IsRotate = false;
        }
        if (Model_IsRotate)
        {
            transform.RotateAround(transform.position, Vector3.up, 10 * Input.GetAxis("Mouse X"));

            Vector3 originPosition = Camera.position;
            Quaternion originRotation = Camera.rotation;

            Camera.RotateAround(transform.position, transform.right, -10 * Input.GetAxis("Mouse Y"));
            if (Camera.eulerAngles.x < 0 || Camera.eulerAngles.x > 50)    //不明覺厲的尤拉角,但是能夠設定x/y值來達到仰視和俯視的效果
            {
                Camera.position = originPosition;
                Camera.rotation = originRotation;
            }

        }
	}
}

3> 人物移動 (控制Animator鍵值進行狀態轉換)

Roko_Movement.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class Roko_Movement : MonoBehaviour {

    //public NavMeshAgent agent;
    public Animator anim;
    public float wsad_MoveSpeed = 10;

    bool Space_Key_Down = false;
    bool Left_Shift_Key_Down = false;
    bool W_Key_Down = false;
    bool S_Key_Down = false;
    bool A_Key_Down = false;
    bool D_Key_Down = false;

    // Use this for initialization
    void Start () {
		
	}
	// Update is called once per frame
	void Update () {
        //if(Input.GetMouseButtonDown(0))
        //      {
        //          Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        //          RaycastHit hit;
        //          if(Physics.Raycast(ray,out hit))
        //          {
        //              agent.SetDestination(hit.point);

        //          }
        //      }
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        this.transform.Translate(new Vector3(h, 0, v) * Time.deltaTime * wsad_MoveSpeed);
        
        //W鍵控制行走
        if (Input.GetKeyDown(KeyCode.W))
        {
            W_Key_Down = true;
        }
        if (Input.GetKeyUp(KeyCode.W))
        {   
            W_Key_Down = false;
        }
        if (W_Key_Down)
        {
            anim.SetFloat("W_Code", 1f);
        }
        if (!W_Key_Down)
        {
            anim.SetFloat("W_Code", 0f);
        }

        //S鍵控制後退
        if (Input.GetKeyDown(KeyCode.S))
        {
            S_Key_Down = true;
        }
        if (Input.GetKeyUp(KeyCode.S))
        {
            S_Key_Down = false;
        }
        if (S_Key_Down)
        {
            anim.SetFloat("S_Code", 1f);
        }
        if (!S_Key_Down)
        {
            anim.SetFloat("S_Code", 0f);
        }

        //A鍵控制左轉
        if (Input.GetKeyDown(KeyCode.A))
        {
            A_Key_Down = true;
        }
        if (Input.GetKeyUp(KeyCode.A))
        {
            A_Key_Down = false;
        }
        if (A_Key_Down)
        {
            anim.SetFloat("A_Code", 1f);
        }
        if (!A_Key_Down)
        {
            anim.SetFloat("A_Code", 0f);
        }

        //D鍵控制左轉
        if (Input.GetKeyDown(KeyCode.D))
        {
            D_Key_Down = true;
        }
        if (Input.GetKeyUp(KeyCode.D))
        {
            D_Key_Down = false;
        }
        if (D_Key_Down)
        {
            anim.SetFloat("D_Code", 1f);
        }
        if (!D_Key_Down)
        {
            anim.SetFloat("D_Code", 0f);
        }


        //Left_Shift鍵加速
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            Left_Shift_Key_Down = true;
        }
        if (Input.GetKeyUp(KeyCode.LeftShift))
        {
            Left_Shift_Key_Down = false;
        }
        if (Left_Shift_Key_Down)
        {
            anim.SetFloat("Speed_up_Code", 1f);
        }
        if (!Left_Shift_Key_Down)
        {
            anim.SetFloat("Speed_up_Code", 0f);
        }

        //Space鍵控制Jump
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Space_Key_Down = true;
        }
        if (Input.GetKeyUp(KeyCode.Space))
        {
            Space_Key_Down = false;
        }
        if (Space_Key_Down)
        {
            anim.SetFloat("Jump_Code", 1f);
        }
        if (!Space_Key_Down)
        {
            anim.SetFloat("Jump_Code", 0f);
        }

        //anim.SetFloat("Speed", agent.velocity.magnitude);
    }
}

 

----------------------人物模型下載:遊戲蠻牛官網 ( http://www.manew.com )----------------------