Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Dudas

Iniciado por chessjose, Agosto 03, 2017, 11:17:22 AM

Tema anterior - Siguiente tema
Buenas!
 
tengo diversas dudas!
 
voy a empezar por la que considero que debería ser fácil en resolver el problema.
 
tengo un área de juego y resulta que la nave de mi player puede salir de esa área de juego y perderse en el "olimpo del espacio" mi idea era poner un gameObject con un cubo dentro y ponerle collaiders 2D  y un Rigidbody y resulta que la nave los atraviesa quisiera que chocaran con el para frenarlo y que no recibiera daño por golpearse con el.
 
la segunda parte de mi duda es que quiero hacerle un GameOver, la cosa es que mi personaje no tiene vidas es decir cuando el enemigo le da muere o se acaba el juego como prefiráis llamarlo y no se donde he de colocar el código si queréis os paso un par de imágenes del código, aparte de que salga el mensaje quiero que tenga dos botones uno para salir del juego y otro para que pueda hacer reiniciar el juego . 
 
el código del enemy:
 
using System.Collections;

using System.Collections.Generic;

using UnityEngine;
 
public class EnemyBehaviour : MonoBehaviour {

    //sonido

    public AudioClip hitSound;

    //la vida del enemigo

    public int health = 2;
 
    //esto es la caja para poner el Prefab Explosion que hemos echo

    public Transform explosion;
 
     void OnTriggerEnter2D(Collider2D theCollider)

    {

        //Debug.Log("he colisionado con" + theCollision.gameObject.name);

        if(theCollider.gameObject.name.Contains("Laser"))

        {

            LaserBehaviour laser = theCollider.gameObject.GetComponent("LaserBehaviour")as LaserBehaviour;

            health -= laser.damage;

            Destroy(theCollider.gameObject);

            //sonido

            GetComponent<AudioSource>().PlayOneShot(hitSound);

        }

        if (health <= 0)

        {

            Destroy(this.gameObject);

            GameController controller = GameObject.FindGameObjectWithTag("GameController").GetComponent<GameController>();

            controller.KillEnemy();

            controller.IncreaseScore(10);

            if (explosion)

            {

                GameObject exploder = ((Transform)Instantiate(explosion,

                                                  this.transform.position,

                                                  this.transform.rotation)).gameObject;

                Destroy(exploder, 2.0f);

            }

        }
 
        //el enemigo choca contra la nave protagonista
 
      //aqui es donde el player muere....

        if (theCollider.gameObject.name.Contains("playerShip"))

        {

            PlayerBehaviour player = theCollider.gameObject.GetComponent("PlayerBehaviour") as PlayerBehaviour;

          

            Destroy(theCollider.gameObject);

        }
 
    }
 
    // Update is called once per frame

    void Update () {

        transform.Rotate(new Vector3(0, 0, Time.deltaTime * 90));

    }

}

Agosto 03, 2017, 02:03:12 PM #1 Ultima modificación: Agosto 07, 2017, 12:05:15 PM por Igor
Buenas, 
 
Si tu "playerShip" tiene rigidbody deberia "chocar" con los colliders que pongas como "limites" de la escena, (recuerda marcar "freeze rotation x/y/z" y quitar "use gravity"), si esto falla y no detecta las colisiones puede ser por que haya objetos con collider o rigidbodies dentro de otros objetos con colliders o rigidbodies, esto puede dar lugar a fallos de Phisics.
 
Otra forma de hacerlo es en el codigo del player(yo lo suelo hacer asi)
 

transform.position = new Vector3(
   Mathf.Clamp(transform.position.x, minlimitX, maxlimitX), 
   Mathf.Clamp(transform.position.y, minlimitY, maxlimitY),
   Mathf.Clamp(transform.position.z, minlimitZ, maxlimitZ)
);

 
 
 
 
 
 
 
 
 
Lo de "hacer un gameover" se puede hacer de mil maneras distintas
 
Puedes hacer una funcion publica en el "player"
 

public void muerte() {
   //ocultar nave de jugador
   renderer.enabled = false;
   //puedes cambiar un bool a true, que tendras que haber definido antes
   jugadorEstaMuerto = true;
}
 
//Y luego en la funcion ongui...
void OnGUI() {
   If (jugadorEstaMuerto) {
      int tSize = 40;
      string str = "GAMEOVER";
      GUIStyle guiStyle = new GUIStyle();
      guiStyle.fontSize = tSize;
      guiStyle.alignment = TextAnchor.MiddleCenter;
      Rect rect = new Rec((Screen.width/2)-(tSize*4), (Screen.height/2)-(tSize), tSize*8 , tSize*2);
       GUI.Label(rect, str, guiStyle);
   }
}

 
 
 
Tambien puedes poner (mientras se muestra el mensage de " gameover") una variable contadora de tiempo y cuando pase de 4 segundos (por ejemplo) hacer que salga al menu principal o te descuenten una vida y comience de nuevo el nivel o lo que quieras
 
 
 
Editado

Agosto 03, 2017, 05:30:01 PM #2 Ultima modificación: Agosto 03, 2017, 05:32:09 PM por chessjose
Gracias por la respuesta!
 
el primer problema se soluciono al rescatar una copia de seguridad que tenia... se quedo tonto el Unity jajaja
 
