【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
4會員
10內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
就如同標題一樣,input的作用就是從使用者那裡獲取輸入,直到使用者輸入一段文本並按下 ENTER 鍵。 然而用戶輸入的數據(文本)都將作為字串被返回,並存儲在變數中。 接著我們舉個例,比如說我們在一段數據中需要獲取使用者的名稱,範例如下: name = input("請輸入你的名字:") #
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
介紹以物件導向的方式,以向量來實作物體運動的模擬程式。
Thumbnail
剩下兩週上課囉,大家加油!! 在一開始我們在課程完成了椅子(角色的移動嘛),但遠遠的看著他移動好像缺少了一些遊戲體驗 嗎?>< 這週我們就來改變遊戲的視角吧~~ 來看一下兩個版本的比較~~ 原本WASD AD控制Y軸旋轉(轉頭),後來改成WASD控制平移座標,把旋轉特別移出來到滑鼠上,
Thumbnail
上次我們完成用Unity 建完一張椅子,還有學習基本變數的應用,那我們就繼續寫更多的腳本來讓物體有更多的ㄅㄧㄢ #一般不會用Unity來建模啦,主要還是要靠其他3D軟體導入 ●Gravity Scale 重力預設為1,是造成物體下墜的主因,可以先調到0。 (Unity有支援負
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
建立幾個變數如下,最上面兩個變數值為清單值 接下來分別設定球1位置到左上角落、設定球2位置到右上角落、設定球3位置到左下角落、設定球4位置到右下角落 當螢幕初始化的時候,設定玩家球的X、Y座標和大小,並將玩家球的初始顏色,設定成(變數_顏色清單)中.....
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
就如同標題一樣,input的作用就是從使用者那裡獲取輸入,直到使用者輸入一段文本並按下 ENTER 鍵。 然而用戶輸入的數據(文本)都將作為字串被返回,並存儲在變數中。 接著我們舉個例,比如說我們在一段數據中需要獲取使用者的名稱,範例如下: name = input("請輸入你的名字:") #
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
介紹以物件導向的方式,以向量來實作物體運動的模擬程式。
Thumbnail
剩下兩週上課囉,大家加油!! 在一開始我們在課程完成了椅子(角色的移動嘛),但遠遠的看著他移動好像缺少了一些遊戲體驗 嗎?>< 這週我們就來改變遊戲的視角吧~~ 來看一下兩個版本的比較~~ 原本WASD AD控制Y軸旋轉(轉頭),後來改成WASD控制平移座標,把旋轉特別移出來到滑鼠上,
Thumbnail
上次我們完成用Unity 建完一張椅子,還有學習基本變數的應用,那我們就繼續寫更多的腳本來讓物體有更多的ㄅㄧㄢ #一般不會用Unity來建模啦,主要還是要靠其他3D軟體導入 ●Gravity Scale 重力預設為1,是造成物體下墜的主因,可以先調到0。 (Unity有支援負
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
建立幾個變數如下,最上面兩個變數值為清單值 接下來分別設定球1位置到左上角落、設定球2位置到右上角落、設定球3位置到左下角落、設定球4位置到右下角落 當螢幕初始化的時候,設定玩家球的X、Y座標和大小,並將玩家球的初始顏色,設定成(變數_顏色清單)中.....