En aquest tema, explorarem com implementar i gestionar la física dins del motor de videojocs Unity. Unity és un dels motors més populars per al desenvolupament de videojocs i ofereix una àmplia gamma d'eines per simular física de manera realista. Aprendrem a utilitzar aquestes eines per crear moviments, col·lisions i altres interaccions físiques dins dels nostres jocs.

Continguts

  1. Introducció a la Física en Unity
  2. Components de Física en Unity
  3. Configuració de Rigidbodies
  4. Detecció i Resolució de Col·lisions
  5. Forces i Moviments
  6. Joints i Constraints
  7. Exercicis Pràctics

  1. Introducció a la Física en Unity

Unity utilitza el motor de física PhysX de NVIDIA per simular la física en temps real. Aquest motor permet simular moviments, col·lisions, forces i altres fenòmens físics de manera precisa i eficient.

Conceptes Clau

  • Motor de Física PhysX: Motor de física integrat en Unity que proporciona simulacions realistes.
  • Component Rigidbody: Component que permet que un objecte sigui afectat per la física.
  • Collider: Component que defineix la forma de l'objecte per a la detecció de col·lisions.

  1. Components de Física en Unity

Rigidbody

El component Rigidbody és essencial per a qualsevol objecte que vulgui ser afectat per la física. Permet que l'objecte respongui a forces, gravetat i col·lisions.

// Exemple de com afegir un Rigidbody a un objecte en Unity
public class AddRigidbody : MonoBehaviour
{
    void Start()
    {
        gameObject.AddComponent<Rigidbody>();
    }
}

Collider

Els Colliders defineixen la forma de l'objecte per a la detecció de col·lisions. Hi ha diferents tipus de colliders, com ara BoxCollider, SphereCollider, i MeshCollider.

// Exemple de com afegir un BoxCollider a un objecte en Unity
public class AddBoxCollider : MonoBehaviour
{
    void Start()
    {
        gameObject.AddComponent<BoxCollider>();
    }
}

  1. Configuració de Rigidbodies

Propietats del Rigidbody

  • Mass: Defineix la massa de l'objecte.
  • Drag: Defineix la resistència al moviment.
  • Angular Drag: Defineix la resistència a la rotació.
  • Use Gravity: Si està activat, l'objecte serà afectat per la gravetat.
  • Is Kinematic: Si està activat, l'objecte no serà afectat per la física, però podrà ser mogut manualment.
// Exemple de configuració de propietats del Rigidbody
public class ConfigureRigidbody : MonoBehaviour
{
    void Start()
    {
        Rigidbody rb = gameObject.AddComponent<Rigidbody>();
        rb.mass = 2.0f;
        rb.drag = 0.5f;
        rb.angularDrag = 0.05f;
        rb.useGravity = true;
        rb.isKinematic = false;
    }
}

  1. Detecció i Resolució de Col·lisions

OnCollisionEnter

Unity proporciona el mètode OnCollisionEnter per detectar col·lisions entre objectes amb colliders.

// Exemple de detecció de col·lisions
void OnCollisionEnter(Collision collision)
{
    Debug.Log("Col·lisió detectada amb " + collision.gameObject.name);
}

OnTriggerEnter

Per a col·lisions que no necessiten resposta física, podem utilitzar OnTriggerEnter amb colliders configurats com a triggers.

// Exemple de detecció de triggers
void OnTriggerEnter(Collider other)
{
    Debug.Log("Trigger activat per " + other.gameObject.name);
}

  1. Forces i Moviments

Aplicar Forces

Podem aplicar forces als Rigidbodies per moure'ls de manera realista.

// Exemple d'aplicació de forces
public class ApplyForce : MonoBehaviour
{
    public float forceAmount = 10.0f;

    void Start()
    {
        Rigidbody rb = gameObject.GetComponent<Rigidbody>();
        rb.AddForce(Vector3.up * forceAmount, ForceMode.Impulse);
    }
}

Tipus de Forces

  • ForceMode.Force: Aplica una força contínua.
  • ForceMode.Impulse: Aplica una força instantània.
  • ForceMode.Acceleration: Aplica una acceleració contínua.
  • ForceMode.VelocityChange: Canvia la velocitat instantàniament.

  1. Joints i Constraints

Joints

Els Joints permeten connectar dos objectes i definir com es mouen l'un respecte a l'altre. Alguns tipus de joints inclouen HingeJoint, SpringJoint i FixedJoint.

// Exemple d'ús d'un HingeJoint
public class AddHingeJoint : MonoBehaviour
{
    void Start()
    {
        HingeJoint hinge = gameObject.AddComponent<HingeJoint>();
        hinge.connectedBody = anotherGameObject.GetComponent<Rigidbody>();
    }
}

Constraints

Podem utilitzar constraints per restringir el moviment i la rotació dels Rigidbodies.

// Exemple de configuració de constraints
public class ConfigureConstraints : MonoBehaviour
{
    void Start()
    {
        Rigidbody rb = gameObject.GetComponent<Rigidbody>();
        rb.constraints = RigidbodyConstraints.FreezePositionY | RigidbodyConstraints.FreezeRotationX;
    }
}

  1. Exercicis Pràctics

Exercici 1: Crear un Objecte que Cau

  1. Crea un nou projecte en Unity.
  2. Afegeix un Cube a l'escena.
  3. Afegeix un component Rigidbody al Cube.
  4. Executa l'escena i observa com el Cube cau degut a la gravetat.

Exercici 2: Aplicar una Força a un Objecte

  1. Utilitza el mateix projecte de l'exercici anterior.
  2. Afegeix el següent script al Cube per aplicar una força cap amunt quan comenci l'escena.
public class ApplyUpwardForce : MonoBehaviour
{
    void Start()
    {
        Rigidbody rb = GetComponent<Rigidbody>();
        rb.AddForce(Vector3.up * 10.0f, ForceMode.Impulse);
    }
}

Solucions

Solució Exercici 1

  1. Crea un nou projecte en Unity.
  2. Afegeix un Cube a l'escena des del menú GameObject > 3D Object > Cube.
  3. Selecciona el Cube i fes clic a Add Component al panell Inspector. Cerca Rigidbody i afegeix-lo.
  4. Executa l'escena fent clic a Play i observa com el Cube cau.

Solució Exercici 2

  1. Utilitza el mateix projecte de l'exercici anterior.
  2. Crea un nou script anomenat ApplyUpwardForce i enganxa el codi proporcionat.
  3. Afegeix l'script al Cube arrossegant-lo al panell Inspector.
  4. Executa l'escena i observa com el Cube rep una força cap amunt.

Conclusió

En aquesta secció, hem après a utilitzar els components de física en Unity per crear simulacions realistes. Hem vist com configurar Rigidbodies, detectar col·lisions, aplicar forces i utilitzar Joints i Constraints. Aquests conceptes són fonamentals per a qualsevol desenvolupador de videojocs que vulgui crear experiències immersives i realistes. En la següent secció, explorarem com implementar física en Unreal Engine.

© Copyright 2024. Tots els drets reservats