Noticias

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

Necesito una idea...

Iniciado por ramunda, Julio 22, 2015, 02:21:15 PM

Tema anterior - Siguiente tema
Vereis necesito una idea de como proceder....
using UnityEngine;
using System.Collections;

public class PlayerInfo : MonoBehaviour {
public GameObject Bocaarma;
public GameObject healthBottle;
public GameObject player;
public AudioClip deathClip;
public AudioClip deathClip2;
public AudioSource sonido;
public AudioSource sonido2;
public GameObject sonidoisladino;
public GameObject sonidoaguadino2;
public GameObject sonidoaguadino1;
public GameObject sonidoaguadino3;
public GameObject sonidoaguadino4;
public GameObject sonidoaguadino5;
public GameObject sonidoaguadino6;
public GameObject sonidoaguadino7;
public Animation muerto2;

public float length;
//public AnimationClip Die;

int health = 100;
int damageCount = 0;
int currentHealth;
bool playerFighting;
public GUIText healthbar;
float timer = 0.0f;
float healthTimer = 0.0f;
bool healthShouldRespawn = false;

public bool muerto = false;
public GameObject tuUI;

void Start () {
   currentHealth = health;
   tuUI.SetActive(false);
   }

void Update () {
   Cursor.visible = false;
   print("player in combat? " + playerFighting);
   if(!playerFighting){
      print("player is not fighting");
      if(currentHealth != 100){
         timer += Time.deltaTime;
         print ("timer: " + timer);
         if(timer > 90.0f){
            currentHealth += 10;
            timer = 0.0f;
         }
      }
   }
   else
   {
      if(currentHealth <= 0 && !muerto ){
         muerto = true;
         sonido.PlayOneShot(deathClip2);
         muerto2.Play("muerto");
         //GetComponent<AudioSource>().enabled = false;
         //GetComponent<AudioSource>().PlayOneShot(deathClip2);//length =5f;
         GetComponent<FPSInputController>().enabled = false;
         GetComponent<CharacterController>().enabled = false;
         Bocaarma.SetActive(false);
         sonidoisladino.SetActive(false);
         sonidoaguadino2.SetActive(false);
         sonidoaguadino3.SetActive(false);
         sonidoaguadino4.SetActive(false);
         sonidoaguadino5.SetActive(false);
         sonidoaguadino6.SetActive(false);
         sonidoaguadino7.SetActive(false);
         sonidoaguadino1.SetActive(false);
         
      

         
         //Destroy(gameObject);


   
      }
   }
   healthbar.text = "Vida " + currentHealth + " / 100";
   
   if(healthShouldRespawn)
   {
      healthTimer += Time.deltaTime;
      
      if(healthTimer > 5.0f)
      {
         healthBottle.gameObject.SetActive(true);
         healthTimer = 0.0f;
      }
   }
   
   if(muerto){
      //var anim = GetComponent<Animation>();
      //anim.AddClip(Die,"attackbo");
      //anim.play("attackbo");
      //GetComponent<AudioSource>().PlayOneShot(deathClip2);length =5f;
      Cursor.visible = false;
      tuUI.SetActive(true);
      if(Input.GetKeyDown(KeyCode.Space)){
         Respawn();
      }
   }
   
}

public void ApplyDamage(int damage){
   damageCount = damageCount + damage;
   if(damageCount == 100){
      if(currentHealth < 0){
         currentHealth = 0;
      }
      currentHealth = currentHealth - 30;
      sonido2.PlayOneShot(deathClip);
      //GetComponent<AudioSource>().PlayOneShot(deathClip);
      //GetComponent<AudioSource>().PlayOneShot(deathClip);//length =3f;
      healthbar.text = "Health " + currentHealth + " / 100";
      damageCount = 0;
   }
   
   print(currentHealth);
}

public void playerInCombat(int combat){
   if(combat == 1){
      playerFighting = true;
   }
   else
   {
      playerFighting = false;
   }
}

public void Respawn(){
   tuUI.SetActive(false);
   muerto = false;
   transform.position = new Vector3(Random.Range(400.0f, 700.0f), 0, Random.Range(300.0f, 800.0f));
   GetComponent<FPSInputController>().enabled = true;
   GetComponent<CharacterController>().enabled = true;
   sonidoisladino.SetActive(true);
   sonidoaguadino2.SetActive(true);
   sonidoaguadino3.SetActive(true);
   sonidoaguadino4.SetActive(true);
   sonidoaguadino5.SetActive(true);
   sonidoaguadino6.SetActive(true);
   sonidoaguadino7.SetActive(true);
   sonidoaguadino1.SetActive(true);
   ///GetComponent<AudioSource>().enabled = true;
   //GetComponent<disparosyrecargos2>().enabled = true;
   ////GetComponent<MouseLook>().enabled = true;
   Bocaarma.SetActive(true);
   currentHealth = 100;
}

void OnTriggerEnter(Collider item){
   if(item.gameObject.tag == "PlayerHealthBottle")
   {
      if(currentHealth < 100)
      {
         currentHealth = currentHealth + 50;
         item.gameObject.SetActive(false);
         healthShouldRespawn = true;
      }
   }
}
}
Explicoeste script es bastante fundamental en mi desarrollo de el juego ya que esta vinculado a varias cosas....Bien , el scrip va de fabula ese no es el problema, la cosa es que en la linea 139 hasta la 142...public void Respawn(){ 
        tuUI.SetActive(false);
        muerto = false;
        transform.position = new Vector3(Random.Range(400.0f, 700.0f), 0, Random.Range(300.0f, 800.0f));es donde cuando mi personaje muere respawnea aleatoriamente en las coordenadas puestas. Ok , todo bien esto esta bien en el nivel 1El problema empieza en el nivel 2....que es una gruta....y claro si respawnea en estas aleatorias corrdenadas evidentemente se va al traste por el espacio.-... La solución que pense es copiarlo ponerle por ej:playerinfo2 y correjir las coordenadas mas cortas etc....pero al cambiarle el nombre tambien fallan otros muchos scrips vinculados a playerinfo incluidos vida, daño etc.... Alguna idea?Como dejar intacto el pastel y modificar eso? sin renombrar? Gracias de antemano.    

Julio 22, 2015, 03:29:06 PM #1 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
Yo en la instrucción, usaría variables en vez de valores fijos.

transform.position = new Vector3(Random.Range(400.0f, 700.0f), 0, Random.Range(300.0f, 800.0f));transform.position = new Vector3(Random.Range(Xmin, Xmax), 0, Random.Range(Ymin, Ymax));

Esas variables las definiría al principio y luego en cada escena, pues las ajustaría. Aunque no sé si tu escena tiene su propio "playerinfo" o si lo estás arrastrando de las escenas anteriores con algún "DontdestroyonLoad". Si la escena tiene su propio player info, pues puedes ajustarle las variables fácilmente, si la escena arrastra el playerinfo del nivel anterior, pues tendrás que actualizar las variables por código al empezar el nuevo nivel.

@Adngel mi heroe a vuelto !!! , bien bien interesante!!, pero para un lerdo como yo... Me lo puedes poner mas marticadito?, algun pedazo de codigo? asi aprendo a velocidad rayo  las animaciones van a tope gracias a ti.Si lo que ago es llevarme el player de el nivel anterior e aqui el problema que en el otro nivel mola pero aquí.....se sale de ruta :).Porvafor maestro ilustrame de nuevo!!! A la espera.Graciasss 

