How do I set mobile movement control schemes for Roblox?

Touch Input i Unity: Din Komplette Guide

13/04/2022

Rating: 3.95 (5124 votes)

I en verden domineret af smartphones, tablets og touch-aktiverede skærme er evnen til at håndtere touch input afgørende for succesfuld spiludvikling. Uanset om du skaber et afslappet mobilspil, en fængslende VR-oplevelse eller en interaktiv applikation, er forståelsen af, hvordan touch input fungerer i Unity, helt essentiel. Denne omfattende guide vil dykke ned i touch input, udforske dets mekanismer, hvordan man implementerer det, og hvordan man præcist bestemmer, hvor en berøring fandt sted, og hvilket spilobjekt den korresponderer med. Målet er at give dig de værktøjer, du skal bruge for at skabe virkeligt intuitive og engagerende brugeroplevelser.

What is touch input in Unity?
In Unity, touch input refers to the interaction between a user’s finger (s) and the screen of a mobile device, tablet, or any touch-enabled platform. In Unity, touch input is captured using the Input class, which provides methods to detect touch events.

Touch input refererer til interaktionen mellem en brugers finger(e) og en enheds skærm. I Unity fanges denne input primært ved hjælp af Input-klassen, som leverer en række metoder til at detektere og behandle berøringshændelser. Dette system er fundamentet for al touch-baseret interaktion i Unity og giver udviklere mulighed for at reagere på en lang række brugerhandlinger.

Indholdsfortegnelse

Forstå Touch Input i Unity

Unitys Input-klasse er dit primære værktøj til at arbejde med touch input. Den giver adgang til information om aktive berøringer, deres positioner, bevægelser og faser. Forestil dig det som en bro mellem brugerens fysiske berøring på skærmen og din spilkode. Ved at udnytte denne klasse kan du omsætte fingertryk til meningsfulde spilhandlinger.

Typer af Touch Input

Unity understøtter grundlæggende to hovedtyper af touch input, som hver især er afgørende for forskellige former for interaktioner:

  • Single-Touch Input: Dette involverer detektering af et enkelt berøringspunkt. Det bruges typisk i simple interaktioner som at trykke på en knap, trække et enkelt objekt, eller udføre en simpel swipe-bevægelse. Det er fundamentet for mange grundlæggende mobilspil.
  • Multi-Touch Input: Dette giver mulighed for detektering og sporing af flere berøringspunkter samtidigt. Multi-touch er uundværligt for komplekse gestus som at knibe for at zoome ind/ud, rotere objekter med to fingre, eller styre flere karakterer på én gang. Det åbner op for en verden af rigere og mere dynamiske brugeroplevelser.

Registrering af Touch Input og Position

For at detektere touch input skal du skrive et script, der lytter efter berøringshændelser i Unity. Kernen i dette er Input.touchCount-egenskaben, som fortæller dig, hvor mange fingre der i øjeblikket rører skærmen. Hvis Input.touchCount er større end nul, er der mindst én aktiv berøring. Du kan derefter få adgang til individuelle berøringer ved hjælp af Input.GetTouch(index), hvor index typisk er 0 for den første berøring.

Når du har et Touch-objekt, er et af de vigtigste aspekter dens position. Her er det vigtigt at forstå forskellen mellem touch.position og Camera.main.ScreenToWorldPoint(touch.position):

  • touch.position: Denne egenskab returnerer berøringspunktets position i skærmkoordinater. Det er en todimensionel vektor (Vector2), der repræsenterer koordinaterne for berøringsinputtet i forhold til skærmens dimensioner. Skærmens nederste venstre hjørne er (0,0), og øverste højre hjørne er (Screen.width, Screen.height). Denne position tager ikke højde for spilverdenen eller kameraets perspektiv. Den er ideel til UI-interaktioner eller simple 2D-spil, hvor skærmkoordinater direkte kan bruges.
  • Camera.main.ScreenToWorldPoint(touch.position): Denne metode tager skærmkoordinaterne (touch.position) og konverterer dem til verdenskoordinater. Camera.main refererer til hovedkameraet i scenen, og ScreenToWorldPoint er en metode leveret af Unity til at konvertere skærmkoordinater til verdenskoordinater. Den resulterende position er en Vector3 i verdenskoordinater, der repræsenterer berøringens 3D-position inden for spilverdenen. Dette er afgørende for at interagere med spilobjekter i en 3D-scene.

