Resultados 1 al 8 de 8

Tema: Resetear la posición del coche en Unity cuando se sale de la carretera

  1. #1
    Fecha de ingreso
    Nov 2023
    Mensajes
    4

    Resetear la posición del coche en Unity cuando se sale de la carretera

    Hola buenas, resulta que tengo un juego de carreras hecho en Unity y lo único que me falta es poder resetear la posición del coche cuando se sale de la carretera pulsando una tecla. He probado diferentes métodos como miCoche.transform.position = new Vector3 (valorX, valorY, valorZ); pero no me funciona como quiero, me sale el coche torcido y a veces fuera de la carretera.

    Quiero que me lo restaure a la posición en la que se sale, choca o tiene cualquier otra incidencia (no al principio).
    Gracias por adelantado.

  2. #2
    Fecha de ingreso
    Aug 2004
    Mensajes
    22,247

  3. #3
    Fecha de ingreso
    Nov 2023
    Mensajes
    4
    Cita Iniciado por Soliman Ver mensaje
    ¿De qué programa estás hablando..... ?
    Unity 3D.

    Perdón por no haberlo dicho.

  4. #4
    Fecha de ingreso
    Apr 2002
    Mensajes
    25,945

    Cómo resetear la posición del coche en Unity cuando se sale de la carretera

    Para resetear la posición del coche en Unity cuando se sale de la carretera, puedes utilizar el siguiente código:

    Código:
    // Devuelve la posición del coche en el momento en el que se sale de la carretera
    Vector3 posiciónSalida = coche.transform.position;
    
    // Si el coche se sale de la carretera
    if (coche.transform.position.x < -5) {
    
        // Restaura la posición del coche a la posición en la que se salió
        coche.transform.position = posiciónSalida;
    }
    Este código funciona de la siguiente manera:

    En primer lugar, se utiliza el método transform.position para obtener la posición actual del coche.
    A continuación, se comprueba si la posición del coche es inferior a -5 en el eje X. Esto significa que el coche se ha salido de la carretera por la izquierda.
    Si el coche se ha salido de la carretera, se utiliza el método transform.position para restaurar la posición del coche a la posición en la que se salió.

    Para evitar que el coche salga torcido o fuera de la carretera, puedes utilizar el siguiente código:

    Código:
    // Devuelve la dirección del coche en el momento en el que se sale de la carretera
    Quaternion direcciónSalida = coche.transform.rotation;
    
    // Si el coche se sale de la carretera
    if (coche.transform.position.x < -5) {
    
        // Restaura la posición del coche a la posición en la que se salió
        coche.transform.position = posiciónSalida;
    
        // Restaura la dirección del coche a la dirección en la que se salió
        coche.transform.rotation = direcciónSalida;
    }
    Este código funciona de la siguiente manera:

    En primer lugar, se utiliza el método transform.rotation para obtener la dirección actual del coche.
    A continuación, se comprueba si la posición del coche es inferior a -5 en el eje X. Esto significa que el coche se ha salido de la carretera por la izquierda.
    Si el coche se ha salido de la carretera, se utiliza el método transform.position para restaurar la posición del coche a la posición en la que se salió.
    A continuación, se utiliza el método transform.rotation para restaurar la dirección del coche a la dirección en la que se salió.

    Por último, para que el coche se resetee cuando pulses una tecla, puedes utilizar el siguiente código:

    Código:
    // Devuelve la posición del coche en el momento en el que se sale de la carretera
    Vector3 posiciónSalida = coche.transform.position;
    
    // Devuelve la dirección del coche en el momento en el que se sale de la carretera
    Quaternion direcciónSalida = coche.transform.rotation;
    
    // Escucha el evento de pulsación de la tecla "R"
    void OnKeyPressed(KeyCode key) {
    
        // Si se ha pulsado la tecla "R"
        if (key == KeyCode.R) {
    
            // Restaura la posición del coche a la posición en la que se salió
            coche.transform.position = posiciónSalida;
    
            // Restaura la dirección del coche a la dirección en la que se salió
            coche.transform.rotation = direcciónSalida;
        }
    }
    Este código funciona de la siguiente manera:

    En primer lugar, se declara una variable para almacenar la posición del coche en el momento en el que se sale de la carretera.
    A continuación, se declara una variable para almacenar la dirección del coche en el momento en el que se sale de la carretera.
    Después, se crea un evento de pulsación de la tecla "R".
    En el evento de pulsación de la tecla "R", se comprueba si se ha pulsado la tecla.
    Si se ha pulsado la tecla, se utiliza el código anterior para restaurar la posición y la dirección del coche.

    Espero que esto te ayude.

    Un saludo.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

  5. #5
    Fecha de ingreso
    Nov 2023
    Mensajes
    4

    No me funciona

    No me funciona ninguno, el que más me interesa es el tercero y último pero me lanza el siguiente error:

    Assets/Scripts/Restaurarcoche.cs(34,38): error CS0236: A field initializer cannot reference the nonstatic field, method, or property `Restaurarcoche.micoche'


    mi código es el siguiente:

    using UnityEngine;
    using System.Collections;
    using UnityStandardAssets.Vehicles;
    using System.Collections.Generic;
    using UnityEngine.UI;




    publicclassRestaurarcoche:MonoBehaviour{


    publicGameObjectmicoche;
    //Devuelvelaposicióndelcocheenelmomentoenelquesesal edela carretera
    Vector3posiciónSalida=micoche.transform.position;

    //Devuelveladireccióndelcocheenelmomentoenelquesesa ledela carretera
    QuaterniondirecciónSalida=micoche.transform.rotat ion;

    //Escuchaeleventodepulsacióndelatecla"R"

    voidOnKeyPressed(KeyCodekey){

    //Sisehapulsadolatecla"N"
    if(key==KeyCode.N){
    Debug.Log("haspulsadoN");
    //Restauralaposicióndelcochealaposiciónenlaquese salió
    micoche.transform.position=posiciónSalida;

    //Restauraladireccióndelcochealadirecciónenlaquese salió
    micoche.transform.rotation=direcciónSalida;
    }
    }
    }

    Restaurarcoche.cs está en csharp.
    Si me pudieras seguir ayudando te lo agradecería.

  6. #6
    Fecha de ingreso
    Apr 2002
    Mensajes
    25,945

    Restaurar la posición y dirección del coche al salir de la carretera

    El error que estás recibiendo es porque estás intentando inicializar un campo no estático con una referencia a un campo no estático. En este caso, estás intentando inicializar el campo micoche con una referencia al campo micoche del mismo objeto.

    Para solucionar este problema, tienes que inicializar el campo micoche con una referencia a un objeto GameObject. Puedes hacerlo de la siguiente manera:

    Código:
    public GameObject micoche;
    
    // ...
    
    void Awake()
    {
        // Inicializa el campo `micoche` con el objeto `GameObject` que representa al coche
        micoche = GameObject.FindGameObjectWithTag("Coche");
    }
    Una vez que hayas inicializado el campo micoche, podrás utilizarlo en el método OnKeyPressed() sin problemas.

    Prueba a ver con este código modificado:

    Código:
    using UnityEngine;
    using System.Collections;
    using UnityStandardAssets.Vehicles;
    using System.Collections.Generic;
    using UnityEngine.UI;
    
    
    
    
    public class Restaurarcoche : MonoBehaviour
    {
    
    
        public GameObject micoche;
    
        // Devuelve la posición del coche en el momento en el que se sale de la carretera
        Vector3 posiciónSalida = micoche.transform.position;
    
        // Devuelve la dirección del coche en el momento en el que se sale de la carretera
        Quaternion direcciónSalida = micoche.transform.rotation;
    
        // Escucha el evento de pulsación de la tecla "R"
    
        void OnKeyPressed(KeyCode key)
        {
    
            // Si se ha pulsado la tecla "N"
            if (key == KeyCode.N)
            {
                Debug.Log("has pulsado N");
                // Restaura la posición del coche a la posición en la que se salió
                micoche.transform.position = posiciónSalida;
                // Restaura la dirección del coche a la dirección en la que se salió
                micoche.transform.rotation = direcciónSalida;
            }
        }
    
    
        // Inicializa el campo `micoche` con el objeto `GameObject` que representa al coche
        void Awake()
        {
            micoche = GameObject.FindGameObjectWithTag("Coche");
        }
    }
    Dime a ver si esto te ayuda un poco mejor.

    Un saludo.
    |Agradecer cuando alguien te ayuda es de ser agradecido|

  7. #7
    Fecha de ingreso
    Nov 2023
    Mensajes
    4

    sigue sin funcionar

    lo he probado en un proyecto nuevo y sigue sin funcionar, el GameObject coche ya lo tengo inicializado (lo he arrastrado al campo micoche).

    La función OnKeyPressed no me funciona ya que el Debug.log no me sale a la vista.

    Necesito llamar la función dentro del método Update().

    lo que he conseguido hasta ahora:

    using UnityEngine;
    using System.Collections;

    publicclassrestaurarcoche:MonoBehaviour{

    publicGameObjectmicoche;

    //Usethisfor initialization
    Vector3posicionsalida;
    Quaterniondireccionsalida;
    voidStart(){
    posicionsalida=micoche.transform.position;
    direccionsalida=micoche.transform.rotation;
    }
    //Updateiscalledonceper frame
    voidUpdate(){
    if(Input.GetKey(KeyCode.N)){
    Debug.Log("HaspulsadoN");
    //micoche.transform.position=posicionsalida;
    //micoche.transform.rotation=direccionsalida;
    posicionsalida=newVector2(micoche.transform.position.x,0);
    micoche.transform.position=posicionsalida;
    //direccionsalida=newQuaternion(micoche.transform.rotation.y);
    //micoche.transform.rotation=direccionsalida;
    }
    }
    }

    Me falta el Quaternion.
    Muchas gracias.

  8. #8
    Fecha de ingreso
    Aug 2004
    Mensajes
    22,247
    Cita Iniciado por vankul Ver mensaje
    lo he probado en un proyecto nuevo y sigue sin funcionar, el GameObject coche ya lo tengo inicializado (lo he arrastrado al campo micoche).

    La función OnKeyPressed no me funciona ya que el Debug.log no me sale a la vista.

    Necesito llamar la función dentro del método Update().

    lo que he conseguido hasta ahora:

    using UnityEngine;
    using System.Collections;

    publicclassrestaurarcoche:MonoBehaviour{

    publicGameObjectmicoche;

    //Usethisfor initialization
    Vector3posicionsalida;
    Quaterniondireccionsalida;
    voidStart(){
    posicionsalida=micoche.transform.position;
    direccionsalida=micoche.transform.rotation;
    }
    //Updateiscalledonceper frame
    voidUpdate(){
    if(Input.GetKey(KeyCode.N)){
    Debug.Log("HaspulsadoN");
    //micoche.transform.position=posicionsalida;
    //micoche.transform.rotation=direccionsalida;
    posicionsalida=newVector2(micoche.transform.position.x,0);
    micoche.transform.position=posicionsalida;
    //direccionsalida=newQuaternion(micoche.transform.rotation.y);
    //micoche.transform.rotation=direccionsalida;
    }
    }
    }

    Me falta el Quaternion.
    Muchas gracias.

    Prueba en chatGPT. Si haces la pregunta correcta o pones por ejemplo este código y le dices cual es el error que reporta, te volverá a dar un código nuevo con un posible arreglo.

    El Chat de GPT para códigos funciona bastante bien.

    https://chat.openai.com/auth/login

Temas similares

  1. Respuestas: 1
    : 15-12-2022, 15:36
  2. Cancelar correctamente una impresión cuando veo que sale mal
    Por Naty Ramos en el foro Impresoras 3D
    Respuestas: 4
    : 08-09-2021, 08:55
  3. Blender Cuando exporto el modelo en OBJ y FBX sale sin los Uvmap
    Por kaynzac en el foro Materiales y Texturizado
    Respuestas: 3
    : 18-03-2021, 17:56
  4. 3dsMax Animación de coche en una carretera con Vray
    Por vikingsergei en el foro Animación y Rigging
    Respuestas: 0
    : 15-11-2010, 21:59
  5. Cuando dibujo una linea me sale un tubo
    Por alextula2 en el foro Modelado
    Respuestas: 5
    : 19-09-2008, 09:34

Etiquetas para este tema