Jump to content
Sign in to follow this  
chessjose

Dudas

Recommended Posts

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));
    }
}

Share this post


Link to post
Share on other sites

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

Edited by Igor

Share this post


Link to post
Share on other sites

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!!!

Edited by chessjose

Share this post


Link to post
Share on other sites

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));
    }
}

 

Share this post


Link to post
Share on other sites

HOla, primero lo primero:

<>

20 hours ago, chessjose said:

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.

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á.

 

20 hours ago, chessjose said:

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 . 

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.

Share this post


Link to post
Share on other sites

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!! 

Edited by chessjose

Share this post


Link to post
Share on other sites

@chessjose y @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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...