将触摸优化的输入控件与屏幕控制结合使用

更新页 :
页面创建日期 :

验证环境

窗户
  • 视窗 11
统一编辑器
  • 2020.3.25f1
输入系统包
  • 1.2.0

此提示的先决条件

作为此提示描述的前提,已预先进行了以下设置。

您还应该熟悉以下提示:

关于触摸屏幕控制

我经常使用键盘或游戏手柄玩游戏。 在只能通过触摸操作的设备(例如智能手机)上,您将通过触摸玩游戏。

Unity 的输入系统包使用屏幕控制来模拟触摸交互,就像它们由控制器控制一样。

屏幕控制之前

本文有点长,但本主题与屏幕控制没有直接关系。 如果可以在其他步骤中使用输入系统包来检查输入,例如游戏手柄,那很好。

在此提示中,我们将创建一个操作地图。 介绍如何模拟触摸游戏手柄,就好像您正在与游戏手柄交互一样。

顺便说一下,它还支持在脚本中使用 Keyboard 类和 Gamepad 类而不是操作映射的方法。 这次我不会解释它,但如果你想用这些类尝试一下,你可以准备下一页描述的代码。

首先,在画布上放置一个文本对象以显示您的输入。 稍后,我们将触摸对象放在底部,因此请留出一些空间。

首先,创建操作映射,如下所示: 您正在创建的操作与描述操作映射时相同的操作。

由于操作图的解释不是主要内容,因此绑定很简单。 有关操作地图的详细信息,请参阅以下页面。

这一次,输入采集是通过脚本而不是“发送消息”或“调用 Unity 事件”执行的。 这也不仅限于脚本,即使您使用“发送消息”等,它也能正常工作。

确保已从操作映射生成代码。

脚本如下所示: 这与解释操作地图时几乎相同。

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class InputActionScript : MonoBehaviour
{
  /// <summary>情報を表示させるテキストオブジェクト。</summary>
  [SerializeField] private Text TextObject;

  /// <summary>アクションマップから自動生成されたクラス。</summary>
  private InputActionSample _actionMap;

  private void Awake()
  {
    // 各操作を行ったときに呼ばれるイベントを設定する
    _actionMap = new InputActionSample();
    _actionMap.Action2D.Move.performed += context => OnMove(context);
    _actionMap.Action2D.Attack.performed += context => OnAttack(context);
    _actionMap.Action2D.Move.canceled += context => OnMove(context);
    _actionMap.Action2D.Attack.canceled += context => OnAttack(context);
  }

  private void OnEnable()
  {
    // このオブジェクトが有効になったときにアクションマップを有効にする
    _actionMap.Enable();
  }

  private void OnDisable()
  {
    // このオブジェクトが無効になったときにアクションマップが余計な動作を起こさないように無効にする
    _actionMap.Disable();
  }

  /// <summary>
  /// Move 操作をした時に呼ばれるメソッドです。
  /// </summary>
  /// <param name="context">コールバックパラメータ。</param>
  public void OnMove(InputAction.CallbackContext context)
  {
    // Move の入力量を取得
    var vec = context.ReadValue<Vector2>();
    TextObject.text = $"Move:({vec.x:f2}, {vec.y:f2})\n{TextObject.text}";
  }

  /// <summary>
  /// Attack 操作をした時に呼ばれるメソッドです。
  /// </summary>
  /// <param name="context">コールバックパラメータ。</param>
  public void OnAttack(InputAction.CallbackContext context)
  {
    // Attack ボタンの状態を取得
    var value = context.ReadValueAsButton();
    TextObject.text = $"Attack:{value}\n{TextObject.text}";
  }
}

脚本 EventSystem 附加到 。

运行游戏以查看它是否可用作操作地图。

屏幕按钮

屏幕按钮模拟按下游戏手柄上的按钮(如 A 和 B)以及触摸屏幕上某些对象时的键盘上的键。 顺便说一下,它说触摸,但它也适用于鼠标点击。

首先将按钮放在屏幕上。 由于您只是附加一个组件,因此它适用于按钮以外的对象。

从组件添加输入>屏幕按钮。

从控制路径向东设置游戏手柄的按钮。 这使得触摸游戏手柄上的“东键”看起来好像被按下了。

确保在运行游戏并单击按钮时出现攻击。 如果是可触摸设备,您可以确认它是否适用于触摸。

屏幕摇杆

屏幕摇杆可让您通过触摸移动物体,例如摇杆。 当您移动摇杆时,可以像移动游戏手柄一样模拟它。 除了触摸之外,还可以用鼠标移动它。

在屏幕上放置一个按钮对象,该对象将成为触摸杆。 我们在这里使用按钮,但它也适用于按钮以外的对象。

在“添加组件”下,选择“输入>屏幕摇杆”。

从“控制路径”中,选择操作映射中定义的游戏板左摇杆。

运行游戏并尝试拖动“摇杆”按钮。 按钮绕圈移动,就像移动棍子一样。 当然,您也可以检查输入内容是否在运行时被获取。

在这种情况下,我们放置了一个按钮,但也可以通过放置圆形框架和圆形摇杆对象来使其看起来像虚拟摇杆。

顺便说一下,这个可移动范围可以在屏幕摇杆的“移动范围”中更改。