Fysik (2D och 3D)

I Unity Ă€r det fysikmotorn som sköter gravitation och andra fysikaliska krafter, och hindrar objekt frĂ„n att clippa in i varandra. Den sköter dessutom andra kollisioner – sĂ„dana som inte har med fysikaliska krafter att göra alls, utan dĂ€r det bara finns anledning att avgöra ifall tvĂ„ objekt överlappar varandra.

Det finns tvĂ„ helt separata fysikmotorer – 2D och 3D. BĂ„da kan finnas med i samma projekt, men de kan inte pĂ„verka eller kĂ€nna av samma objekt.

Fysikuppdatering

Fysikmotorn uppdaterar normalt inte objektens position varje bildruta, utan har en egen frekvens. Som standard Ă€r denna 50 ggr/sekund. Det gĂ„r att stĂ€lla in under Edit → Project Settings, och sedan Time. DĂ€r finns "Fixed Timestep", som normalt Ă€r 0.02.

Metoden FixedUpdate körs varje fysik-timestep.

void FixedUpdate()
{
  Debug.Log("Doing all the physics!");
}

Rigidbody/Rigidbody2D

RigidBody-komponenterna Ă€r kĂ€rnan i fysikmotorn. Bara objekt med en RigidBody omfattas av fysikmotorns simuleringar. Undantaget Ă€r objekt som kolliderar med dem – de pĂ„verkas ocksĂ„, om de har rĂ€tt sorts collider.

TL,DR: för att ett objekt ska ges gravitation etc behöver det en RigidBody. För att en kollision ska kunna avlÀsas med kod (eller mÀrkas av i fysikmotorn) behöver minst ett av de inblandade objekten ha en RigidBody.

Velocity

Velocity Ă€r en property som beskriver objektets nuvarande hastighet – hur mycket dess position förĂ€ndras över tid. Man bör vara försiktig med att modifiera den direkt.

void Update()
{
  RigidBody rigidbody = GetComponent<RigidBody>();
  
  float xMovement = rigidbody.Velocity.x;
}

AddForce()

AnvÀnds för att applicera ny kraft till en RigidBody, och dÀrmed pÄverka dess Velocity. Hur mycket velocityn pÄverkas beror pÄ vilken ForceMode som anvÀnds och eventuellt pÄ objektets massa.

Unity-enheter fungerar hÀr som meter, och Force-vÀrdet anges i newtons eller newtonsekunder.

// Applicera 700 newtons i riktning framÄt.
rigidBody.AddForce(Vector3.forward * 700);

// Applicera en impuls av 900 newtonsekunder Ät höger
rigidBody.AddForce(Vector3.right * 900, ForceMode.Impulse);
  • ForceMode.Impulse: applicerar en omedelbar mĂ€ngd kraft (kraften som adderas Ă€r per timestep), och tar massan med i berĂ€kningen.

  • ForceMode.Force: applicerar en mĂ€ngd kraft per sekund, och tar massan med i berĂ€kningen.

  • ForceMode.VelocityChange: applicerar en omedelbar mĂ€ngd kraft (kraften som adderas Ă€r per timestep), men struntar i massan.

  • ForceMode.Acceleration: applicerar en mĂ€ngd kraft per sekund, men struntar i massan.

HÀr Àr en trÄd pÄ Unitys forum som gÄr igenom den exakta matten, för den som vill lÀsa mer.

OBS: För Rigidbody2D-komponenter anvÀnds ForceMode2D istÀllet för ForceMode.

Colliders

En collider Àr en "hit box" som anvÀnds istÀllet för ett spelobjekts faktiska geometri för att se om det kolliderar med nÄgot. För att en kollision mellan tvÄ objekt ska registreras av fysikmotorn behöver bÄda ha en collider.

  • BoxCollider Ă€r en collider som Ă€r format som ett rektangulĂ€rt block.

  • SphereCollider Ă€r en collider formad som ett klot.

  • CapsuleCollider Ă€r en collider formad som en cylinder som Ă€r rundad med halvklot i Ă€ndarna.

  • BoxCollider2D Ă€r en 2D-collider formad som en rektangel.

  • CircleCollider2D Ă€r en 2D-collider formad som en cirkel.

  • CapsuleCollider2D Ă€r en 2D-collider formad som en rektangel med halvcirklar i Ă€ndarna.

Triggers

En collider som Àr markerad som "Is Trigger" agerar inte som ett hinder för kollisioner, men kan anvÀndas för att genom kod kÀnna av ifall ett annat objekts collider överlappar den.

Exempel: NÀr avataren kliver över tröskeln sÄ gÄr larmet och monster instansieras i rummet.

Kollisionsmetoder

Skrivs dessa metoder in i script som Àr knutna till ett objekt med en RididBody/RigidBody2D sÄ anropas de automatiskt nÀr en kollision intrÀffar.

OnTriggerEnter()

En metod som anropas ifall en collider kolliderar med nÄgon av det hÀr objektets trigger colliders.

void OnTriggerEnter(Collider other)
{
  // other Àr det andra objektets collider
  // Den innehÄller i sin tur en referens till det andra objektet,
  // och dÀrifrÄn kan man nÄ dess transform, tag och komponenter.
  
  if (other.gameObject.tag == "trap")
  {
    print("It's a trap!");
  }
}

OnCollisionEnter()

En metod som anropas ifall en collider kolliderar med nÄgon av det hÀr objektets vanliga colliders.

void OnCollisionEnter(Collision col)
{
  // col Àr ett objekt som innehÄller information om sjÀlva kollisionen,
  // dÀribland en referens till objektet man kolliderade med,
  // och dÀrifrÄn kan man nÄ dess transform, tag och komponenter.
  
  if (other.gameObject.tag == "bullet")
  {
    print("Ouch!");
  }
}

OnTriggerEnter2D()

För objekt med RigidBody2D. En metod som anropas ifall en 2D-collider kolliderar med nÄgon av det hÀr objektets 2D trigger colliders.

void OnTriggerEnter(Collider2Dc other)
{
  // other Àr det andra objektets collider
  // Den innehÄller i sin tur en referens till det andra objektet,
  // och dÀrifrÄn kan man nÄ dess transform, tag och komponenter.
  
  if (other.gameObject.tag == "trap")
  {
    print("It's a trap!");
  }
}

OnCollisionEnter2D()

För objekt med RigidBody2D. En metod som anropas ifall en 2D collider kolliderar med nÄgon av det hÀr objektets vanliga 2D-colliders.

void OnCollisionEnter2D(Collision2D col)
{
  // col Àr ett objekt som innehÄller information om sjÀlva kollisionen,
  // dÀribland en referens till objektet man kolliderade med,
  // och dÀrifrÄn kan man nÄ dess transform, tag och komponenter.
  
  if (other.gameObject.tag == "bullet")
  {
    print("Ouch!");
  }
}

Last updated