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.
[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
[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
![:( date=1438178102]
</div><!-- .postbody -->
<div class= :(](Smileys/invision/default_sad.png)
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ódigopublic 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 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ódigopublic 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