Julio 22, 2015, 04:05:05 PM #3 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
Se trata de crear variables, en tu código, como has hecho con la salud, la duración de las animaciones, esas cosas, crear un "espacio" donde poder guardar información, por ejemplo de tipo int (números sin decimales).Ahí arriba, junto con las demás variables (además, al ser public, deberían aparecer en el inspector para poder cambiar su valor).

public int Xmin = 400;
public int Xmax = 700;
public int Ymin = 300;
public int Ymax = 800;

Y luego, en la instrucción donde trasladas el personaje, no le pongas números, ponle esas variables.

transform.position = new Vector3(Random.Range(400.0f, 700.0f), 0, Random.Range(300.0f, 800.0f));
transform.position = new Vector3(Random.Range(Xmin, Xmax), 0, Random.Range(Ymin, Ymax)); /-----------------/

Sobre la actualización de variables, pues en el nuevo nivel, tendrás algún lugar o script donde manejes las variables más generales del nivel (el nombre, los puntos, la música), no sé, si no lo tienes, pues crea algún script nuevo para esta actualización, lo que tienes que hacer es localizar el objeto que tiene este script "PlayerInfo" para aplicarle un GetComponent. Ya con la conexión, pues cambias esas variables como necesites para el nuevo nivel, (si es una cueva, imagino que querrás bajas la Ymax para que no sobrepase la altura de la cueva).

