Hur man integrerar en hoppande animation med Unity

Idag avslutade jag min första hoppningsanimation i Blender, som jag ville integrera i Unity. Jag trodde att jag bara skulle behöva göra något som "Ok när jag trycker på hoppknappen, utlöser hoppanimationen och det är det!". Inte ens i närheten!

Jag gjorde detta och resultatet var ... inte riktigt vad jag förväntade mig.

Jag är ganska säker på att processen som jag beskrev tidigare skulle fungera i vissa specifika fall men tyvärr inte i min.

Jag var tvungen att gå igenom en längre metod.

En snabb titt i ett hopp

Ett regelbundet hopp kan delas upp i tre olika faser:

  • Hopps impulsion: när vår karaktär tar impulsion och hoppar.
  • Fallande fas: när vår karaktär försöker hålla sig stabil i luften.
  • Landningsfas: när vår karaktär, fortfarande i luften, förbereder sig för att nå marken.

Hur fungerar det i ett spel?

När spelaren trycker på mellanslagstangenten (som uppenbarligen är hoppknappen ), utlöser den hoppningsanimationen.

När spelaren är i luften, börjar ytterligare en animation: den fallande fasen som slingrar tills den når marken.

Sedan startar landningsanimationen men med en subtilitet: om denna animering startar när karaktären just nådde marken är det för sent! I denna fas vet vi att vi kommer att slå marken (helt enkelt för att vi kan se det). Således kan vi enkelt utvärdera avståndet och förbereda oss för påverkan i luften.

Låt oss tänka på hur vi uppför oss när vi hoppar! När vi ser att vi kommer att träffa marken förbereder vi oss för ”påverkan”. Vi kan för att vi har visionen om marken och snabbt kan utvärdera när vi behöver vara beredda.

Det som saknas i vårt fall är något att utvärdera avståndet mellan vår karaktär från marken! Jag kommer att avslöja en metod för att utvärdera detta avstånd från karaktären till marken, men observera att det finns många andra sätt att göra det. Det kan användas i andra spelmotorer.

Tricket är att kasta en stråle från vår karaktär i hans hastighets riktning. Vi kommer då att kunna utlösa landningsanimationen vid rätt tidpunkt precis innan vi når den! 🥳

Redo?

Implementering med enhet

I Enhet finns det ett verktyg som heter Raycast som ger oss exakt vad vi vill ha.

Vi fortsätter i två steg:

  • Vi skickar en Raycast i vår hastighets riktning för att bestämma avståndet innan vi berör marken.
  • Om vår hastighet på den vertikala axeln, y i Unity, är negativ (vilket innebär att vi faller) och marken är för nära, utlöser vi landningsanimationen.

Det är perfekt, men nu när vi hoppar in spelet kommer skriptet att utlösa våra animationer vid rätt tidpunkt. Mot oändligheten och vidare! ️