純步驟案例學習,最終完成一個人物影片——按數字1234鍵換動作;WASD鍵控制前后行走與左右偏移;shift鍵控制人物奔跑;空格鍵實作跳躍。
一、建平面、新建狀態機,新建代碼player、拖人物模型,面向Z軸正方向

二、雙擊狀態機,將WAIT00影片拖進狀態機。實作人物為等待動作。

影片層級Animation Layers:如果一個角色要播放移動射擊動作,上下身的動作是需要分離的,因此需要用不同的影片層來控制不同身體部位的動作。
Weight:權重。當前影片層級播放的影片對角色動作的影響程度。
Mask:遮罩。來屏蔽部分肢體的影片效果。
Sync:同步。
Timing:時間配置。
IK Pass:逆向運動學傳遞。
影片引數 Animation Parameters:影片引數是一系列在影片系統中定義的變數,也可以通過腳本進行訪問和賦值。
引數值的四種型別:
Float:浮點型
Int:整數
Bool:回傳布林值,通過復選框來選擇true或flase
Trigger:觸發一個布林值,復位控制器消耗一個轉變,由一個圓按鈕表示
影片狀態 Animation States(點狀態機里的影片):

Motion:當前狀態下的影片片段
Speed:默認速度
Normalized Time:實作影片播放結束的獲取
Mirror:鏡像開關。僅對人形影片有效。
Cycle Offset:回圈偏移量。
Foot IK:是否對足部使用逆向運動學,僅對人形影片有效。
Write Defaults:影片狀態是否寫回默認值。影片終止時會覆寫起始狀態。
Transitions:由當前狀態出發的過渡條件串列。
三、拖WAIT01、WAIT02、WAIT03、WAIT04。實作按數字1播放WAIT01,按數字2播放WAIT02按數字3播放WAIT03,按數字4播放WAIT04。

if (Input.GetKeyDown("1"))
{
anim.Play("WAIT01", -1, 0f);
}
if (Input.GetKeyDown("2"))
{
anim.Play("WAIT02", -1, 0f);
}
if (Input.GetKeyDown("3"))
{
anim.Play("WAIT03", -1, 0f);
}
if (Input.GetKeyDown("4"))
{
anim.Play("WAIT04", -1, 0f);
}
講影片過渡 Animation Transitions(點箭頭):影片過渡是指由一個影片狀態過渡到另一個影片狀態。(選擇狀態機里的箭頭時出現)
影片過渡不僅定義了狀態之間的混合需要多長的時間,而且定義了它們應該在什么條件下激活。只有當某些條件為真時,才能設定轉換。
加兩個箭頭表示有兩個過渡條件,每個過渡條件是或的關系,兩個條件滿足一個,就可以實作轉換。但是每個過渡條件的引數是且的關系,必須全部同時滿足,影片才可以過渡。
Has Exit Time:是否啟用退出時間。啟用后,當前影片播放完才能進入下一個影片。
Setting:設定過度的時間、偏移量等
Conditions:當影片引數符合相應條件時,觸發影片過渡。(影片與腳本互動的關鍵)
四、建混合樹walk、run。實作人物前后行走跑步跳躍,并能左右偏移。

1.新建引數inputH、inputV(Float型別);run、jump(bool)。
2.雙擊混合樹run,混合型別為1D。通過唯一一個引數來控制子影片的混合。

-1為向左偏移,0為向前跑,1為向右偏移,此時圖形沒有和其他部分重合;
-1~0處,一個重合的深色三角 ,這里根據權重混合向左跑和向前跑的影片。
3.雙擊混合樹walk,混合型別為2D Simple Directional。通過兩個引數來控制。

4.在基礎層中選中箭頭進行設定過渡條件




5.增加跳:





using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour
{
private Animator anim;
private Rigidbody rbody;
private float inputH;
private float inputV;
private bool run;
void Start()
{
anim = GetComponent<Animator>();
rbody = GetComponent<Rigidbody>();
run = false;
}
void Update()
{
if (Input.GetKeyDown("1"))
{
anim.Play("WAIT01", -1, 0f);
}
if (Input.GetKeyDown("2"))
{
anim.Play("WAIT02", -1, 0f);
}
if (Input.GetKeyDown("3"))
{
anim.Play("WAIT03", -1, 0f);
}
if (Input.GetKeyDown("4"))
{
anim.Play("WAIT04", -1, 0f);
}
if (Input.GetKey(KeyCode.LeftShift))
{
run = true;
}
else
{
run = false;
}
if (Input.GetKey(KeyCode.Space))
{
anim.SetBool("jump", true);
}
else
{
anim.SetBool("jump", false);
}
inputH = Input.GetAxis("Horizontal");
inputV = Input.GetAxis("Vertical");
anim.SetFloat("inputH", inputH);
anim.SetFloat("inputV", inputV);
anim.SetBool("run", run);
float moveX = inputH * 20f * Time.deltaTime; //X軸的速度
float moveZ = inputV * 50f * Time.deltaTime;
if (moveZ <= 0f)
{
moveX = 0f;
}
else if (run)
{
moveX *= 3f;
moveZ *= 3f;
}
rbody.velocity = new Vector3(moveX, 0f, moveZ);
}
}
初學Unity,如果有錯誤,還請大佬們指正

參考:https://www.bilibili.com/video/BV1BW41187fL?t=2417
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/7931.html
標籤:Unity3D
上一篇:求教Unity控制介面的問題