Pero sigo pensando que a lo mejor no te hace falta, si estás usando un nuevo objeto player en la 2º escena, en teoría deberias poder actualizar los datos ahí con el inspector. O.ò

Julio 22, 2015, 04:42:26 PM #4 Ultima modificación: Julio 22, 2015, 04:46:36 PM por Howling Wolf
Creo que es más simple que todo esto. Creas una nueva funcion con la formula que usas para el respawneo arreglada para la nueva escena y luego le aplicas un condicional. Si es la escena 1 llama a esta funcion, ya sabes.

Lo mas simple es lo siguiente.Crear un Arreglo de GameObject, luego lo asignas con el valor "SpawnPoint" y por ultimo creas objectos vació, le asignas el tag recién creado y por ultimo lo ubicas donde quieras que haga el respawn.Luego cada vez que inicie el juego carga todos los objectos con el tag SpanwPoint en un arreglo, por ultimo, tomas de forma aleatoria uno de estos objetos que contiene el arreglo.
public GameObject[] SpawnPoint;

void Start()
{
SpawnPoint = GameObject.Find("SpawnPoint");
}

void GameObject GetSpawnPoint()
{
return SpawnPoint[Random.Range(0,SpawnPoint.Length -1)];
}
Suerte.  

 
  • @francoe amigo mio me alegro e saber de tiiiiiiiiii @Howling Wolf tambien me alegro de saber de ti compi!!!
 Las ideas de los 3 incluio a Adgel son muy buenas , pero Francoe la nueva escena se lleva todo igual del player lo cual el respawn no se como modificarselo dentro de la nueva escena en el codigo que he puesto arriba entiendo lo que quieres decir pero no imagino como hacerlo....@Howling la idea fantastica pero recuerda que soy lerdo hahha necesito un empujoncito.....si alguno de los 3 me especifica como debo meterlo en el codigo anterior lo vere lo aprendere y seguire aprendiendo  Gracias de antemanooo!!!  
@Adngel, voy aprobar lo de la svariables, el resto de trastos de el script los he solucionado facil los he echo gameobjects y los aplico al nuevo nivel solo de momento me pica esto de el respawn.....que seguro que me saldran mas cosas pero poco a poco xd

Simple, comprueba si la escena en la que estas a cambiado..

private int LastScene;
private int CurrentScene {get{return Application.loadedLevel;}}

void Start()
{
LastScene = CurrentScene;
}

bool CheckChangeScene()
{
if(LastScene != CurrentScene)
{
   LastScene = CurrentScene;
   return true;
}
else
{
   return false;
}
}
 

@francoe1 , sigo perdido ...esto que me pones detecta el cambio de escena?, o que hace en realidad? en que afecta a las coordenadas de respawn?...me perdiiiii

Espera... Si Tu estas usando DontDestroyOnLoad entonces necesitas comprobar si se cambio de escena. de lo contrario, solo utilizando la función Start mi primer implementacion te sera util, lo que hice en la segunda seria para comprobar si cambio de escena entonces llamar nuevamente la función que recoge los SpanwPoint. 

