使用滑鼠操作(輸入系統套件版本 )
驗證環境
- 窗戶
-
- 視窗 11
- 統一編輯器
-
- 2020.3.25f1
- 輸入系統包
-
- 1.2.0
此提示的先決條件
作為此提示描述的前提,已預先進行了以下設置。
獲取滑鼠位置
滑鼠在遊戲螢幕上的位置可以在 Mouse.position
中獲取。
在這裡,我想顯示位置資訊。
在畫布上放置一個顯示滑鼠資訊的文字物件。
滑鼠資訊通過腳本檢索。
在這種情況下,我們將創建一個在專案中 MouseInfo
調用的腳本檔。
按如下方式輸入文稿:
using System.Text; // 追加
using UnityEngine;
using UnityEngine.InputSystem; // 追加
using UnityEngine.UI; // 追加
public class MouseInfo : MonoBehaviour
{
<summary>情報を表示するテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
private StringBuilder Builder = new StringBuilder();
// 更新はフレームごとに1回呼び出されます
void Update()
{
if (TextObject == null)
{
Debug.Log($"{nameof(TextObject)} が null です。");
TextObject.text = "";
return;
}
var mouse = Mouse.current;
if (mouse == null)
{
Debug.Log("マウスがありません。");
TextObject.text = "";
return;
}
Builder.Clear();
// マウスの位置を取得する
Builder.AppendLine($"Mouse.position={mouse.position.ReadValue()}");
TextObject.text = Builder.ToString();
}
}
Mouse.current
您可以取得有關目前的活動滑鼠的資訊。
Mouse.position
具有滑鼠在 中的當前位置,因此ReadValue
您可以使用該方法Vector2Control
獲取窗體Vector2
中的值。
獲取的滑鼠位置設置為文字物件。
StringBuilder
不要太擔心使用 ,因為它是為了稍後添加。
保存文稿后 EventSystem
,將其附加到物件。
文字物件設置為要顯示有關資訊的文字物件。
嘗試運行遊戲並移動滑鼠。 我認為滑鼠位置會即時出現在螢幕上。
順便說一下,滑鼠位置的座標在遊戲螢幕的左下角是(0,0)。 X 軸(左和右)在您向右移動時變為正值,當您向左移動時變為負軸。 Y 軸(向上和向下)在您向上時變為正,在您向下時變為負。 因此,每個軸的最大值位於遊戲螢幕的右上角。
另外,請注意,此座標僅適用於遊戲螢幕空間,因此遊戲中的圖元大小與設備螢幕座標的圖元大小可能不匹配。
獲取滾輪的滾動量
使用滑鼠滾輪滾動也可以在腳本中檢索。
滾動量 Mouse.scroll
可以用 獲得。
與滑鼠位置不同,您只能立即滾動數量。
請注意,您無法瞭解滾動了多遠。
我會將其添加到我之前創建的 MouseInfo
滾動操作中。
// 省略
public class MouseInfo : MonoBehaviour
{
// 省略
<summary>スクロールした量を保持する。</summary>
private Vector2 ScrollValue = Vector2.zero;
// 更新はフレームごとに1回呼び出されます
void Update()
{
// 省略
// スクロール量を取得し保持する
ScrollValue += mouse.scroll.ReadValue();
Builder.Clear();
// マウスの位置を取得する
Builder.AppendLine($"Mouse.position={mouse.position.ReadValue()}");
// スクロール量を表示
Builder.AppendLine($"ScrollValue={ScrollValue}");
TextObject.text = Builder.ToString();
}
}
Mouse.current
沒有保持到目前為止滾動的金額,所以
定義一個專用欄位 ScrollValue
來保存滾動量。
Mouse.scroll
然後,您可以在該時刻獲得滾動金額,因此我們將累積該值。
例如,如果滾動滾輪兩次,將 ScrollValue
保留滾動兩次的量。
其餘的就是將此值顯示為文本。
現在運行遊戲並旋轉輪子。 我想你會看到滾動的數量。
Mouse.scroll
Vector2
的值為 ,但如果是僅垂直滾動輪,我認為只會設置 Y 的值。
順便說一下,如果您向下滾動,該值將以120個單位上下浮動。 這是 Windows 定義的值,因此該數位可能會根據其他環境和滑鼠類型而變化。
確定何時按下滑鼠按鈕
在這裡,我想移動一個示例,該示例在單擊滑鼠左鍵的位置顯示文字。
按兩下的時間可以由屬性確定,方法與鍵盤鍵相同 wasPressedThisFrame
。
首先,放置一個要移動的文字物件。 大小和位置合適。
為點擊過程創建腳本。 MouseButtonClick
將名稱保留為 。
文稿如下所示:
using UnityEngine;
using UnityEngine.InputSystem; // 追加
using UnityEngine.UI; // 追加
public class MouseButtonClick : MonoBehaviour
{
<summary>情報を表示するテキストオブジェクト。</summary>
[SerializeField] private Text TextObject;
[SerializeField] private Canvas CanvasObject;
<summary>Canvas の RectTransform の参照です。</summary>
private RectTransform CanvasRect;
// 最初のフレーム更新の前に開始が呼び出されます
void Start()
{
if (CanvasObject == null)
{
Debug.Log($"{nameof(CanvasObject)} が null です。");
return;
}
// Canvas から RectTransform を取得しておきます。
CanvasRect = CanvasObject.GetComponent<RectTransform>();
}
// 更新はフレームごとに1回呼び出されます
void Update()
{
if (TextObject == null)
{
Debug.Log($"{nameof(TextObject)} が null です。");
return;
}
if (CanvasObject == null)
{
Debug.Log($"{nameof(CanvasObject)} が null です。");
return;
}
var mouse = Mouse.current;
if (mouse == null)
{
Debug.Log("マウスがありません。");
return;
}
var transform = TextObject.transform;
// マウスの位置を取得する
var mousePosition = mouse.position.ReadValue();
// マウスの位置を Canvas の座標に変換する
var mouseOnCanvas = new Vector2(mousePosition.x - CanvasRect.sizeDelta.x / 2, mousePosition.y - CanvasRect.sizeDelta.y / 2);
// 左ボタンがクリックしたタイミングか判定
if (mouse.leftButton.wasPressedThisFrame)
{
transform.localPosition = mouseOnCanvas;
}
}
}
我執行將文字物件移動到按下位置的過程。 UI 物件的本地位置是畫布的座標,因此它與滑鼠的位置不同,滑鼠的位置是螢幕座標。
由於畫布的原點 (0, 0) 位於中心,RectTransform.sizeDelta
因此使用 獲得畫布大小的一半。
滑鼠座標的原點將移至中心。
您可以確定是否 mouse.xxxxxxxx.wasPressedThisFrame
按兩下,並僅在 true
按下時返回。
如果您按住該按鈕,它將繼續返回,直到您 false
再次按下它。
儲存文稿後 EventSystem
,將其附加到 。 這次,我們還將使用 Canvas,因此請設置 Canvas 和文本物件。
嘗試運行遊戲,看看文本物件是否移動到按下的位置。 由於它僅在按兩下時處理,因此即使您在按下時移動滑鼠,文字物件也不會移動。
確定何時釋放滑鼠按鈕
儘管它未作為示例列出, wasPressedThisFrame
但您可以使用 代替 來確定 wasReleasedThisFrame
發佈時間。
點擊按鈕時判斷
mouse.xxxxxxxx.isPressed
只要您按下該按鈕,就可以 true
繼續返回。
在這裡,我想在按右鍵的同時旋轉文本。
腳本從左鍵按下腳本轉移。 修改如下:
// 省略
public class MouseButtonClick : MonoBehaviour
{
// 省略
// 更新はフレームごとに1回呼び出されます
void Update()
{
// 省略
// 右ボタンを押している間はオブジェクトを回転させる
if (mouse.rightButton.isPressed)
{
transform.Rotate(0, 0, 1);
}
}
}
保存文稿后,運行它進行檢查。 只要按下右鍵,物件就會繼續旋轉。