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 )----------------------