使用鼠标操作(输入系统包版本)

更新页 :
页面创建日期 :

验证环境

窗户
  • 视窗 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.scrollVector2的值为 ,但如果是仅垂直滚动轮,我认为只会设置 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);
    }
  }
}

保存脚本后,运行它进行检查。 只要按下右键,对象就会继续旋转。