using UnityEngine;
using System.Collections;

public class PlayerInfo : MonoBehaviour
{
public GameObject WeaponMouth;
public GameObject HealtBottle;
public GameObject MyUI;

public GameObject[] ObjectSoundAguadino;
private GameObject[] SpawnPoint;

public AudioClip AudioClipDeathA , AudioClipDeathB;   

public Animation MyAnimator;

private bool PlayerFighting;
private bool HealthShouldRespawn;   
public bool IsDeath;

public GUIText UIHealtBar;

private int CurrentHealt = 100, LastHealt;
private float timer, healthTimer;



void Start ()
{
   Cursor.visible = false;
   MyUI.SetActive(false);
   SpawnPoint = GameObject.FindGameObjectsWithTag("SpawnPoint");
}

void Update ()
{
   //No entiendo, entonces no te lo toque, quedo como estaba..
   if(!PlayerFighting)
   {
      if(CurrentHealt != 100)
      {
         timer += Time.deltaTime;
         print ("timer: " + timer);
         if(timer > 90.0f){
            CurrentHealt += 10;
            timer = 0.0f;
         }
      }
   }
   if(HealthShouldRespawn)
   {
      healthTimer += Time.deltaTime;
      
      if(healthTimer > 5.0f)
      {
         HealtBottle.gameObject.SetActive(true);
         healthTimer = 0.0f;
      }
   }

   //Si Esta muerto y precionas Espacio llama funcion Respanw.
   if(IsDeath)
   {
      if(Input.GetKeyDown(KeyCode.Space)) Respawn();
   }
   
}

public void ApplyDamage(int damage)
{
   CurrentHealt -= damage;
   UpdateHealt ();//Actualizamos Healt y Comprobamos algunos eventos.
   PlayAudio(AudioClipDeathA);
}

public void PlayerInCombat(int combat)
{
   switch(combat)
   {
   case 1 : PlayerFighting = true; break;
   default : PlayerFighting = false; break;
   }
}

private void Death()
{
   IsDeath = true;
   PlayAudio(AudioClipDeathB);
   MyAnimator.Play("muerto");
   GetComponent<FPSInputController>().enabled = false;
   GetComponent<CharacterController>().enabled = false;
   WeaponMouth.SetActive(false);
   
   foreach(GameObject tmp in ObjectSoundAguadino) tmp.SetActive(false);
   
   Cursor.visible = false;
   MyUI.SetActive(true);
}

private void Respawn()
{
   MyUI.SetActive(false);
   IsDeath = false;
   transform.position = GetSpawnPoint ().transform.position;
   GetComponent<FPSInputController>().enabled = true;
   GetComponent<CharacterController>().enabled = true;

   foreach(GameObject tmp in ObjectSoundAguadino) tmp.SetActive(true);

   WeaponMouth.SetActive(true);
   CurrentHealt = 100;
   UpdateHealt ();
}

private void UpdateHealt()
{
   if (LastHealt != CurrentHealt)
   {
      UIHealtBar.text = "Vida " + CurrentHealt + " / 100";
      if(CurrentHealt <= 0) Death();
      LastHealt = CurrentHealt;
   }
}

private void PlayAudio(AudioClip Clip)
{
   Camera.main.GetComponent<AudioSource> ().PlayOneShot (Clip);
}

private GameObject GetSpawnPoint()
{
   return SpawnPoint[Random.Range(0,SpawnPoint.Length -1)];
}

void OnTriggerEnter(Collider item)
{
   if(item.gameObject.tag == "PlayerHealthBottle")
   {
      if(CurrentHealt < 100)
      {
         CurrentHealt = CurrentHealt + 50;
         item.gameObject.SetActive(false);
         HealthShouldRespawn = true;
      }
   }
}
}
Te dejo todo el código optimizado. Suerte...

