Använda pekoptimerade inmatningskontroller med skärmkontroll

Sidan uppdaterad :
Datum för skapande av sida :

Verifiering miljö

Windows
  • Fönster 11
Unity-redaktör
  • 2020.3.25F1
Paket för inmatningssystem
  • 1.2.0

Förutsättningar för det här tipset

Följande inställningar har gjorts i förväg som en förutsättning för beskrivningen av detta tips.

Du bör också känna till följande tips:

Om skärmkontroll för pekfunktioner

Jag använder ofta ett tangentbord eller gamepad för att spela spel. På enheter som bara kan manövreras genom beröring, till exempel smartphones, kommer du att spela spelet genom beröring.

Unitys inmatningssystempaket använder On-Screen Control för att simulera pekinteraktioner som om de styrdes av en kontroller.

Före kontrollen på skärmen

Den här artikeln är lite lång, men det här ämnet är inte direkt relaterat till Kontroll på skärmen. Om du kan använda inmatningssystempaketet i andra steg för att kontrollera ingången, till exempel en gamepad, är det bra.

I det här tipset skapar vi en åtgärdskarta. Beskriver hur du simulerar beröring av en gamepad som om du interagerade med den.

Förresten stöder den också metoden att använda klasser och Gamepad klasser i Keyboard skript istället för åtgärdskartor. Jag kommer inte att förklara det den här gången, men om du vill prova det med dessa klasser kan du förbereda koden som beskrivs på följande sida istället.

Placera först ett textobjekt på arbetsytan för att visa dina inmatningar. Senare kommer vi att placera beröringsobjektet längst ner, så lämna lite utrymme.

Skapa först en åtgärdskarta enligt följande: Du skapar samma åtgärd som du gjorde när du beskrev åtgärdskartan.

Eftersom förklaringen av åtgärdskartan inte är det viktigaste är bindningen enkel. Se följande sida för mer information om åtgärdskartor.

Den här gången utförs indatainhämtning med skript i stället för "Skicka meddelanden" eller "Anropa Unity-händelser". Detta är inte heller begränsat till skript, och det fungerar korrekt även om du använder "Skicka meddelanden" etc.

Kontrollera att du har genererat koden från åtgärdskartan.

Skriptet ser ut så här: Det är nästan samma som när man förklarar åtgärdskartan.

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}";
  }
}

Skriptet EventSystem är kopplat till .

Kör spelet för att se om det fungerar som en actionkarta.

Knappen på skärmen

Knappen Skärmläge simulerar att trycka på knappar på en spelkontroll, till exempel A och B, och tangenterna på tangentbordet när du trycker på något objekt på skärmen. Förresten, det står beröring, men det fungerar också med musklick.

Placera först knappen på skärmen. Eftersom du bara kopplar en komponent fungerar den med andra objekt än knappar.

Lägg till en Input > On-Screen Button från komponenten.

Ställ in gamepadens knapp österut från Control Path. Detta gör att det ser ut som om Button East på Gamepad trycktes in vid beröring.

Se till att Attack visas när du kör spelet och klicka på knappen. Om det är en beröringsbar enhet kan du bekräfta att den fungerar med beröring.

Styrpinne på skärmen

Med Skärmstyrspak kan du flytta objekt som pinnar med din touch. När du flyttar en pinne är det möjligt att simulera den som om du hade flyttat en gamepad-pinne. Förutom beröring är det också möjligt att flytta den med musen.

Placerar ett knappobjekt på skärmen som ska vara en pekpinne. Vi använder en knapp här, men den fungerar också med andra objekt än knappar.

Under Lägg till komponent väljer du Indata > Skärmstyrspak.

Från Kontrollsökväg väljer du Gamepad LeftStick som definierats i åtgärdskartan.

Kör spelet och försök dra Stick-knappen. Knapparna rör sig i en cirkel, som om de flyttar en pinne. Naturligtvis kan du också kontrollera att inmatningsinnehållet hämtas medan det körs.

I det här fallet har vi placerat en knapp, men det är också möjligt att få det att se ut som en virtuell pinne genom att placera en cirkulär ram och ett runt stickobjekt.

Förresten, detta rörliga intervall kan ändras i "Movement Range" på On-Screen Stick.