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

更新於 發佈於 閱讀時間約 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);

}


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




留言
avatar-img
留言分享你的想法!
avatar-img
W. C. Chen的沙龍
4會員
10內容數
W. C. Chen的沙龍的其他內容
2024/03/27
先來名詞解釋jython跟JES: jython是一種實現了Python語言的Java平台版本的解釋器。它允許開發人員在Java虛擬機(JVM)上運行Python代碼,從而實現了Python語言與Java平台的無縫集成。 JES(Jython Environment for Students)是
Thumbnail
2024/03/27
先來名詞解釋jython跟JES: jython是一種實現了Python語言的Java平台版本的解釋器。它允許開發人員在Java虛擬機(JVM)上運行Python代碼,從而實現了Python語言與Java平台的無縫集成。 JES(Jython Environment for Students)是
Thumbnail
2024/03/25
ETL是資料倉儲領域中一個重要的概念,全稱為Extract-Transform-Load,中文可譯為"抽取-轉換-載入"。ETL的作用是將來自不同來源的資料抽取出來,經過清理、轉換、整合等處理後,最終將處理好的資料載入到資料倉儲或其他單一的資料存放區
Thumbnail
2024/03/25
ETL是資料倉儲領域中一個重要的概念,全稱為Extract-Transform-Load,中文可譯為"抽取-轉換-載入"。ETL的作用是將來自不同來源的資料抽取出來,經過清理、轉換、整合等處理後,最終將處理好的資料載入到資料倉儲或其他單一的資料存放區
Thumbnail
2023/08/29
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
2023/08/29
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
看更多
你可能也想看
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
新版Input System 要先來調整設定: (如果日後發現移動不了,可能是這邊有出問題,可以把這邊視為一個檢查點) 下載Input System 在script中的寫法: (這邊的功能是讀取移動的值而已,主要目的是讓unity讀到movement,絕對不是托篇幅的拉🥺) using
Thumbnail
新版Input System 要先來調整設定: (如果日後發現移動不了,可能是這邊有出問題,可以把這邊視為一個檢查點) 下載Input System 在script中的寫法: (這邊的功能是讀取移動的值而已,主要目的是讓unity讀到movement,絕對不是托篇幅的拉🥺) using
Thumbnail
這篇文章將會講述 Unity 自帶參數的功能,在撰寫時要怎麼進行封裝。
Thumbnail
這篇文章將會講述 Unity 自帶參數的功能,在撰寫時要怎麼進行封裝。
Thumbnail
這篇文章將會講述如何使用程式腳本讀取 Input System 的玩家輸入。
Thumbnail
這篇文章將會講述如何使用程式腳本讀取 Input System 的玩家輸入。
Thumbnail
UnityEvent 簡單介紹。
Thumbnail
UnityEvent 簡單介紹。
Thumbnail
這篇文章將會介紹 Unity Input System,這是一個適用於不同平台切換的官方系統,用於玩家按鍵輸入與不同控制器的操作。
Thumbnail
這篇文章將會介紹 Unity Input System,這是一個適用於不同平台切換的官方系統,用於玩家按鍵輸入與不同控制器的操作。
Thumbnail
這篇文章將會介紹 Unity Animatior Edit 參數控制的方法,藉由連結程式腳本和動畫編輯器,讓動畫更靈活的運作。
Thumbnail
這篇文章將會介紹 Unity Animatior Edit 參數控制的方法,藉由連結程式腳本和動畫編輯器,讓動畫更靈活的運作。
Thumbnail
這篇文章將會介紹官方設置好的偵測玩家輸入,在撰寫遊戲程式的時候肯定需要偵測玩家輸入,其實並不需要自行撰寫程式來監控玩家操作,而是直接調閱官方的資料庫即可。
Thumbnail
這篇文章將會介紹官方設置好的偵測玩家輸入,在撰寫遊戲程式的時候肯定需要偵測玩家輸入,其實並不需要自行撰寫程式來監控玩家操作,而是直接調閱官方的資料庫即可。
Thumbnail
本篇文章是Unity Component系列中的第一篇,將會介紹Unity Component中UGUI的Button的各項目介紹,不包含應用。
Thumbnail
本篇文章是Unity Component系列中的第一篇,將會介紹Unity Component中UGUI的Button的各項目介紹,不包含應用。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News