unity中第三人稱下使用手柄控制角色移動
本文建議結合這一篇文章觀看:
https://blog.csdn.net/qq_45919090/article/details/109393562
unity2017及以上的版本在插入手柄時unity會自動識別手柄,其默認的輸入方式及按鍵配置可以在Edit–>Project Settings–>Input中的Inspector面板中找到并可進行自定義修改,為了與鍵盤及滑鼠的輸入方式區分,我們做如下設定:
左搖桿:


右搖桿:


十字鍵:

LT和RT:

其按鍵若不清楚其代號,可以通過以下腳本進行按鍵檢測:
public class GetKeyValue : MonoBehaviour {
public float speed = 10.0F;
public float rotationSpeed = 100.0F;
void Update()
{
detectPressedKeyOrButton();
}
public void detectPressedKeyOrButton()
{
foreach (KeyCode kcode in System.Enum.GetValues(typeof(KeyCode)))
{
if (Input.GetKeyDown(kcode))
Debug.Log("KeyCode down: " + kcode);
}
}
}
可以得到:
| 按鍵 | 代號 | 按鍵 | 代號 |
|---|---|---|---|
| A | JoystickButton0 | RB | JoystickButton5 |
| B | JoystickButton1 | Back | JoystickButton6 |
| X | JoystickButton2 | Start | JoystickButton7 |
| Y | JoystickButton3 | 左搖桿按下 | JoystickButton8 |
| LB | JoystickButton4 | 右搖桿按下 | JoystickButton9 |
實作角色按搖桿方向移動
(注:以下腳本的系結物件為游戲角色即Charactor)
對于場景中的角色Charactor,想要改變其移動的方向,就需要改變其旋轉角度,這里可以用區域歐拉角LocalEulerAngles,但如果直接把搖桿回傳的向量(L_H,0,L_V)賦值給charactor.forward會在鏡頭發生旋轉后方向錯亂,這里使用的方法是創建一個空物體forward,使forwa.position等于charactor.position,再把手柄回傳的向量賦值給forward的前方向,
在文章開頭放出的帖子中,可以得到用于控制相機的的兩個父物體Empty和Position,為了實作旋轉,可以做如下設定,
定義一個方法,使forward的位置等于角色的位置,使forward的forward方向等于手柄的向量,最后讓角色的LocalEulerAngles等于empty的區域歐拉角加上forward的區域歐拉角
private void ApplyRotate()
{
forward.position = transform.position;
//forward.forward = new Vector3(L_H, 0, L_V);
forward.forward = Vector3.Lerp(forward.forward, new Vector3(L_H, 0, L_V), 0.3f);
transform.localEulerAngles = empty.localEulerAngles + forward.localEulerAngles;
}
接著獲取手柄向量使角色移動,在角色的狀態機中做如下設定:


方法不唯一,切換條件可以根據自己的影片進行設定,也可以直接使用混合樹進行計算
Move方法如下,寫法也不唯一,此處是為了讓手柄的左搖桿按下時角色可以在行走及奔跑狀態間切換
void Move()
{
if (Mathf.Abs(L_H) > 0.02f || Mathf.Abs(L_V) > 0.02f)
{
if (Input.GetKeyDown(KeyCode.JoystickButton8))
{
if (anim.GetFloat("Speed") < 2)
{
anim.SetFloat("Speed", 5);
ApplyRotate();
shift = true;
anim.SetBool("IsShift", shift);
}
else if (anim.GetFloat("Speed") > 4.8f)
{
anim.SetFloat("Speed", 1.4f);
ApplyRotate();
shift = false;
anim.SetBool("IsShift", shift);
}
}
else
{
if (anim.GetFloat("Speed") > 4.8f)
{
anim.SetFloat("Speed", 5);
ApplyRotate();
shift = true;
anim.SetBool("IsShift", shift);
}
else if (anim.GetFloat("Speed") < 2)
{
anim.SetFloat("Speed", 1.4f);
ApplyRotate();
shift = false;
anim.SetBool("IsShift", shift);
}
}
}
else
{
anim.SetFloat("Speed", 0);
}
}
在Update中呼叫方法即可
void Update()
{
L_H = Input.GetAxis("Horizontal_Left");
L_V = Input.GetAxis("Vertical_Left");
shift = false;
Move();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/200120.html
標籤:python
上一篇:概率dp習題
下一篇:食品溯源智能合約開發(完整版)