For de fleste 2D-spil, der bruger et ortografisk kamera, er der ofte en direkte mapping mellem skærmrum og verdensrum, hvor 1 enhed i verdensrummet svarer til 1 enhed på skærmen. Dette betyder, at i mange simple 2D-spil kan du direkte bruge skærmkoordinater uden nødvendigvis at skulle konvertere dem til verdenskoordinater via ScreenToWorldPoint, medmindre du har specifikke kameraopsætninger eller behov.

Egenskaber for Touch-objekter

Hvert Touch-objekt, du får fra Input.GetTouch(), indeholder flere nyttige egenskaber, der giver detaljeret information om berøringen:

  • position: Som nævnt, skærmpositionen hvor berøringen fandt sted.
  • deltaPosition: Ændringen i position fra forrige frame. Dette er utroligt nyttigt til at detektere bevægelse, såsom træk- eller swipe-gestus.
  • phase: Fasen af berøringen (Began, Moved, Stationary, Ended, Canceled). Dette er afgørende for at spore en berøringshændelses livscyklus.
  • fingerId: En unik identifikator for berøringen. Dette er vigtigt i multi-touch scenarier, da det giver dig mulighed for at differentiere mellem forskellige fingre, der rører skærmen samtidigt.

Touch-faser: Livscyklussen af en Berøring

For at håndtere touch input effektivt i Unity er det vigtigt at forstå de forskellige faser, en berøring kan gennemgå. Disse faser hjælper dig med at spore hele livscyklussen for en berøringshændelse og reagere passende:

  • Began: Denne fase opstår, når en bruger først rører skærmen. Det repræsenterer starten på en berøringshændelse. I denne fase kan du fange den oprindelige position af berøringen, igangsætte handlinger eller animationer, og bestemme, hvilket spilobjekt der blev berørt. Tænk på det som et 'klik' eller 'tryk ned'.
  • Moved: Denne fase opstår, når brugeren trækker fingeren hen over skærmen efter at have initieret berøringen (Began-fasen). I denne fase kan du kontinuerligt spore berøringens position, mens den bevæger sig. Du kan bruge denne fase til handlinger som at trække objekter, scrolle, eller styre en karakter, der følger fingeren.
  • Stationary: Denne fase bruges til at detektere, når en berøring forbliver i en fast position uden bevægelse. Denne fase bruges ofte til at detektere lange tryk (long-press) eller 'hold-nede' handlinger, hvor en handling udløses, hvis fingeren forbliver stille i et bestemt tidsrum.
  • Ended: Denne fase opstår, når brugeren løfter fingeren fra skærmen, hvilket indikerer slutningen på berøringshændelsen. I denne fase kan du udføre afsluttende handlinger, såsom at aktivere en knap, frigive et trukket objekt, eller afslutte en interaktion. Tænk på det som et 'slip' eller 'klik op'.
  • Canceled: Denne fase opstår, når berøringen afbrydes af systemet, f.eks. hvis et opkald kommer ind, eller brugeren skifter applikation. Det er vigtigt at håndtere denne fase for at undgå uønsket adfærd, da spillet muligvis skal nulstille tilstanden relateret til den afbrudte berøring.

Ved at bruge disse faser kan du præcist styre, hvordan dit spil reagerer på forskellige stadier af en berøringshændelse. I multi-touch scenarier vil hver berøring have sin egen fase, hvilket giver dig fuld kontrol over komplekse interaktioner.

Detektering af Berørte Spilobjekter

At vide, hvor skærmen blev berørt, er kun halvdelen af historien. Ofte vil du også vide, hvilket spilobjekt der blev berørt. Dette kan opnås ved at bruge Unitys fysiksystem og raycasting. For at dette skal fungere, skal dine spilobjekter have tilknyttede collidere (enten 2D eller 3D).

  • For 3D-spil: Du kan kaste en Ray fra kameraets position gennem berøringspunktet på skærmen og ind i spilverdenen. Ved hjælp af Physics.Raycast() kan du tjekke, om strålen rammer en collider. Hvis den gør det, kan du få adgang til det ramte objekt via RaycastHit-objektet.
  • For 2D-spil: Tilsvarende kan du bruge Physics2D.Raycast(). Denne metode fungerer på samme måde, men er optimeret til 2D-fysik og kræver 2D-collidere. Du kan specificere en startposition, en retning og en længde for strålen.

