Noticias

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

Restar vida a jugador

Iniciado por ramunda, Julio 29, 2015, 02:14:49 PM

Tema anterior - Siguiente tema
Hola muy buenas, tengo una duda que no se porque no me deja este script a añadirle un gameobjecr.Explico tengo una bala enemiga que colisiona con mi jugador y lo que quiero es que me reste vida y llamo al script que tiene el sistema de vida pero no me hace daño:Script de sistema de vida(que funciona bien menos con la bala)
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 GameObject cave1;
public Animation muerto2;
public float length;

public int Xmin = 400;
public int Xmax = 700;
public int Ymin = 300;
public int Ymax = 800;
//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);
         cave1.GetComponent<AudioSource>().enabled = 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(Xmin, Xmax),0, Random.Range(Ymin, Ymax));
   //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);
   cave1.GetComponent<AudioSource>().enabled = 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 = false;
      }
   }
}
}
Lineas desde la 117 a la 128 es donde al recibir daño ejecute su función.son estas: 
public void ApplyDamage(int damage){
   damageCount = damageCount + damage;
   if(damageCount == 100){
      if(currentHealth < 0){
         currentHealth = 0;
      }
      currentHealth = currentHealth - 30;
bien eso esta claro. Ahora el de la bala:
using UnityEngine;
using System.Collections;
public class Dañodebala : MonoBehaviour {
public PlayerInfo character;
float Dano = 150;

void OnCollisionEnter


( Collision info  ){
info.transform.SendMessage("ApplyDammage", Dano, SendMessageOptions.DontRequireReceiver);
}
}
 le digo que si entra en contacto con el "jugador" le aplique el daño XXXXarriba le defino el public PlayerInfo que es donde están las variables de vida.(el script primero de arriba).Bien pues la bala impacta con mi jugador, en mi capsule collider, pero no me resta vida. No se si me explico muy bien...pero mas o menos es eso.Y no se porque!! no me hace daño, alguna idea por favor?  

Al principio de la funcion ApplyDamage (int damage), dentro del script PlayerInfo, haces una comprobacion de la cantidad de daño antes de aplicar el daño sobre la vida del jugador y solo restara el daño cuando la cantidad sea igual a 100; en el script de la bala tienes definido el daño a 150. Dado esta situacion, no aplicara nunca el daño sobre el jugador porque la condicion ya mencionada dentro de la funcion ApplyDamage (int) nunca sera cierta y por lo tanto salta todo el codigo. Ahora que ya sabes el motivo por el que no funciona, arreglarlo es cosa tuya.p.d.s.i. (post data sin importancia) xd eres consciente del toston que es esto ?

Solo por curiosidad, ¿Por que no haz optimizado el código?, lo digo por tu bien, ese script tiene muchas lineas innecesarias y mal implementadas.*Aprende a Usar Arreglos.
*No hagas comprobaciones innecesarias EJ: Ejecuta este evento solo cuando la salud sea Igual o Menor a cero.
if(currentHealth <= 0 && !muerto )
*Por ultimo, revisa el código que te pase la otra vez y trata de entender las cosas, lo digo por tu bien, para que puedas armar las cosas mas prolijas y fáciles de leer y optimizar.

Julio 29, 2015, 03:40:42 PM #3 Ultima modificación: Julio 29, 2015, 03:57:10 PM por ramunda
[quote author=Arthure" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100900">Al principio de la funcion ApplyDamage (int damage), dentro del script PlayerInfo, haces una comprobacion de la cantidad de daño antes de aplicar el daño sobre la vida del jugador y solo restara el daño cuando la cantidad sea igual a 100; en el script de la bala tienes definido el daño a 150. Dado esta situacion, no aplicara nunca el daño sobre el jugador porque la condicion ya mencionada dentro de la funcion ApplyDamage (int) nunca sera cierta y por lo tanto salta todo el codigo. Ahora que ya sabes el motivo por el que no funciona, arreglarlo es cosa tuya.p.d.s.i. (post data sin importancia) xd eres consciente del toston que es esto ?[/quote]Arthure, gracias por responderme , Er creo que esta claro tu explicación es mas que literaria que tengo mas daño e el que el jugador tiene definido por lo cual salta, entonces si pongo un valor mas bajo....seria esto pues:
}
}
Lo malo es que sigue sin restarme vida muerto .Lo que me comentas de el If......no entiendo donde deberia de ir.El codigo que me pasates al otra vez lo estudie , implemente y acabo en desastre total, no por ti por mi!!!...faltabasn cosas no sabia donde poner las otras trastee mucho y la lie parda.No pedire para nada que me lo arregleis, no es etico , pero si desinterasadamente quieres echarme un cable te lo agradecere. Sino de momento gracias.De verdad , es un pu**** casos....lo reconozco cada vex que lo miro digo vaya ensaladilla rusa.....Ufff, intentare....(acabara no funcionado )..... Aix , gracias de nuevo.   

no te ofendas, no te dare la solucion pero si con la explicacion que te he dado no has encontrado como arreglarlo para que las balas le quiten vida al jugador, mi gran consejo seria aprovechar el tiempo en otra cosa (de buen rollo). has probado a coleccionar sellos o monedas ? con el tiempo se revalorizan y ganaras maspruebo a explicarte el problema que tienes otra vez (mas claro no sera, porque tampoco se puede) : le dices al jugador que cuando el daño sea IGUAL (no menor y tampoco mayor, solo igual) a 100, le baje la vida y por otro lado tienes una bala que hace 150 de daño (que ahora sin ningun sentido has bajado a 50 a ver si sonaba la flauta). como te he dicho, mas claro no se puede sin darte la solucion directamente.si fuera tu, intentaria durante un tiempo mas esto de la programacion, y si no siempre te quedaran los sellos y las monedas. un saludo y suerte

Julio 29, 2015, 04:03:34 PM #5 Ultima modificación: Julio 29, 2015, 07:10:20 PM por ramunda
[quote author=Arthure" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100904">no te ofendas, no te dare la solucion pero si con la explicacion que te he dado no has encontrado como arreglarlo para que las balas le quiten vida al jugador, mi gran consejo seria aprovechar el tiempo en otra cosa (de buen rollo). has probado a coleccionar sellos o monedas ? con el tiempo se revalorizan y ganaras maspruebo a explicarte el problema que tienes otra vez (mas claro no sera, porque tampoco se puede) : le dices al jugador que cuando el daño sea IGUAL (no menor y tampoco mayor, solo igual) a 100, le baje la vida y por otro lado tienes una bala que hace 150 de daño (que ahora sin ningun sentido has bajado a 50 a ver si sonaba la flauta). como te he dicho, mas claro no se puede sin darte la solucion directamente.si fuera tu, intentaria durante un tiempo mas esto de la programacion, y si no siempre te quedaran los sellos y las monedas. un saludo y suerte[/quote]@arthure, no me ofendo para nada hombre, ya se que soy un lerdo de cojones hahhaa, Aver Mas claro no ni mas alto no. se me ha ido la pinza , me lo dices mas que claro. 100.Pero entonces le estamos diciendo a la bala que aga 100 de daño, y la vida de mi jugador es de 100, me mataria de un solo disparo?Mi cabeza decia que el float Dano era el daño que hacia la bala al impactar.Veo que no.Bien le puse 100using UnityEngine;
using System.Collections;
public class Dañodebala : MonoBehaviour {
public float Dano = 100;    void OnCollisionEnter
    ( Collision info  ){
    info.transform.SendMessage("ApplyDammage", Dano, SendMessageOptions.DontRequireReceiver);
    }
}pero sigue sin restar vida :(

Vamos por paso.Debes crear un componente para la salud, llamemoslo HealtInfo vamos al código
public class HealtInfo : MonoBehaviour 
{
public int MaxHealt = 1;
public int MinHealt = 0;

private int CurrentHealt;
public int GetHealt{get{return CurrentHealt;}}

private bool Death;
public bool IsDeath{get{return Death;}}

public void ApplyDamage(int Value)
{
   CurrentHealt -= Value;
   HealtChange();
}

public void ApplyHealt(int Value)
{
   CurrentHealt += Value;
   HealtChange();
}

public void Reset()
{
   CurrentHealt = MaxHealt;
}

private void HealtChange()
{      
   if(CurrentHealt <= MinHealt)Death = true;
   CurrentHealt = Mathf.Clamp(CurrentHealt,MinHealt,MaxHealt);
}
}
Bien, ahora necesitamos los proyectiles.

public class Bullet : MonoBehaviour
 {
float Danio = 50;

void OnCollisionEnter(Collision col)
{
   var healtInfo = col.transform.GetComponent<HealtInfo>();
   if(healtInfo == null)return;
   healtInfo.ApplyDamage(Danio);
}
}
Y con eso, todo debería funcionar.

Julio 29, 2015, 04:57:49 PM #7 Ultima modificación: Julio 29, 2015, 05:33:21 PM por ramunda
[quote author=francoe1" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100908">Vamos por paso.Debes crear un componente para la salud, llamemoslo HealtInfo vamos al código
public class HealtInfo : MonoBehaviour{
public int MaxHealt = 1;
public int MinHealt = 0;

private int CurrentHealt;
public int GetHealt{get{return CurrentHealt;}}

private bool Death;
public bool IsDeath{get{return Death;}}

public void ApplyDamage(int Value)
{
   CurrentHealt -= Value;
   HealtChange();
}

public void ApplyHealt(int Value)
{
   CurrentHealt += Value;
   HealtChange();
}

public void Reset()
{
   CurrentHealt = MaxHealt;
}

private void HealtChange()
{      
   if(CurrentHealt <= MinHealt)Death = true;
   CurrentHealt = Mathf.Clamp(CurrentHealt,MinHealt,MaxHealt);
}
}
Bien, ahora necesitamos los proyectiles.
public class Bullet : MonoBehaviour
 {
float Danio = 50;

void OnCollisionEnter(Collision col)
{
   var healtInfo = col.transform.GetComponent<HealtInfo>();
   if(healtInfo == null)return;
   healtInfo.ApplyDamage(Danio);
}
}
Y con eso, todo debería funcionar.[/quote]Woooo esto mola, pero , y perdona no quiero parecer estupido(un poco si lo soy), pero este codigo que me ofreces donde va?, que con tanto sarao ya no se que estamos moficando, porque esto que me has puesto lo entiendo , es un sistema de vida y el otro que la bala resta vida llamando a este script.Pero esto es para ponerlo en el que tengo?, es uno aparte ? nuevo?, porque en mi PlayerInfo tengo animaciones sonidos y demas.Perdona la incertidumbre.Edito:ya que has sido tan amable de ponrmelos los he querido probar , el primer script no da problemas el segundo el de la baslas si:var healtInfo = col.transform.GetComponent<HealtInfo>();
        if(healtInfo == null)return;
        healtInfo.ApplyDamage(Danio);Salen asi en rojo   

Lo especifique al principio del Topic, crear un Nuevo Componente. para HealtInfo, osea crea un nuevo script

[quote author=francoe1" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100912 date=1438183806]Lo especifique al principio del Topic, crear un Nuevo Componente. para HealtInfo, osea crea un nuevo script[/quote]Eso he echo.Pero tengo errores , los he comentado hace un segundo mas arribagracias 

Has puesto bien el nombre del componente en GetCompoenent

Julio 29, 2015, 05:44:01 PM #11 Ultima modificación: Julio 29, 2015, 06:10:30 PM por ramunda
[quote author=francoe1" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100914">Has puesto bien el nombre del componente en GetCompoenent[/quote]Si, ya encontre el fallo, en tu script pones :var healtInfo = col.transform.GetComponent<HealtInfo>();Falta una h detras de la t de Healt....hSigue el eror en las siguientes lineas: healtInfo.ApplyDamage(Danio);Aqui el fallo esta en la H dbe ser mayuscula y falta la h despues de healt...h de nuevo.Espera esto peta todo faltan h/es  y mas cosas dame unos minutosYa esta asi esta bien:
								

public class Bullet : MonoBehaviour
{

float Danio = 50;

void OnCollisionEnter(Collision col)
{
   HealthInfo healthInfo = col.transform.GetComponent<HealthInfo>();
   if(healthInfo == null)return;
   healthInfo.ApplyDamage(Danio);
}
}
No puedes acceder a un métodos de HealthInfo si este no es estático, debes crear una referencia al objeto, por eso eh creado esa "var" que se transforma en HealthInfo al ser asignada en la misma linea por ese componente.Ahora directamente puse el tipo HealthInfo y lo asigno, con el GetComponente, tomando la referencia desde el objeto colisionado.Debería funcionar.

[quote author=francoe1" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100916">
public class Bullet : MonoBehaviour{

float Danio = 50;

void OnCollisionEnter(Collision col)
{
   HealthInfo healthInfo = col.transform.GetComponent<HealthInfo>();
   if(healthInfo == null)return;
   healthInfo.ApplyDamage(Danio);
}
}
No puedes acceder a un métodos de HealthInfo si este no es estático, debes crear una referencia al objeto, por eso eh creado esa "var" que se transforma en HealthInfo al ser asignada en la misma linea por ese componente.Ahora directamente puse el tipo HealthInfo y lo asigno, con el GetComponente, tomando la referencia desde el objeto colisionado.Debería funcionar.[/quote]Sigue sin funcionar.Bullet.cs(13,28): error CS1502: The best overloaded method match for `HealthInfo.ApplyDamage(int)' has some invalid argumentsBullet.cs(13,28): error CS1503: Argument `#1' cannot convert `float' expression to type `int'Si cambio la H de la linea : 
healthInfo.ApplyDamage(Danio);
Por una H mayuscula me da solo este:Bullet.cs(13,28): error CS0120: An object reference is required to access non-static member `HealthInfo.ApplyDamage(int)'   

Te Dejo un UnityPackage y pégale un ojo, están estos dos script mas una pequeña modificación en el del bullet, pero todo funciona.  
http://unityspain.com/applications/core/interface/file/attachment.php?id=8216">Player Healt.unitypackage

Etiquetas: