Sök…
Rigidbodies
Översikt
Rigidbody-komponenten ger en GameObject en fysisk närvaro i scenen genom att den kan svara på krafter. Du kan tillämpa krafter direkt på GameObject eller låta den reagera på externa krafter som tyngdkraften eller en annan rigidkropp som slår den.
Lägga till en Rigidbody-komponent
Du kan lägga till en rigidbody genom att klicka på Komponent> Fysik> rigidkropp
Flytta ett Rigidbody-objekt
Det rekommenderas att om du använder en styvkropp på ett GameObject att du använder krafter eller vridmoment för att flytta det snarare än att manipulera det är Transform. Använd AddForce()
eller AddTorque()
metoder för detta:
// 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
Du kan ändra massan på ett Rigidbody GameObject för att påverka hur det reagerar med andra rigidbodies och krafter. En högre massa innebär att GameObject kommer att ha mer påverkan på andra fysikbaserade GameObjects och kommer att kräva en större kraft för att röra sig själv. Objekt med olika massa kommer att falla i samma takt om de har samma dragvärden. För att ändra massa i kod:
GetComponent<Rigidbody>().mass = 1000;
Drag
Ju högre dragvärde, desto mer kommer ett objekt att sakta ner medan du flyttar. Tänk på det som en motsatt kraft. Så här ändrar du dra kod:
GetComponent<Rigidbody>().drag = 10;
isKinematic
Om du markerar en rigidbody som kinematisk kan den inte påverkas av andra krafter men kan fortfarande påverka andra GameObjects. Så här ändrar du i kod:
GetComponent<Rigidbody>().isKinematic = true;
begränsningar
Det är också möjligt att lägga till begränsningar till varje axel för att frysa Rigidbody-position eller rotation i det lokala rymden. Standard är RigidbodyConstraints.None
som visas här:
Ett exempel på begränsningar i kod:
// 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
Du kan använda den bitvisa ELLER-operatören |
för att kombinera flera begränsningar så:
// Allow rotation on X and Y axes and motion on Y and Z axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionZ |
RigidbodyConstraints.FreezeRotationX;
kollisioner
Om du vill ha ett GameObject med en rigidbody på den för att svara på kollisioner måste du också lägga till en collider till den. Typer av collider är:
- Box collider
- Sphere collider
- Capsule collider
- Wheel collider
- Mesh collider
Om du tillämpar mer än en collider på ett GameObject, kallar vi det en sammansatt collider.
Du kan skapa en collider till en Trigger för att använda OnTriggerEnter()
, OnTriggerStay()
och OnTriggerExit()
. En triggercollider reagerar inte fysiskt på kollisioner, andra GameObjects passerar helt enkelt genom den. De är användbara för att upptäcka när ett annat GameObject befinner sig i ett visst område eller inte, till exempel när vi samlar in ett objekt kan vi kanske bara köra igenom det men upptäcka när detta händer.
Gravitet i styv kropp
useGravity
hos en RigidBody
styr huruvida gravitationen påverkar den eller inte. Om RigidBody
inställd på false
kommer det att uppträda som i det yttre rymden (utan att en konstant kraft appliceras på den i någon riktning).
GetComponent<RigidBody>().useGravity = false;
Det är mycket användbart i de situationer där du behöver alla andra egenskaper hos RigidBody
utom rörelsen som styrs av tyngdkraften.
När det är aktiverat kommer RigidBody
att påverkas av en gravitationskraft, inställd under Physics Settings
:
Gravity definieras i världsenheter per sekund i kvadrat, och matas in här som en tredimensionell vektor: vilket innebär att med inställningarna i exempelbilden kommer alla RigidBodies
med egenskapen useGravity
inställd på True
att uppleva en kraft på 9,81 världsenheter per sekund per sekund i nedåtgående riktning (som negativa Y-värden i Unitys koordinatsystem pekar nedåt).