Denne teknik giver dig mulighed for at bygge interaktive elementer, hvor spillere kan vælge objekter, udløse begivenheder eller manipulere elementer direkte ved at røre dem på skærmen.

Multi-touch i Praksis

Som nævnt tidligere giver multi-touch dig mulighed for at detektere og behandle mere end én berøring samtidigt. Unitys Input-system gør det relativt nemt at håndtere dette. Du itererer simpelthen gennem alle aktive berøringer ved hjælp af Input.touchCount. For hver berøring kan du få adgang til dens egenskaber og fase individuelt. Dette muliggør avancerede styringer, som at flytte en karakter med én finger og skyde med en anden, eller implementere gestus som pinch-to-zoom, hvor du overvåger to fingres position og afstand til hinanden.

Et klassisk eksempel er en karaktercontroller, der bevæger sig ved at følge den første finger, men skyder, når to fingre rører skærmen samtidigt. Ved at kontrollere Input.touchCount kan du differentiere mellem disse scenarier og udløse forskellige handlinger baseret på antallet af aktive berøringer.

Touch vs. Mus: Valg af den Perfekte Inputmetode for Dit Unity Spil

I Unity kan du bruge musebegivenheder til at simulere touch input til test- og udviklingsformål, især når du arbejder i Unity Editor. Det er dog afgørende at forstå de grundlæggende forskelle mellem touch-begivenheder, musebegivenheder og Input.GetMouseButtonDown for at vælge den rigtige metode til din specifikke platform og interaktionstype.

Touch-begivenheder

  • Anvendelse: Primært til at håndtere touch input på touchscreen-enheder som smartphones og tablets.
  • Enheder: Designet specifikt til touchscreens.
  • Eksempel: Flyt en karakter, swipe gennem menuer, eller knib for at zoome i et mobilspil. Essentielt for en god brugeroplevelse på mobile enheder.

Musebegivenheder (f.eks. OnMouseDown, OnMouseDrag, OnMouseUp)

  • Anvendelse: Indbyggede Unity-begivenhedsfunktioner til at håndtere museinteraktioner inden for Unity Editor og i nogle tilfælde i standalone applikationer. Disse begivenheder er forbundet med spilobjekter, der har Collider-komponenter.
  • Enheder: Designet til traditionelle computerinputenheder med mus.
  • Eksempel: Simulere touch-interaktioner i Unity Editor, eller specifikke interaktioner med musebaseret input i desktopspil.

Input.GetMouseButtonDown

  • Anvendelse: En metode, der bruges til programmatisk at detektere museknapklik i dine scripts. Du angiver, hvilken museknap du tjekker (f.eks. 0 for venstre museknap).
  • Enheder: Fungerer med traditionelle museenheder.
  • Eksempel: Udløs handlinger baseret på museknapinput i både Unity Editor og standalone applikationer, uafhængigt af specifikke collidere.

Sammenligning: Touch vs. Mus Input

Input MetodePrimær AnvendelseFordeleUlemper/Overvejelser
Touch Events (f.eks. Input.GetTouch)Mobil (iOS, Android), VRMulti-touch support, naturlig for touch-enheder, gestus-genkendelseKræver fysisk touch-enhed til fuld test, kan være mere komplekst at implementere gestus
Mouse Events (f.eks. OnMouseDown)Unity Editor test, Desktop spilNem at bruge for objekter med Colliders, god til enkle 'klik' interaktionerSimulerer kun én 'finger', begrænset til objekter med Colliders, ikke egnet til multi-touch
Input.GetMouseButtonDownGenerel muse-input check i scriptsFleksibel, kan bruges overalt, ikke bundet til CollidersSimulerer kun én 'finger', kræver manuel positionering, ikke egnet til multi-touch

Valget mellem touch-begivenheder, musebegivenheder og Input.GetMouseButtonDown afhænger af din målplatform, den type interaktioner, du ønsker at håndtere, og om du arbejder i Unity Editor eller en standalone applikation. Hver metode har sine specifikke anvendelsestilfælde, og valget afhænger af dit projekts krav.

Unity's Event System for UI-interaktioner

Udover den grundlæggende Input-klasse tilbyder Unity også et kraftfuldt Event System. Dette er et framework, der håndterer inputbegivenheder i en Unity-applikation og er særligt vigtigt for at skabe interaktive brugergrænseflader (UI) og gameplay-interaktioner på tværs af platforme. Event Systemet er designet til at give en robust og fleksibel måde at reagere på brugerinput, uanset om det kommer fra mus, touch eller keyboard.

