unity3d
Fisica
Ricerca…
Rigidbodies
Panoramica
Il componente Rigidbody conferisce a GameObject una presenza fisica nella scena in quanto è in grado di rispondere alle forze. Potresti applicare le forze direttamente al GameObject o permetterle di reagire a forze esterne come la gravità o un altro Rigidbody che la colpisce.
Aggiunta di un componente Rigidbody
È possibile aggiungere un corpo rigido facendo clic su Componente> Fisica> Corpo rigido
Spostare un oggetto Rigidbody
Si raccomanda che se applichi un Rigidbody a un GameObject, usi le forze o la coppia per spostarlo invece di manipolarlo. Utilizzare i AddForce()
o AddTorque()
per questo:
// 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
È possibile modificare la massa di un GameObject Rigidbody per influenzare il modo in cui reagisce con altri Rigidi e forze. Una massa più alta significa che GameObject avrà più influenza su altri oggetti GameObjects basati sulla fisica e richiederà una forza maggiore per spostarsi. Oggetti con massa diversa cadranno alla stessa velocità se hanno gli stessi valori di resistenza. Per modificare la massa nel codice:
GetComponent<Rigidbody>().mass = 1000;
Trascinare
Maggiore è il valore di trascinamento, più un oggetto rallenta durante lo spostamento. Pensala come una forza opposta. Per modificare il trascinamento nel codice:
GetComponent<Rigidbody>().drag = 10;
isKinematic
Se contrassegni un Rigidbody come Kinematic, questo non può essere influenzato da altre forze ma può comunque influenzare altri GameObjects. Per modificare il codice:
GetComponent<Rigidbody>().isKinematic = true;
vincoli
È anche possibile aggiungere vincoli a ciascun asse per congelare la posizione o la rotazione del corpo rigido nel locale. L'impostazione predefinita è RigidbodyConstraints.None
come mostrato qui:
Un esempio di vincoli nel codice:
// 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
È possibile utilizzare l'operatore OR bit a bit |
combinare più vincoli in questo modo:
// Allow rotation on X and Y axes and motion on Y and Z axes.
GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionZ |
RigidbodyConstraints.FreezeRotationX;
collisioni
Se vuoi un GameObject con un Rigidbody su di esso per rispondere alle collisioni dovrai anche aggiungere un collisore ad esso. I tipi di collisore sono:
- Box collider
- Spider Collider
- Capsule collider
- Volante
- Mesh collider
Se si applica più di un collisore a un GameObject, viene chiamato collisore composto.
È possibile creare un collider in Trigger per utilizzare i OnTriggerEnter()
, OnTriggerStay()
e OnTriggerExit()
. Un collisore del grilletto non reagisce fisicamente alle collisioni, altri GameObject semplicemente lo attraversano. Sono utili per rilevare quando un altro GameObject si trova in una determinata area o no, ad esempio, quando si raccoglie un oggetto, potremmo essere in grado di scorrerlo ma rilevare quando ciò accade.
Gravità nel corpo rigido
La proprietà useGravity
di un RigidBody
controlla se la gravità lo influenza o meno. Se impostato su false
il RigidBody
si comporterà come se nello spazio esterno (senza una forza costante applicata ad esso in qualche direzione).
GetComponent<RigidBody>().useGravity = false;
È molto utile nelle situazioni in cui hai bisogno di tutte le altre proprietà di RigidBody
eccetto il movimento controllato dalla gravità.
Quando abilitato, il RigidBody
sarà influenzato da una forza gravitazionale, impostata in Physics Settings
:
La gravità è definita in unità del mondo al secondo al quadrato, ed è qui inserita come un vettore tridimensionale: significa che con le impostazioni nell'immagine di esempio, tutti i RigidBodies
con la proprietà useGravity
impostata su True
sperimenteranno una forza di 9,81 unità mondiali al secondo al secondo nella direzione verso il basso (poiché i valori Y negativi nel sistema di coordinate di Unity sono rivolti verso il basso).