Noticias

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

Mejor manera para un script healthBar

Iniciado por joserico, Junio 06, 2016, 04:36:51 PM

Tema anterior - Siguiente tema
Hola, he estado programando un script para gestionar la salud de los personajes pero no consigo lo que me interesa, que es que cada personaje tenga su propia animación de muerte y sus propios efectos. Lo que me falta es lo siguiente:
 

//en el archivo healthBar.cs que lo incluyo como componente script a cada personaje
    public void die()
    {
        //Aquí debería encontrar por ejempo el script "arquero.cs" o "catapulta.cs" donde tengo la función die();
        //y hacer algo como:
        someScript = gameObject.GetComponent<"arquero o catapulta">();
        someScript.die();
    }

 
La estructura sería algo así
 


  •    Arquero

       - Arquero.cs (componente script donde tengo su manera de morir)

       - HealthBar.cs (Común a todos los personajes)


  •    Catapulta

       - Catapulta.cs (componente script donde tengo su manera de morir)

       - HealthBar.cs (Común a todos los personajes)


El problema es que no encuentro la manera de pasar el componente script (arquero o catapulta) en una variable que luego pueda utilizar según el personaje que sea...
 
Gracias, espero que se entienda.

Recógela al principio con un Public, desde el Inspector, y así la llamas cuando te apetezca...


