【Unity】使用新版Input System在Unity中創建流暢的角色控制

2023/08/27閱讀時間約 10 分鐘

新版Input System

  1. 要先來調整設定:

(如果日後發現移動不了,可能是這邊有出問題,可以把這邊視為一個檢查點)

raw-image
  1. 下載Input System
raw-image
  1. 在script中的寫法:

(這邊的功能是讀取移動的值而已,主要目的是讓unity讀到movement,絕對不是托篇幅的拉🥺)

using UnityEngine.InputSystem; //這格式要自己興增的
move
public class PlayerControl : MonoBehaviour
{
[SerializeField] InputAction movement;
void Start(){}

private void OnEnable()
{
movement.Enable();
}
private void OnDisable()
{
movement.Disable();
}

// Update is called once per frame
void Updae()
{
float horizontalThrow = movement.ReadValue<Vector2>().x;
float verticalThrow = movement.ReadValue<Vector2>().y;
Debug.Log(horizontalThrow);
Debug.Log(verticalThrow);
}
}

可以看到上面的[SerializeField] InputAction movement;,在回到unity後,他會跑出Movement,選取“+”

raw-image
raw-image

這邊就視當下使用情況而定(我這邊是只要做到上下左右移動)

raw-image

選取完後,會跑出粉紅色的這些小東西,那就是你可以操控的選項。

  1. 接著要來設定每一個動作所觸發的按鍵:

(點選粉紅色小方塊)

raw-image

選擇”Path"

raw-image

選擇"listen",接這按你想要使用的按鍵,他會自動顯示出該按鍵的名稱,那就選擇她即可:

raw-image

寫到這邊,突然回憶到剛剛給的代碼中出現了這一段:

 private void OnEnable()
{
movement.Enable();
}
private void OnDisable()
{
movement.Disable();
}
  1. Order of execution for event functions

恩...,這樣乍看一下,大概就是OnEnable跟OnDisble決定了movement的啟用與否。這兩個方法函數必不是自創的,這邊就要來看到unity他的執行順序;

原文:https://docs.unity3d.com/Manual/ExecutionOrder.html

這邊我附上有使用到的兩個函數位置:

raw-image
raw-image

其實就是分別在初始化(Initialization)跟退役(Decommissioning)中去啟用跟進用movement,並在每一幀去重複這樣。


6. 寫移動的腳本

好拉,要來繼續說正事了,這邊附上代碼:

using UnityEngine;
using UnityEngine.InputSystem; //手動添加

public class PlayerControl : MonoBehaviour
{
[SerializeField] float speed = 10f; // 移动速度
[SerializeField] InputAction movement;

void Start()
{
movement.Enable();
}

private void OnDisable()
{
movement.Disable();
}

void Update()
{
Vector2 input = movement.ReadValue<Vector2>();
float horizontalInput = input.x;
float verticalInput = input.y;

// 根据输入计算移动距离
float xOffset = horizontalInput * Time.deltaTime * speed;
float yOffset = verticalInput * Time.deltaTime * speed;

// 更新位置
transform.localPosition = new Vector3(xOffset, yOffset, transform.localPosition.z);
}
}
  1. 增加移動範圍限制:

其實這邊是另外加的拉~,如果你希望物體在移動範圍可以有一個限制(這邊是指物體本身移動限制,而非在在場景給予的限制),可以使用Mathf.Clamp()

官方文件:https://docs.unity3d.com/ScriptReference/Mathf.Clamp.html

raw-image

用法就是如上面所寫:

限制範圍 = Mathf.Clamp(目標物, 最小範圍, 最大範圍);

那把他應用進來:(newXPos跟 newYPos)

using UnityEngine;
using UnityEngine.InputSystem; //手動添加

public class PlayerControl : MonoBehaviour
{
[SerializeField] float speed = 10f; // 移动速度
[SerializeField] float xRange = 5f; // X轴移动范围
[SerializeField] float yRange = 5f; // Y轴移动范围
[SerializeField] InputAction movement;

void Start()
{
movement.Enable();
}

private void OnDisable()
{
movement.Disable();
}

void Update()
{
Vector2 input = movement.ReadValue<Vector2>();
float horizontalInput = input.x;
float verticalInput = input.y;

// 根据输入计算移动距离
float xOffset = horizontalInput * Time.deltaTime * speed;
float yOffset = verticalInput * Time.deltaTime * speed;

// 计算新的位置,并限制在范围内
float newXPos = Mathf.Clamp(transform.localPosition.x + xOffset, -xRange, xRange);
float newYPos = Mathf.Clamp(transform.localPosition.y + yOffset, -yRange, yRange);

// 更新位置
transform.localPosition = new Vector3(newXPos, newYPos, transform.localPosition.z);
}
}

舊版Input System

舊版的好處就是一定不會有問題拉~

//處理上下左右移動
void ProcessTranslation()
{
//控制水平方向
horizontalThrow = Input.GetAxis("Horizontal");
float xOffset = horizontalThrow * Time.deltaTime * SpeedControl;
float newXPos = transform.localPosition.x + xOffset;
float clampXPos = Mathf.Clamp(newXPos, -xRange, xRange);

//控制垂直方向
verticalThrow = Input.GetAxis("Vertical");
float yOffset = verticalThrow * Time.deltaTime * SpeedControl;
float newYPos = transform.localPosition.y + yOffset; // 修正这里使用 transform.localPosition.y
float clampYPos = Mathf.Clamp(newYPos, -yRange, yRange);

transform.localPosition = new Vector3(clampXPos, clampYPos, transform.localPosition.z);

}


🥰以上是本文所分享的內容。如果您發現任何錯誤或遺漏,請不吝賜教。




3會員
10內容數
留言0
查看全部
發表第一個留言支持創作者!
從 Google News 追蹤更多 vocus 的最新精選內容