el segundo del gameover lo quiero llamarlo desde una scena distinta que es donde tengo gran parte de la interfaz de usuario....
 
muchas Gracias!!!

al final he conseguido ponerlo del  GameOver de la siguiente manera
 
he hecho un canvas en una scena aparte del juego y he pillado el código del enemy y le he puesto una sola linea de código, os dejare el código para que se vea donde la resaltare en negrita para que se distinga.
 


public class EnemyBehaviour : MonoBehaviour {

    //sonido

    public AudioClip hitSound;

    //la vida del enemigo

    public int health = 2;
 


    //esto es la caja para poner el Prefab Explosion que hemos echo

    public Transform explosion;
 


     void OnTriggerEnter2D(Collider2D theCollider)

    {

        //Debug.Log("he colisionado con" + theCollision.gameObject.name);

        if(theCollider.gameObject.name.Contains("Laser"))

        {

            LaserBehaviour laser = theCollider.gameObject.GetComponent("LaserBehaviour")as LaserBehaviour;

            health -= laser.damage;

            Destroy(theCollider.gameObject);

            //sonido

            GetComponent<AudioSource>().PlayOneShot(hitSound);

        }

        if (health <= 0)

        {

            Destroy(this.gameObject);

            GameController controller = GameObject.FindGameObjectWithTag("GameController").GetComponent<GameController>();

            controller.KillEnemy();

            controller.IncreaseScore(10);

            if (explosion)

            {

                GameObject exploder = ((Transform)Instantiate(explosion,

                                                  this.transform.position,

                                                  this.transform.rotation)).gameObject;

                Destroy(exploder, 2.0f);

            }

        }
 


        //el enemigo choca contra la nave protagonista
 


      //aqui es donde el player muere....

        if (theCollider.gameObject.name.Contains("playerShip"))

        {

            PlayerBehaviour player = theCollider.gameObject.GetComponent("PlayerBehaviour") as PlayerBehaviour;

          

            Destroy(theCollider.gameObject);
 


          Application.LoadLevel("GameOver");

        }
 


    }
 


    // Update is called once per frame

    void Update () {

        transform.Rotate(new Vector3(0, 0, Time.deltaTime * 90));

    }

}
 
 


HOla, primero lo primero:
 
<>
 
Cita de: chessjose date=1501751842tengo un área de juego y resulta que la nave de mi player puede salir de esa área de juego y perderse en el "olimpo del espacio" mi idea era poner un gameObject con un cubo dentro y ponerle collaiders 2D  y un Rigidbody y resulta que la nave los atraviesa quisiera que chocaran con el para frenarlo y que no recibiera daño por golpearse con el.
   


y cual es la duda? que seria perderse en el "olimpo del espacio"? no me queda nada claro, aunque si ya lo resolviste buena ya está.
 
 
 
Cita de: chessjose date=1501751842la segunda parte de mi duda es que quiero hacerle un GameOver, la cosa es que mi personaje no tiene vidas es decir cuando el enemigo le da muere o se acaba el juego como prefiráis llamarlo y no se donde he de colocar el código si queréis os paso un par de imágenes del código, aparte de que salga el mensaje quiero que tenga dos botones uno para salir del juego y otro para que pueda hacer reiniciar el juego . 
   


player muerto != fin del juego, el player es una partesita del juego (un peon), deberias tener un manager(el rey) que diga cuando se termina el juego (generalmente al apretar "salir", o podes ser mas creativo si lo quisieras). Jamas pero jamas un player o un enemigo debe tener informacion ni control de la aplicacion, lo primero que tenes que hacer es el manager (o mas de uno generalmente), algo que corra de fondo, que no muera entre escenas, posiblemente un singleton (o no), que tenga la informacion relevante de tu juego pero no la informacion irrelevante (como saber si el player esta saltando o no).
 
Podes desde el manager chequear si el player esta muerto, o interpretar un evento de Muerte, lo que quieras, si lo está haces paso a paso lo que debas, mostrar un menu, salir, volver al menu principal, etc.

Agosto 04, 2017, 06:15:30 PM #5 Ultima modificación: Agosto 04, 2017, 06:17:35 PM por chessjose
lo de perderse en el olimpo el problema es que tienes la camara fija y es un 2D lo cual si no ves el enemigo estas muerto... jejeje pero lo dicho lo solucione...
 
lo del singleton es algo que no me quedo muy claro y tengo que volver a echar el ojo otra vez al vídeo del curso. 
 
el juego es un space invader no se donde colocar el manager y como llamarlo a el... ya te digo que tengo que volver a mirar otra vez algunos vídeos para que me quede mas claro, pero supongo que si lo entrego así tal y como lo tengo debería ir bien....
 
después tengo una otra duda que no entiendo tengo dos controladores uno que regula la aparición de enemigos y otra que regula la aparición de asteroides y no se si se puede hacer de alguna manera para que con un solo archivo vaya bien todo, por que ahora me salen solo unas cuantas naves o unos cuantos asteroides y dejan de salir... 
 
de todas formas muchas gracias por las ideas y aclaraciones!! 

@Igor, por favor, formatead vuestros códigos siguiendo las normas de la Comunidad, o borraré este Tema. SI no sabéis cómo, tenéis la guía en el foro de Primeros Pasos.

Etiquetas: