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

Julio 29, 2015, 08:40:54 PM #16 Ultima modificación: Julio 29, 2015, 08:44:28 PM por o0Charly0o
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.

[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   

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.

[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 :(

ponlos! , seguro que por ahi van los tiros! jajaja

[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 

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!

Julio 30, 2015, 12:22:06 AM #23 Ultima modificación: Julio 30, 2015, 12:23:53 AM por ramunda
[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;
 

Julio 30, 2015, 03:05:09 PM #24 Ultima modificación: Julio 30, 2015, 07:16:16 PM por o0Charly0o
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. 

Julio 30, 2015, 03:31:41 PM #25 Ultima modificación: Julio 30, 2015, 04:03:48 PM por ramunda
[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 

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.....:(       

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.

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

Etiquetas: