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.

¿Cómo evitar que la cámara atraviese las paredes y objetos en Unity3d?

Estoy creando un juego de Android 3D en tercera persona en Unity. He configurado un script “free look on touch” para mover la vista de la cámara alrededor del jugador. A continuación se muestra el código. Pero la cámara que sigue a mi jugador se está moviendo a través de las paredes y objetos que se interponen entre el jugador y la cámara. Quiero que la cámara se ajuste si choca contra un objeto (la cámara no es un hijo de mi jugador).
Cosas que he intentado pero no han funcionado:

  1. Aplicar un box collider / rigidbody / material a la cámara
    1. Hacer que un gameobject vacío sea el padre de la cámara y aplicar un box collider / rigidbody / material a ese gameobject.
    2. Hacer que el ángulo de corte de la cámara (cerca) sea < 0,3. Esto solo funciona para la primera persona pero no para la tercera.

Supongo que el raycasting puede ser de ayuda, pero no sé cómo implementarlo. ¡Cualquier sugerencia sería de gran ayuda!
“`

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.Characters.ThirdPerson;

public class ThirdPersonInput : MonoBehaviour
{
public FixedJoystick LeftJoystick;
public FixedButton Button;
public FixedTouchField TouchField;

protected ThirdPersonUserControl Control;
protected float CameraAngle;
protected float CameraAngleSpeed = 0.2f;
// Start is called before the first frame update
void Start()
{
    Control = GetComponent<ThirdPersonUserControl>();
}
// Update is called once per frame
void Update()
{
    Control.m_Jump = Button.Pressed;
    Control.Hinput = LeftJoystick.Direction.x;
    Control.Vinput = LeftJoystick.Direction.y;

    CameraAngle += TouchField.TouchDist.x * CameraAngleSpeed;

    Camera.main.transform.position = transform.position + Quaternion.AngleAxis(CameraAngle, Vector3.up) * new Vector3(0, 3, -3);
    Camera.main.transform.rotation = Quaternion.LookRotation(transform.position + Vector3.up * 2f - Camera.main.transform.position, Vector3.up);
}

}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para evitar que la cámara atraviese objetos, se puede utilizar el método Physics.Raycast para detectar cualquier obstáculo que se encuentre entre la cámara y el jugador. Si se detecta un obstáculo, se puede ajustar la posición de la cámara en consecuencia.

    Aquí hay un fragmento de código de ejemplo que se puede agregar a su método Update:

    Vector3 offsetCamara = new Vector3(0, 3, -3);
    Vector3 posicionJugador = transform.position;
    Vector3 posicionCamara = posicionJugador + Quaternion.AngleAxis(anguloCamara, Vector3.up) * offsetCamara;
    
    // Lanza un rayo desde el jugador hacia la cámara
    Vector3 direccion = posicionCamara - posicionJugador;
    float distancia = direccion.magnitude;
    direccion /= distancia;
    RaycastHit impacto;
    if (Physics.Raycast(posicionJugador, direccion, out impacto, distancia))
    {
        // Hay un obstáculo entre el jugador y la cámara
        // Ajusta la posición de la cámara para evitar el obstáculo
        posicionCamara = impacto.point - direccion * 0.1f;
    }
    
    Camera.main.transform.position = posicionCamara;
    Camera.main.transform.rotation = Quaternion.LookRotation(posicionJugador + Vector3.up * 2f - Camera.main.transform.position, Vector3.up);
    

    En este código, primero calculamos la posición de la cámara basada en la posición del jugador y el ángulo de la cámara, como antes. Luego, lanzamos un rayo desde el jugador hacia la cámara para verificar si hay obstáculos. Si se detecta un obstáculo, ajustamos la posición de la cámara para que esté ligeramente delante del obstáculo. Esto asegura que la cámara no atraviese paredes u otros objetos.

    Tenga en cuenta que el código anterior supone que los obstáculos son objetos sólidos con componentes colisionadores. Si algunos obstáculos no tienen colisionadores, puede que necesite agregarlos manualmente o usar un método diferente para detectar obstáculos, como el uso de zonas de activación.

Comments are closed.