使用鼠标操作(输入系统包版本)
验证环境
- 窗户
-
- 视窗 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);
}
}
}
保存脚本后,运行它进行检查。 只要按下右键,对象就会继续旋转。