Nøglepunkter om Event Systemet:

  • UI Begivenhedshåndtering: Et af de primære formål med Event Systemet er at håndtere begivenheder relateret til UI-elementer som knapper, sliders, tekstfelter og mere.
  • Begivenhedsgrænseflader (Event Interfaces): Unity leverer flere begivenhedsgrænseflader (f.eks. IPointerClickHandler, IPointerEnterHandler, IDragHandler). Du kan implementere disse grænseflader i dine scripts for at reagere på forskellige brugerinteraktioner, hvilket giver en ren og modulopbygget tilgang til eventhåndtering.
  • Cross-Platform Support: Event Systemet er designet til at fungere på tværs af forskellige platforme, herunder PC, mobil og VR-enheder, hvilket sikrer, at dine interaktioner fungerer konsekvent overalt.

Drag-and-Drop med Event Interfaces

For at implementere drag-and-drop-funktionalitet, især for UI-elementer, er IBeginDragHandler, IDragHandler og IEndDragHandler uundværlige grænseflader. Disse er designet til at arbejde problemfrit med UI-elementer som knapper, billeder og paneler:

  • IBeginDragHandler: Bruges til at detektere starten af en trækoperation, når et UI-element klikkes (eller berøres). Implementer denne, når du vil udføre opsætning eller initialisering, f.eks. at fremhæve et objekt, når brugeren begynder at trække det.
  • IDragHandler: Bruges til at detektere kontinuerlig trækning af et UI-element. Denne kaldes hver frame, mens UI-elementet trækkes. Implementer denne for at opdatere elementets position eller adfærd under trækoperationen, f.eks. at få et vindue til at følge musen eller fingeren.
  • IEndDragHandler: Bruges til at detektere slutningen af en trækoperation, f.eks. når brugeren slipper museknappen eller touch inputtet. Implementer denne for at udføre oprydning eller reagere på slutningen af trækoperationen, f.eks. at snappe et UI-element til en bestemt position, når det slippes.

Ved at bruge disse grænseflader kan du opbygge sofistikerede og responsive UI-systemer, der reagerer præcist på brugerens træk- og slip-bevægelser.

Ofte Stillede Spørgsmål om Touch Input i Unity

Hvad er forskellen mellem skærmkoordinater og verdenskoordinater for touch input?

Skærmkoordinater (touch.position) er todimensionelle punkter baseret på din enheds skærmopløsning, hvor (0,0) er nederst til venstre. De bruges ofte til UI. Verdenskoordinater (opnået via Camera.main.ScreenToWorldPoint) er tredimensionelle punkter i din spilverden, der tager kameraets perspektiv og spilobjekternes placering i betragtning. Disse er essentielle, når du vil interagere med 3D-spilobjekter.

Hvordan håndterer jeg multi-touch i Unity?

Du håndterer multi-touch ved at iterere gennem Input.touchCount og få adgang til hver enkelt berøring ved hjælp af Input.GetTouch(i), hvor i er indekset for berøringen. Hver Touch-objekt har sin egen fingerId, position, deltaPosition og phase, hvilket giver dig fuld kontrol over individuelle fingre og komplekse gestus.

Hvorfor skal jeg bruge Event Systemet til UI-interaktioner frem for Input-klassen?

Event Systemet er specifikt designet til UI og giver en mere robust og vedligeholdelsesvenlig måde at håndtere interaktioner på. Det abstraherer kompleksiteten ved at detektere klik og træk over UI-elementer og understøtter automatisk cross-platform input (mus, touch, controller). Mens Input-klassen er god til generel spilinput, er Event Systemet optimeret til UI-elementernes livscyklus og hierarki.

Konklusion

At mestre touch input i Unity er en fundamental færdighed for enhver, der ønsker at skabe moderne, interaktive spil og applikationer. Fra de grundlæggende principper for at detektere en enkelt berøring til den sofistikerede håndtering af multi-touch gestus og UI-interaktioner via Event Systemet, har du nu en dybdegående forståelse af de værktøjer og teknikker, Unity tilbyder. Ved at anvende denne viden kan du designe spil, der ikke kun er funktionelle, men også fængslende og glædelige at interagere med. Husk, god inputhåndtering er nøglen til en fremragende brugeroplevelse.

Hvis du vil læse andre artikler, der ligner Touch Input i Unity: Din Komplette Guide, kan du besøge kategorien Teknologi.

Go up