Julio 22, 2015, 07:28:37 PM #11 Ultima modificación: Julio 22, 2015, 07:36:46 PM por ramunda
Muchas gracias francoe1, genial como siempre :), y gracias también  Adngel y Wolf, tanto la solución de francoe1 como de Adngel me han servido, y sobretodo he aprendido que para mi es lo mejor. Gracias chicos!!!!P.D @franco1 no uso el DontDestroyOnLoad decidi cojer todo lo que usaria en el proximo o proximos niveles hacerlo gameobject y simplemente lo arrastro al Hirachy segun necesito.Asi tengo todo a mano por eso lo de el poder cambiar las variables porque el player se lleva las variables de el primer nivel...El codigo que me has puesto es una pasada pero donde han ido a parar todos los dinos? solo quedo1? 
public GameObject[] ObjectSoundAguadino; 
public GameObject sonidoisladino;
    public GameObject sonidoaguadino2;
    public GameObject sonidoaguadino1;
    public GameObject sonidoaguadino3;
    public GameObject sonidoaguadino4;
    public GameObject sonidoaguadino5;
    public GameObject sonidoaguadino6;
    public GameObject sonidoaguadino7; estos no los veo? o se han simplificado en la lina anterior?, de todas formas mil gracias!!!   

Julio 22, 2015, 11:39:58 PM #12 Ultima modificación: Julio 23, 2015, 01:04:44 AM por ramunda
Valeee solucionado!!! , mas problemas, estoy en el nivel 2, quiero volver al nivel 1 pero a la posición que baje lo cual cree esto: Un cubo en el lugar de bajada al level 2 llamado y tagueado SpawnPint.En la entrada de el level 2 otro cubo con un collider y este script:
using UnityEngine;
using System.Collections;

public class teleportspawnpoint : MonoBehaviour {


void OnTriggerEnter(Collider other)
/// al colisionar con en cubo...
{
   if(other.gameObject.tag == "jugador")
///...mi jugador y no un bicho....
   {
      Application.LoadLevel("laisla");
//// NIVEL1
   }
}
void OnLevelWasLoaded(int thisLevel)
/// cuando el nivel se cargue.....
{
   transform.position = GameObject.FindWithTag("SpawnPoint").transform.position;
/// deberia llevarme al cubo con este tag no?
}
}
los nombres de el level estan bien pero para no liar digo levl1 y lv2 para que nos entendamos.Bien cuando me meto en el cubo de la entrada de el nivel 2 me trasporta si, al nivel 1 pero no al cubo con tag SpawnPoint...me lleva al inicio donde empezo..que ago mal?Gracias de antemano!!!creo que estoy viendo el mal de todos mis problemas....cree una estatua que al pasar sobre ella te guardaba la posicion de el jugador al entrar de nuevo en la partida....esto esta en la estatua:
#pragma strict
private var theCollider : String;

function OnTriggerEnter (other : Collider)
{
theCollider = other.tag;
if (theCollider == "jugador")
{
PlayerPrefs.SetFloat("Checkpointx", gameObject.transform.position.x);
PlayerPrefs.SetFloat("Checkpointy", gameObject.transform.position.y);
PlayerPrefs.SetFloat("Checkpointz", gameObject.transform.position.z);
}
}
y esto en el jugador:
pragma strict
function Start () {
gameObject.transform.position.x = PlayerPrefs.GetFloat("Checkpointx");
gameObject.transform.position.y = PlayerPrefs.GetFloat("Checkpointy");
gameObject.transform.position.z = PlayerPrefs.GetFloat("Checkpointz");
}
y bien por mucho que desactivo estos scripts hasta borrar la estatua el Unity lo recuerda y claro cuando subo al nivel 1 me lleva al ultimo lugar donde estaba dicha estatua....como demonios le borro la memoria al Unity?.Me tiene pillado los player pref....si cargara el unity sin los scripts ?, se limpiaria?Ideas por favor...:(   

Etiquetas: