Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: ramunda en Julio 29, 2015, 02:14:49 PM

Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 02:14:49 PM
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?  
Título: Restar vida a jugador
Publicado por: Arthure en Julio 29, 2015, 02:35:21 PM
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 ?
Título: Restar vida a jugador
Publicado por: francoe1 en Julio 29, 2015, 02:58:42 PM
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.
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 03:40:42 PM
[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 Título: Restar vida a jugador
Publicado por: Arthure en Julio 29, 2015, 03:55:02 PM
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
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 04:03:34 PM
[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 :( Título: Restar vida a jugador
Publicado por: francoe1 en Julio 29, 2015, 04:45:53 PM
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.
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 04:57:49 PM
[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   
Título: Restar vida a jugador
Publicado por: francoe1 en Julio 29, 2015, 05:30:06 PM
Lo especifique al principio del Topic, crear un Nuevo Componente. para HealtInfo, osea crea un nuevo script
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 05:34:15 PM
[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 
Título: Restar vida a jugador
Publicado por: francoe1 en Julio 29, 2015, 05:39:37 PM
Has puesto bien el nombre del componente en GetCompoenent
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 05:44:01 PM
[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:
				Título: Restar vida a jugador
Publicado por: francoe1 en Julio 29, 2015, 06:37:06 PM
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.
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 06:51:13 PM
[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)'   
Título: Restar vida a jugador
Publicado por: francoe1 en Julio 29, 2015, 07:06:08 PM
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.  
Player Healt.unitypackage
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 08:15:14 PM
[quote author=francoe1" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100918">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.  Player Healt.unitypackage[/quote]Bien , tiene un script de una bala parece ser en raycast y un script de vida para el player.Los cuales no puedo probar porque no tengo el script que me dispara la bala(la raycast).Antes usaba este para probar que arriba el compañero Arthure me ha dicho una manera para que me funcionara pero no va te lo ejo aqui :
}

void Shoot(){
   
   if (onRange){
      
      Rigidbody bullet = (Rigidbody)Instantiate(projectile, transform.position + transform.forward, transform.rotation);
      bullet.AddForce(transform.forward*bulletImpulse, ForceMode.Impulse);
      character.ApplyDamage(1);
      character.playerInCombat(1);
      AudioSource.PlayClipAtPoint(recarga, transform.position, 1);
      Destroy (bullet.gameObject, 2);

   
   }
   
   }

void Update() {
   
   onRange = Vector3.Distance(transform.position, player.position)<range;
   character.ApplyDamage(1);
   if (onRange)
   transform.LookAt(player);
}



}
Este dispara la bala, sale del cañon en un intervalo de 1 a 2 segundos, e impacta con mi player pero no le hace daño, Te pido POR FAVOR, que me digas que tengo mal en este script , porque por mucho que me esfuerzo no veo porque! no me quita vida, documentare cada linea segun lo que entienda de acuerdo por favor: 
using UnityEngine;
using System.Collections;

public class enemigoataca : MonoBehaviour {

public Transform player;
public float range = 50.0f; /// DISTANCIA EN QUE ME DETECTA
public float bulletImpulse= 70.0f;///FUERZA DE LA BALA
public AudioClip recarga;///SONIDO AL DIAPARA
public PlayerInfo character;///EL SCRIPT DONDE TENGO EL SISTEMA DE VIDA
private bool onRange= false;///SI NO ESTA AL ALCANCE
public Rigidbody projectile;///RIGIDBODY DE LA BALA FISICA
private int Danio = 10;/// EL DAÑO QUE ME HACE ESTA BALA????
void Start(){
   float rand = Random.Range (1.0f, 2.0f);///TIENPO DE DISPARO
   InvokeRepeating("Shoot", 1, rand);
}

void Shoot(){
   
   if (onRange){
      
      Rigidbody bullet = (Rigidbody)Instantiate(projectile, transform.position + transform.forward, transform.rotation);
      bullet.AddForce(transform.forward*bulletImpulse, ForceMode.Impulse);///LA BALA!! QUE DISPARARA QUE COJE DE ARRIBA
      //character.ApplyDamage(Danio);
      //character.playerInCombat(1);
      AudioSource.PlayClipAtPoint(recarga, transform.position, 1);/// EL SONIDO DEL DISPARO
      Destroy (bullet.gameObject, 2);///DESTRUYE LA BALA A LOS 2 SEGUNDOS

   
   }
   
   }

void Update() {
   
   onRange = Vector3.Distance(transform.position, player.position)<range;/// BUSCA AL JUGADOR SI ESTA AL ALCANCE
   character.ApplyDamage(Danio);/// APLICO EL DAÑO??????????????????????
   //character.playerInCombat(1);
   if (onRange)
   transform.LookAt(player);///SE GIRA HACIA MI JUGADOR

}



}
Esto va simplemente a un empty GO y dispara esta bala perfectamente , a los intervalos de 1 o 2 segundos, se gira hacia mi el GO y sigue disparando segun el rango de distancia que le diga.Pero no se porque! no daña a mi jugador!!Por favor y mil veces mas porfavor, el codigo lo entiendo pero no entiendo el porque!!! no funciona!!Gracias.  
Título: Restar vida a jugador
Publicado por: o0Charly0o en Julio 29, 2015, 08:40:54 PM
Hola, puedes poner el script ApplyDamage?Perdona, ya lo he visto, lo tenías arriba
public class Bullet : MonoBehaviour
{

float Danio = 50;
HealthInfo healthInfo;

    void OnCollisionEnter(Collision col)
{
   if(healthInfo == null)return;
   healthInfo.ApplyDamage(Danio);
}
}
Y si lo pones así y asignas el healtinfo desde el editor de unity (arrastrando)? los getcomponent no gastan muchos recursos? yo siempre intento evitarlos.un saludo.
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 10:51:01 PM
[quote author=o0Charly0o" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100925">Hola, puedes poner el script ApplyDamage?Perdona, ya lo he visto, lo tenías arriba MonoBehaviour{

float Danio = 50;
HealthInfo healthInfo;

    void OnCollisionEnter(Collision col)
{
   if(healthInfo == null)return;
   healthInfo.ApplyDamage(Danio);
}
}Y si lo pones así y asignas el healtinfo desde el editor de unity (arrastrando)? los getcomponent no gastan muchos recursos? yo siempre intento evitarlos.un saludo.[/quote]@o0Charly0o, antes que nada agradecerte el tiempo y la molestia de reportar, gracias.Desgraciadamente lo que intento, es con el script de arriba. lo vuelvo a poner.
using UnityEngine;
using System.Collections;

public class enemigoataca : MonoBehaviour {

public Transform player;
public float range = 50.0f; /// DISTANCIA EN QUE ME DETECTA
public float bulletImpulse= 70.0f;///FUERZA DE LA BALA
public AudioClip recarga;///SONIDO AL DIAPARA
public PlayerInfo character;///EL SCRIPT DONDE TENGO EL SISTEMA DE VIDA
private bool onRange= false;///SI NO ESTA AL ALCANCE
public Rigidbody projectile;///RIGIDBODY DE LA BALA FISICA
private int Danio = 10;/// EL DAÑO QUE ME HACE ESTA BALA????
void Start(){
   float rand = Random.Range (1.0f, 2.0f);///TIENPO DE DISPARO
   InvokeRepeating("Shoot", 1, rand);
}

void Shoot(){
   
   if (onRange){
      
      Rigidbody bullet = (Rigidbody)Instantiate(projectile, transform.position + transform.forward, transform.rotation);
      bullet.AddForce(transform.forward*bulletImpulse, ForceMode.Impulse);///LA BALA!! QUE DISPARARA QUE COJE DE ARRIBA
      //character.ApplyDamage(Danio);
      //character.playerInCombat(1);
      AudioSource.PlayClipAtPoint(recarga, transform.position, 1);/// EL SONIDO DEL DISPARO
      Destroy (bullet.gameObject, 2);///DESTRUYE LA BALA A LOS 2 SEGUNDOS

   
   }
   
   }

void Update() {
   
   onRange = Vector3.Distance(transform.position, player.position)<range;/// BUSCA AL JUGADOR SI ESTA AL ALCANCE
   character.ApplyDamage(Danio);/// APLICO EL DAÑO??????????????????????
   //character.playerInCombat(1);
   if (onRange)
   transform.LookAt(player);///SE GIRA HACIA MI JUGADOR

}



}
conseguir que me reste vida a mi jugador.El script que me has escrito da 2 errores: error CS1502: The best overloaded method match for `PlayerInfo.ApplyDamage(int)' has some invalid argumentsy este error CS1503: Argument `#1' cannot convert `float' expression to type `int'esque el script que necesito que funcione es el de arriba y no hay manera de que me reste una misera vida a mi jugador .La segunda opcion , supongo que es la que tu enfocabas es darle un daño a la bala en si y que me la reste, y quitarlo de el de arriba, pero esque tampoco hay manera.....Alomejor tu le vees un color diferente al script y me puedes tirar una luz.Lo unico que puedo aportar es decir que esta linea.
private int Danio = 10;/// EL DAÑO QUE ME HACE ESTA BALA????
Lo que hace esque se baje la vida pero se para al valor que le pongas , sisi la vida baja sola de 30 en 30 ....a saber porque.Muchas gracias   
Título: Restar vida a jugador
Publicado por: o0Charly0o en Julio 29, 2015, 11:12:25 PM
declara los int como float, y recuerda que deben ir con una f despues del valor, por ejemplo:
float x = 1.0f;
 
Enviado desde mi iPhone utilizando Tapatalk
Edito: donde pones private int danio=10; pon private float danio=10f;
yo creo que es eso.
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 11:46:22 PM
[quote author=o0Charly0o" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100930">declara los int como float, y recuerda que deben ir con una f despues del valor, por ejemplo: float x = 1.0f; Enviado desde mi iPhone utilizando Tapatalk[/quote]quieres decir algo asi?private float Danio = 10.0f;/// EL DAÑO QUE ME HACE ESTA BALA????y asi?character.ApplyDamage(Danio);/// APLICO EL DAÑO??????????????????????me da 2 errores :( Título: Restar vida a jugador
Publicado por: o0Charly0o en Julio 29, 2015, 11:47:18 PM
ponlos! , seguro que por ahi van los tiros! jajaja
Título: Restar vida a jugador
Publicado por: ramunda en Julio 29, 2015, 11:55:53 PM
[quote author=o0Charly0o" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100932 date=1438206438]ponlos! , seguro que por ahi van los tiros! jajaja[/quote]Yo los pongo pero donde XDDd 
Título: Restar vida a jugador
Publicado por: o0Charly0o en Julio 29, 2015, 11:58:38 PM
pega aqui los errores que te de, y puedes poner la funcion applydamage? por lo que veo te da un error al pasar el valor, en algun sitio tienes puesto un int donde deberia ir un float, y todos los float con su f en el valor, tb puedes poner todos en int, eso al gusto, pero todos iguales, si no no rula!
Título: Restar vida a jugador
Publicado por: ramunda en Julio 30, 2015, 12:22:06 AM
[quote author=o0Charly0o" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100934">pega aqui los errores que te de, y puedes poner la funcion applydamage? por lo que veo te da un error al pasar el valor, en algun sitio tienes puesto un int donde deberia ir un float, y todos los float con su f en el valor, tb puedes poner todos en int, eso al gusto, pero todos iguales, si no no rula![/quote]Are una cosa , asi te evito molestias ya que eres tan amable de asesorarme.Este es el código donde todo se mueve (ya se que esta echo un asco pero me funciona :))
   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<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;
      


      

   
      }
   }
   healthbar.text = "Vida " + currentHealth + " / 100";
   
   if(healthShouldRespawn)
   {
      healthTimer += Time.deltaTime;
      
      if(healthTimer > 5.0f)
      {
         healthBottle.gameObject.SetActive(true);
         healthTimer = 0.0f;
      }
   }
   
   if(muerto){
      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);
      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));
   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;
   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;
      }
   }
}
}
y lo que me pides creo que es esto:
public void ApplyDamage(int damage){
   damageCount = damageCount + damage;
   if(damageCount == 100){
      if(currentHealth < 0){
         currentHealth = 0;
      }
      currentHealth = currentHealth - 30;
 
Título: Restar vida a jugador
Publicado por: o0Charly0o en Julio 30, 2015, 03:05:09 PM
character.ApplyDamage(Danio);
danio: es float, pero la función recibe un int:
public void ApplyDamage(int damage){
   damageCount = damageCount + damage;
   if(damageCount == 100){
      if(currentHealth < 0){
         currentHealth = 0;
      }
      currentHealth = currentHealth - 30;}
o declaras danio como int o pones el damage de applydamage como float y el damagecount en float tb. 
Título: Restar vida a jugador
Publicado por: ramunda en Julio 30, 2015, 03:31:41 PM
[quote author=o0Charly0o" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100962">creo que no lo has pegado entero, falta el final del codigo y tio, la funcion apllydamage, la puedes poner? xD[/quote]Hola muy buenas compañero perdona por la demora, El codigo esta entero, lo acabo de comparar este codigo es el que recibe el daño etc etc...la funcion que me pides debe ser esta  character.ApplyDamage(1);Te dejo un ejemplo de un eskeleto que tengo en el juego que me hace daño al pegarme pero es melee osea con espada. 
   skelly = gameObject;
   distance = Vector3.Distance(player.transform.position,skelly.transform.position);
      
      if (distance <= 3) {
      skelly.GetComponent<Animation>().CrossFadeQueued("Run", 0.3f, QueueMode.PlayNow);
      skelly.GetComponent<Animation>().CrossFade("SwingHeavy");
      character.ApplyDamage(1);
      character.playerInCombat(1);
      }
      else if (distance < 45 && distance > 3.0f) {
      skelly.GetComponent<Animation>().CrossFadeQueued("SwingHeavy", 0.3f, QueueMode.PlayNow);
      skelly.GetComponent<Animation>().CrossFade("Run");
      skelly.transform.LookAt(player.transform.position);
      transform.position = Vector3.MoveTowards(transform.position, player.transform.position, 0.18f);
      character.playerInCombat(1);
         
      }   
      else
      {
      skelly.GetComponent<Animation>().CrossFadeQueued("Run", 0.3f, QueueMode.PlayNow);
      skelly.GetComponent<Animation>().CrossFade("IdleHoldSword");
      character.playerInCombat(1);
      }
   }
   
   
}
linea 26 
Título: Restar vida a jugador
Publicado por: ramunda en Julio 30, 2015, 06:35:46 PM
o0Charly0o, he cho varios cambios y estoy cerca muy cerca ...pro me falta solo una cosa.Mira este es el codigo modificado: 
using UnityEngine;
using System.Collections;

public class PlayerInfo : MonoBehaviour {
public GameObject Bocaarma;
public GameObject healthBottle;
public GameObject balarigidbody;
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;


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<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){
   
      Cursor.visible = false;
      tuUI.SetActive(true);
      if(Input.GetKeyDown(KeyCode.Space)){
         Respawn();
      }
   }
   
}

public void ApplyDamage(int damage) {
   
   damageCount += damage; // Add new DamageCount
   //Than check if  damageCount is higher or equal to your limit 100
   if (damageCount >= 100) {
      //substract 30 Health from your currentHealth
      currentHealth -= 10;
      //check if health is lower than 0 when true it's set to 0 to avoid negative health.
      if (currentHealth < 0) {
         currentHealth = 0;
      }
      sonido2.PlayOneShot(deathClip);
      healthbar.text = "Health " + currentHealth + " / 100";
      damageCount = 0;
   }
   
   print(currentHealth);
}

public void playerInCombat(bool combat){
   playerFighting = combat;
   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;

   Bocaarma.SetActive(true);
   currentHealth = 100;
}

void OnCollisionEnter(Collision collision) {
   if (collision.gameObject.tag == "bala") {
      ApplyDamage(collision.gameObject.GetComponent<Dañodebala>().damage);
   }
}

void OnTriggerEnter(Collider item){
   if(item.gameObject.tag == "PlayerHealthBottle")
   {
      if(currentHealth < 100)
      {
         currentHealth = currentHealth + 50;
         item.gameObject.SetActive(false);
         healthShouldRespawn = false;
      }
   }
}
}
de la 111 a la 125.lo que no consigo hacer de ninguna manera es que no tenga que ponerle un valo fijo al daño...explico.if (damageCount >= 100) {
            //substract 30 Health from your currentHealth
            currentHealth -= 10;///////////// aquiiiii  Todos los bichos sea cual sea me hacen 10 de daño.si pongo esto:character.ApplyDamage(30);me hace 30 si.....pero a velocidad del rayo osea 30 x1000 veces rapido me quita 100 de vida en 1 milisegundo.... Porfavor dime que tienes alguna idea.....:(       
Título: Restar vida a jugador
Publicado por: o0Charly0o en Julio 30, 2015, 09:16:18 PM
void Update () {
      
   player = GameObject.FindWithTag("jugador");
   skelly = gameObject;
   distance = Vector3.Distance(player.transform.position,skelly.transform.position);
      
      if (distance <= 3) {
      skelly.GetComponent<Animation>().CrossFadeQueued("Run", 0.3f, QueueMode.PlayNow);
      skelly.GetComponent<Animation>().CrossFade("SwingHeavy");
      character.ApplyDamage(1);
      character.playerInCombat(1);
      }
...
en cuanto la distancia es menor de 3, empieza a pegarte sin parar, por eso te mata rapido, yo intentaría meter lo que hay dentro del if en una corrutina, por ejemplo:
IEnumerator pegar () {
     while (distance<=3) {
            skelly.GetComponent<Animation>().CrossFadeQueued("Run", 0.3f, QueueMode.PlayNow);
      skelly.GetComponent<Animation>().CrossFade("SwingHeavy");
      character.ApplyDamage(1);
      character.playerInCombat(1);
         yield return new WaitForSeconds(1f);

     }
 }
y lo llamas así:
StartCoroutine(pegar());
así te pegará una vez cada segundo.
Título: Restar vida a jugador
Publicado por: ramunda en Julio 31, 2015, 06:22:12 PM
[quote author=o0Charly0o" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15848" data-ipsquote-contentcommentid="100962">
character.ApplyDamage(Danio);
danio: es float, pero la función recibe un int:
public void ApplyDamage(int damage){= damageCount + damage;
   if(damageCount == 100){
      if(currentHealth < 0){
         currentHealth = 0;
      }
      currentHealth = currentHealth - 30;}
o declaras danio como int o pones el damage de applydamage como float y el damagecount en float tb. [/quote]correcto , arreglado , muchas muchas gracias!!!!