public GameObject myScript;
someScript = gameObject.GetComponent<myScript>();

 
Algo asi? He probado con todo pero no sé de qué tipo tengo que declararlo para luego arrastrarlo y poder recoger el componente :(

Creo recordar que hay un tipo de datos scrip, scriptReference o algo así (no tengo Unity aquí).
 
en lugar de buscarlo lo asignas en el inspector al crear la variable publica te dejará hacerlo así. 
 
 
 
 

Es tan fácil como añadir al script que gestiona el personaje:
 



   
      public MiComponente variable;  //MiComponente es el nombre de fichero que tiene tu otro script, el de Die.
   

[/quote]
 
Y luego, desde el Inspector, arrastras el script que lleva el Die.
 
Y, más tarde, en el script anteriormente mencionado, podrás llamar al Die de la siguiente forma:
 

public void Die() {
     variable.Die(); //o como se llame el método de morir....
}

 
 
 
Si no entiendes lo que te estoy diciendo, lo mejor es que primero aprendas un poco más la documentación oficial sobre cómo acceder a componentes. Te recomiendo éste:
 
https://unity3d.com/es/learn/tutorials/topics/scripting/how-communicate-between-scripts-and-gameobjects?playlist=17117
 
 

Junio 07, 2016, 11:51:35 AM #5 Ultima modificación: Junio 07, 2016, 11:53:24 AM por joserico
Bueno después de un día probando no lo consigo, creo que no es tan fácil como pensaba. Este es mi código:
 

using UnityEngine;
public class HealthBar : MonoBehaviour
{
    public float maxHealth = 100;       //Salud máxima
    public float curHealth = 100;       //Salud actual
   
    public GameObject bar;              //Objeto donde arrastramos la barra
    public Component script;            
   
    void Start()
    {
        receiveDamage(0);               //Actualiza el tamaño de la barra de salud
    }
    //Actualiza la barra de salud
    void updateHealth(float myHealth) {
        bar.transform.localScale = new Vector2(myHealth, bar.transform.localScale.y);
    }
    void callCharacterDie()
    {
        gameObject.GetComponent<script>().die();
    }
    public void receiveDamage(float damage)
    {
        curHealth -= damage;
        float calcHealth = Mathf.Clamp(curHealth / maxHealth, 0f, maxHealth);
        updateHealth(calcHealth);
        if (calcHealth <= 0)
        {
            callCharacterDie();
        }
    }
}

 
Donde la variable script de tipo componen dan error. No puedo hacer script.die(); como yo esperaba
 

public Component script;
void callCharacterDie()
    {
        gameObject.GetComponent<script>().die(); //La variable script arrastro el componente arquero y catapulta pero no funciona aquí
    }

 
Seguro que es tan fácil como decis pero no doy con la solución

existen tres opciones : aprender programacion, mirar la documentacion o intentar a ciegas sin saber lo que se va haciendo ... tu escoges la tercera, que por cierto es la menos buena (la unica mala).
 
en getComponent se le tiene que indicar la clase que se quiere recuperar, no el nombre de ninguna variable.
 
si haces una variable publica para asignarla desde el inspector, despues es una tonteria hacer getComponent porque estas gastando recursos para obtener un script que en teoria ya has asigando desde el inspector.

Como ya te han comentado, mira un poco más el tema de programación. Como te dice Arthure (tranquilo al principio pasa) si creas una variable pública es tontería luego buscarla. 
 
Si creas la variable de tipo Script, y la asignas en el inspecto, luego llamas a sus métodos, creo que más claro que como te lo ha dicho pioj no se puede. 
 

public Script variableScript;  
 
void callCharacterDie()
    {
       variableScript.die();
    }

 
 
 
Por otro lado hacer el GetComponent cada vez que recibes daño es gastar muchos recurso recursos. Si lo pones publico (por inspector) no se busca, y si lo buscas hazlo en el start y asignalo a una variable.  

Junio 07, 2016, 03:58:33 PM #8 Ultima modificación: Junio 07, 2016, 04:01:24 PM por joserico
Sinceramente gracias por tú comentario Arthure, me motiva mucho. Espero que no necesites nunca ayuda con Photoshop o Illustrator porque te voy a enumerar unas cuantar razones.
 
He puesto el ejempo anterior porque con esto y es como devería funcionar no funciona
 

public Component script; //En el inspector arrastro el componente script catapulta o arquero
script.die();

 
 
 
 
 
 
 
 
 
Cita de: Ufita date=1465307850Como ya te han comentado, mira un poco más el tema de programación. Como te dice Arthure (tranquilo al principio pasa) si creas una variable pública es tontería luego buscarla. 
   
   
      Si creas la variable de tipo Script, y la asignas en el inspecto, luego llamas a sus métodos, creo que más claro que como te lo ha dicho pioj no se puede. 
   
   

public Script variableScript;  
 
void callCharacterDie()
    {
       variableScript.die();
    }

   
       
   
   
      Por otro lado hacer el GetComponent cada vez que recibes daño es gastar muchos recurso recursos. Si lo pones publico (por inspector) no se busca, y si lo buscas hazlo en el start y asignalo a una variable.  
   


Hola Ufita, es que el tipo "Script" que comentas no existe. Yo lo asigno a Component pero luego no funciona

Pues lo acabo de copiar de un mail del profesor donde estoy estudiando unity, aquí no tengo el ejercicio, pero el mail con las correcciones son esas. 
 
 

Pues me dice que no es un tipo válido

Junio 07, 2016, 04:15:22 PM #11 Ultima modificación: Junio 07, 2016, 04:18:31 PM por Ufita
Creo que nos estamos liando los dos, entre lo que quieres hacer y lo que estoy haciendo yo. Por un lado esa variable script, es en minúsculas script  por otro lado, en un gameobject busco el script que tiene asignado, en mi caso lo hago en el start. 
 
Donde el "Script" que busca el find es un gameobject en la escena, será el nombre que tu tengas.
 

void Start () {
   script hipercubo = GameObject.Find ("Script").GetComponent<script>();
}

 
 
 
Ya luego en la variable (en mi caso hipercubo) tendrás todos los metodos.
 
 
 
Siento si te estoy liando más, yo también soy algo nuevo en esto, pero entiendo que lo que te han dicho los expertos, es más o menos esto.
 
Edito para agregar una imagen, que aquí tengo una versión antigua del tema. 

He creado un pequeño vídeo a ver si las cosas quedan más claras.
 


   
eature=oembed" width="480">

 
Gracias Ufita, a ver si así queda un poco más claro

Junio 07, 2016, 06:41:50 PM #13 Ultima modificación: Junio 07, 2016, 06:44:38 PM por pioj
Te lo puse al principio y parece que no te diste cuenta:
 



   
      public MiComponente variable;  //MiComponente es el nombre de fichero que tiene tu otro script, el de Die.
   

[/quote]
 
Es decir, tu variable llamada "variable Script", no ha de ser de tipo Component, como has puesto. Ha de ser de tipo CatapultaScript.
 
Eso, por una parte.
 
Y como te hemos puesto varios por aquí ya, te lo vuelvo a recomendar:
 
Repásate los tutoriales de Components y de acceso a GameObjects que hay en la web oficial de Unity. Y si tienes dudas, pues preguntas...
 
 
 
Te invito a que te pases por el grupo de Skype o de Telegram, y @Arthure, yo, y otros más estaremos encantados de enseñarte por Teamviewer, si lo crees necesario, la confusión que estás teniendo...

Junio 07, 2016, 06:48:17 PM #14 Ultima modificación: Junio 07, 2016, 07:31:05 PM por joserico
@pioj Si con eso no tengo dudas. Entiendo que si pongo "CatapultaScript" funciona pero quiero que fincione tanto "CatapultaScript" como "ArqueroScript"
 
¿Cómo harías tú el Script? Abajo dejo mi código healthBar completo. Añade las modificaciones que creas oportunas.
 

using UnityEngine;
public class HealthBar : MonoBehaviour
{
    public float maxHealth = 100;       //Salud máxima
    public float curHealth = 100;       //Salud actual
   
    public GameObject bar;              //Objeto donde arrastramos la barra
    public Component script;            
   
    void Start()
    {
        receiveDamage(0);               //Actualiza el tamaño de la barra de salud
    }
    //Actualiza la barra de salud
    void updateHealth(float myHealth) {
        bar.transform.localScale = new Vector2(myHealth, bar.transform.localScale.y);
    }
    void callCharacterDie()
    {
        script.die();
    }
    public void receiveDamage(float damage)
    {
        curHealth -= damage;
        float calcHealth = Mathf.Clamp(curHealth / maxHealth, 0f, maxHealth);
        updateHealth(calcHealth);
        if (calcHealth <= 0)
        {
            callCharacterDie();
        }
    }
}

 
A la variable script de abajo tengo que instanciar tanto "arqueroScript" como "catapultaScript" para según el personaje que muera llame a una función u otra de los scripts arqueroScript o catapultaScript
 

public Component script;

 
Llevo dós días leyendo tutoriales y nada funciona! Gracias

Etiquetas: