unity3d
Fysica
Zoeken…
Rigidbodies
Overzicht
De component Rigidbody geeft een GameObject een fysieke aanwezigheid in de scène doordat het in staat is op krachten te reageren. Je zou krachten rechtstreeks op het GameObject kunnen uitoefenen of het kunnen laten reageren op externe krachten zoals zwaartekracht of een andere Rigidbody die het raakt.
Een Rigidbody-component toevoegen
U kunt een Rigidbody toevoegen door op Component> Fysica> Rigidbody te klikken
Een Rigidbody-object verplaatsen
Het wordt aanbevolen dat als je een Rigidbody op een GameObject toepast, je krachten of koppel gebruikt om het te verplaatsen in plaats van het te transformeren. Gebruik AddForce()
methoden AddForce()
of AddTorque()
:
// Add a force to the order of myForce in the forward direction of the Transform.
GetComponent<Rigidbody>().AddForce(transform.forward * myForce);
// Add torque about the Y axis to the order of myTurn.
GetComponent<Rigidbody>().AddTorque(transform.up * torque * myTurn);
Massa
Je kunt de massa van een Rigidbody GameObject wijzigen om te beïnvloeden hoe het reageert met andere Rigidbodies en krachten. Een hogere massa betekent dat het GameObject meer invloed zal hebben op andere op fysica gebaseerde GameObjects, en een grotere kracht vereist om zichzelf te bewegen. Objecten met verschillende massa vallen in dezelfde snelheid als ze dezelfde sleepwaarden hebben. Om massa in code te wijzigen:
GetComponent<Rigidbody>().mass = 1000;
Slepen
Hoe hoger de sleepwaarde, hoe meer een object vertraagt tijdens het verplaatsen. Zie het als een tegenkracht. Om de sleep in code te wijzigen:
GetComponent<Rigidbody>().drag = 10;
isKinematic
Als je een Rigidbody als Kinematic markeert, kan het niet worden beïnvloed door andere krachten, maar kan het wel andere GameObjects beïnvloeden. Code wijzigen:
GetComponent<Rigidbody>().isKinematic = true;
constraints
Het is ook mogelijk om beperkingen aan elke as toe te voegen om de positie of rotatie van de Rigidbody in de lokale ruimte te bevriezen. De standaardwaarde is RigidbodyConstraints.None
zoals hier getoond:
Een voorbeeld van beperkingen in code:
// Freeze rotation on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotation
// Freeze position on all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePosition
// Freeze rotation and motion an all axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll
U kunt de bitsgewijze OF-operator |
om meerdere beperkingen als volgt te combineren:
// Allow rotation on X and Y axes and motion on Y and Z axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionZ |
RigidbodyConstraints.FreezeRotationX;
botsingen
Als je een GameObject met een Rigidbody erop wilt laten reageren op botsingen, moet je er ook een botser aan toevoegen. Soorten botsers zijn:
- Box collider
- Bol botser
- Capsule-botser
- Wielbotser
- Mesh collider
Als u meer dan één botser op een GameObject toepast, noemen we dit een samengestelde botser.
U kunt van een collider een trigger maken om de OnTriggerEnter()
, OnTriggerStay()
en OnTriggerExit()
gebruiken. Een trigger-botser reageert niet fysiek op botsingen, andere GameObjects gaan er gewoon doorheen. Ze zijn handig om te detecteren wanneer een ander GameObject zich in een bepaald gebied bevindt of niet. Als we bijvoorbeeld een item verzamelen, willen we het misschien gewoon doornemen, maar detecteren wanneer dit gebeurt.
Zwaartekracht in star lichaam
De eigenschap useGravity
van een RigidBody
bepaalt of zwaartekracht dit beïnvloedt of niet. Indien ingesteld op false
de RigidBody
zich gedragen als in de ruimte (zonder dat er in enige richting een constante kracht op wordt uitgeoefend).
GetComponent<RigidBody>().useGravity = false;
Het is erg handig in situaties waarin u alle andere eigenschappen van RigidBody
behalve de beweging die wordt geregeld door de zwaartekracht.
Indien ingeschakeld, wordt de RigidBody
beïnvloed door een zwaartekracht, ingesteld onder Physics Settings
:
Zwaartekracht wordt gedefinieerd in wereldeenheden per seconde in het kwadraat en wordt hier ingevoerd als een driedimensionale vector: wat betekent dat met de instellingen in de voorbeeldafbeelding, alle RigidBodies
met de eigenschap useGravity
ingesteld op True
een kracht van 9,81 useGravity
per seconde zullen ervaren per seconde in neerwaartse richting (als negatieve Y-waarden in het coördinatensysteem van Unity naar beneden wijzen).