Physique
Les rigidbodies et les colliders de ta scène marchent comme dans Unity. La physique tourne dans le jeu de chaque joueur, chacun pour soi : une balle poussée dans un jeu ne roule que dans ce jeu. Pour la montrer à tous, son propriétaire la synchronise (objets et valeurs synchronisés). Le serveur n'a pas de physique : ces appels y sont refusés.
using NodeWorld.Flux;
namespace MonMonde
{
public class Rebond : FluxScript
{
public float force = 8f;
protected override void OnCollisionEnter(Collision collision)
{
if (collision.rigidbody == null) return;
var direction = (collision.collider.transform.position - transform.position).normalized;
collision.rigidbody.AddForce(direction * force, ForceMode.VelocityChange);
}
}
}Les rigidbodies
Rigidbody : velocity, angularVelocity, mass (au-dessus de 0), isKinematic, useGravity, detectCollisions, constraints (RigidbodyConstraints.FreezePositionY…), interpolation, linearDamping, angularDamping, maxAngularVelocity, centerOfMass, et AddForce, AddTorque, AddForceAtPosition (avec un ForceMode), MovePosition, MoveRotation, Sleep, WakeUp, IsSleeping.
Les colliders
Collider : isTrigger, enabled, bounds. BoxCollider : center, size. SphereCollider : center, radius. MeshCollider : sharedMesh, convex (meshes faits par les scripts).
Rayons et sphères
Physics.Raycast(origin, direction, out hit, maxDistance, layerMask) | Le premier collider sur le rayon : hit.point, hit.normal, hit.distance, hit.collider, hit.transform. Aussi avec un Ray. |
Physics.RaycastAll(…) | Tous les colliders sur le rayon, sans ordre, 64 au plus. |
Physics.CheckSphere(position, radius, layerMask) | Un collider touche la sphère. |
Physics.OverlapSphere(position, radius, layerMask) | Les colliders qui la touchent, 128 au plus. |
Physics.gravity | La gravité du monde. |
Le masque de couches a un bit par couche (1 << 9) ; Physics.DefaultRaycastLayers contient toutes les couches sauf Ignore Raycast, Physics.AllLayers toutes. QueryTriggerInteraction.Ignore laisse de côté les colliders en trigger.
Les avatars, les portails et les appareils photo que NodeWorld met dans ta scène ne sont pas touchés : les rayons les traversent (ce qu'un script ne peut pas bloquer).
Collisions et triggers
Sur les scripts de l'objet qui a le collider :
| Callback | Quand |
|---|---|
OnTriggerEnter(Collider other), OnTriggerExit(Collider other) | Un collider entre dans ce trigger ou en sort. |
OnCollisionEnter(Collision collision) | Cet objet heurte un autre collider : collision.collider, collision.relativeVelocity, collision.rigidbody (l'autre corps, ou null). OnCollisionEnter(Collider other) donne le collider seul. |
OnCollisionExit(Collider other) | Ils ne se touchent plus. |
OnParticleCollision(GameObject other) | Des particules touchent cet objet (other : le système de particules, dont le module Collision envoie des messages de collision). |
OnPlayerTriggerEnter(), OnPlayerTriggerExit() | Le corps du joueur local entre dans ce trigger ou en sort (interaction). |
Les règles de Unity s'appliquent : un trigger ou une collision demande un rigidbody sur l'un des deux objets. Un événement peut te donner un collider qui n'est pas à ton monde, comme le corps d'un joueur : tu peux le lire, pas le changer.
