Brug berøringsoptimerede inputkontroller med Kontrol på skærmen

Side opdateret :
Dato for oprettelse af side :

Miljø til bekræftelse

Windows
  • Windows 11
Enhedslistens redaktør
  • 2020.3.25f1
Input System Pakke
  • 1.2.0

Forudsætninger for dette tip

Følgende indstillinger er foretaget på forhånd som en forudsætning for beskrivelsen af dette tip.

Du bør også være bekendt med følgende tips:

Om kontrol på skærmen til berøring

Jeg bruger ofte et tastatur eller gamepad til at spille spil. På enheder, der kun kan betjenes ved berøring, såsom smartphones, spiller du spillet ved berøring.

Unitys inputsystempakke bruger On-Screen Control til at simulere berøringsinteraktioner, som om de blev styret af en controller.

Før kontrol på skærmen

Denne artikel er lidt lang, men dette emne er ikke direkte relateret til kontrol på skærmen. Hvis du kan bruge inputsystempakken i andre trin til at kontrollere input, såsom en gamepad, er det fint.

I dette tip opretter vi et handlingskort. Beskriver, hvordan du simulerer berøring af en gamepad, som om du interagerede med den.

Forresten understøtter den også metoden til at bruge klasser og Gamepad klasser i scripts i Keyboard stedet for handlingskort. Jeg vil ikke forklare det denne gang, men hvis du vil prøve det med disse klasser, kan du forberede koden beskrevet på den følgende side i stedet.

Først skal du placere et tekstobjekt på lærredet for at få vist dine input. Senere placerer vi berøringsobjektet i bunden, så lad lidt plads.

Opret først en handlingsoversigt som følger: Du opretter den samme handling, som du gjorde, da du beskrev handlingsoversigten.

Da forklaringen af handlingskortet ikke er det vigtigste, er bindingen enkel. Se følgende side for detaljer om handlingskort.

Denne gang udføres inputindsamling ved hjælp af script i stedet for "Send meddelelser" eller "Invoke Unity Events". Dette er heller ikke begrænset til scripts, og det fungerer korrekt, selvom du bruger "Send beskeder" osv.

Sørg for, at du har genereret koden fra handlingsoversigten.

Scriptet ser sådan ud: Det er næsten det samme som når man forklarer handlingskortet.

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

Scriptet EventSystem er knyttet til .

Kør spillet for at se, om det fungerer som et actionkort.

Knap på skærmen

Skærmknappen simulerer tryk på knapper på en gamepad, såsom A og B, og tasterne på tastaturet, når du rører ved et objekt på skærmen. Forresten siger det berøring, men det fungerer også med museklik.

Placer først knappen på skærmen. Da du bare vedhæfter en komponent, fungerer den med andre objekter end knapper.

Tilføj en input- > skærmknap fra komponenten.

Indstil gamepadens knap øst fra kontrolstien. Dette får det til at se ud som om Button East på Gamepad blev trykket ned, når der blev rørt ved det.

Sørg for, at Attack vises, når du kører spillet, og klik på knappen. Hvis det er en enhed, der kan røres ved, kan du bekræfte, at den fungerer med berøring.

Styrepind på skærmen

Med On-Screen Stick kan du flytte objekter som pinde med din berøring. Når du flytter en pind, er det muligt at simulere den, som om du havde flyttet en gamepad-pind. Ud over berøring er det også muligt at flytte det med musen.

Placerer et knapobjekt på skærmen, der vil være en berøringspind. Vi bruger en knap her, men den fungerer også med andre objekter end knapper.

Under Tilføj komponent skal du vælge Input > On-Screen Stick.

Fra Control Path skal du vælge Gamepad LeftStick, der er defineret i handlingskortet.

Kør spillet, og prøv at trække Stick-knappen. Knapperne bevæger sig i en cirkel, som om du flytter en pind. Selvfølgelig kan du også kontrollere, at inputindholdet hentes, mens det kører.

I dette tilfælde har vi placeret en knap, men det er også muligt at få det til at ligne en virtuel pind ved at placere en cirkulær ramme og en rund pindobjekt.

Forresten kan dette bevægelige område ændres i "Movement Range" på On-Screen Stick.