es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

FlyCamera con colisión

Cómo crear colisiones para una cámara voladora en Unity 3D para evitar que la cámara caiga en objetos en la escena. El fragmento de código de mi script de cámara:

public class FlyCamera : MonoBehaviour
{
    void FixedUpdate()
    {
        if (!isAlternative)
            SetCameraMovement();
    }

    private void SetCameraMovement()
    {
        lastMouse = Input.mousePosition - lastMouse;
        lastMouse = new Vector3(-lastMouse.y * camSens, lastMouse.x * camSens, 0);
        lastMouse = new Vector3(transform.eulerAngles.x + lastMouse.x, transform.eulerAngles.y + lastMouse.y, 0);
        if (Input.GetMouseButton(1))
            transform.eulerAngles = lastMouse;
        lastMouse = Input.mousePosition;
        GetBaseInput();
        transform.position = Vector3.Lerp(transform.position, NewPosition, Time.deltaTime * movementTime);
    }

    private void GetBaseInput()
    {
        Speed = Input.GetKey(KeyCode.LeftShift) ? superSpeed : mainSpeed;
        if (Input.GetKey(KeyCode.W))
            NewPosition += transform.forward * Speed;
        if (Input.GetKey(KeyCode.S))
            NewPosition += transform.forward * -Speed;
        if (Input.GetKey(KeyCode.A))
            NewPosition += transform.right * -Speed;
        if (Input.GetKey(KeyCode.D))
            NewPosition += transform.right * Speed;
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear colisiones para una cámara voladora en Unity 3d y evitar que la cámara caiga sobre objetos en la escena, puedes adjuntar un componente Rigidbody a tu objeto de juego de la cámara y establecer sus restricciones para congelar su posición en el eje X y Z pero permitir el movimiento en el eje Y.

    Luego, puedes agregar un componente CapsuleCollider a la cámara y ajustar su altura y radio para que se ajuste al tamaño y forma de tu cámara.

    Finalmente, puedes habilitar la casilla “Is Trigger” en el componente Collider para hacer que active eventos en lugar de causar colisiones físicas con otros objetos.

    Para evitar que la cámara atraviese otros colliders en la escena, puedes usar la función OnTriggerStay para detectar cuando la cámara está colisionando con otro objeto y ajustar su posición en consecuencia.

    Aquí tienes un ejemplo de cómo puedes modificar el script FlyCamera para agregar detección de colisiones:

    “`
    public class FlyCamera : MonoBehaviour
    {
    public float collisionRadius = 0.5f;

    private Rigidbody rigidBody;
    
    void Start()
    {
        // Obtén el componente Rigidbody del objeto de juego de la cámara
        rigidBody = GetComponent<rigidbody>();
        // Congela la posición de la cámara en los ejes X y Z
        rigidBody.constraints = RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionZ;
        // Permite el movimiento en el eje Y
        rigidBody.constraints &= ~RigidbodyConstraints.FreezePositionY;
        // Agrega un componente CapsuleCollider a la cámara
        CapsuleCollider collider = gameObject.AddComponent<capsulecollider>();
        // Ajusta la altura y el radio del collider para que se ajuste al tamaño y forma de la cámara
        collider.height = 1f;
        collider.radius = collisionRadius;
        // Habilita "Is Trigger" en el collider para que active eventos en lugar de causar colisiones físicas
        collider.isTrigger = true;
    }
    
    void FixedUpdate()
    {
        // Verifica la detección de colisiones en la función OnTriggerStay
    }
    
    private void OnTriggerStay(Collider other)
    {
        // Verifica si el collider está colisionando con otro objeto
        if (other.gameObject.tag == "Obstacle")
        {
            // Calcula una nueva posición para la cámara para evitar que colisione con el obstáculo
            Vector3 nuevaPosicion = transform.position;
            nuevaPosicion.y = other.ClosestPoint(transform.position).y + collisionRadius;
            // Mueve la cámara a la nueva posición utilizando Lerp para suavidad
            transform.position = Vector3.Lerp(transform.position, nuevaPosicion, Time.deltaTime * movementTime);
        }
    }
    
    // El resto del script original continúa...
    

    }
    “`

Comments are closed.