• Benvenuto in Making Videogames!
  • Condividi la tua passione!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati



Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Title: Health System
Modi discussione
#1
Salve,
Ho un problema sul pulsante Vita/danno, adesso vi spiego l'anomalia che mi incombe:

Ho fatto una cosa cosi:

[Immagine: 2qala1j.jpg]

Per far funzionare i bottoni vita e danno ho fatto questo script C#

Codice:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HealthBarSlider : MonoBehaviour
{

   public Slider slider;
   public Button buttonVita;
     public Button buttonDanno;


    //public HealthSystem healthSystem = new HealthSystem();

   // Start is called before the first frame update
   void Start()
   
   {
       
       Button btnVita = buttonVita.GetComponent<Button>();
       Button btnDanno = buttonDanno.GetComponent<Button>();

       btnVita.onClick.AddListener(ClickVita);
       btnDanno.onClick.AddListener(ClickDanno);

}

void ClickVita(){
   health(10);
    Debug.Log ("Vita: " + GetHealth());
}
   void ClickDanno(){

   damage(10);
    Debug.Log ("Danno: " + GetHealth());
}

public void health(int healthAmount){

slider.value+=healthAmount;

   }

     public void damage(int healthAmount){

slider.value-=healthAmount;

   }

     public float GetHealth(){
     return (float) slider.value;
 }
void Update()
   {
       
   }

   }

E fin qui tutto ok. Se premo il bottone danno e Vita decresce e aumenta lo slider che sta in basso a sinistra.

Poi ho provato a dividere il codice in 2 script cosi:

Codice:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HealthSystem
{
 
private Slider slider;

   public void health(int healthAmount){

slider.value+=healthAmount;

   }

     public void damage(int healthAmount){

slider.value-=healthAmount;

   }

     public float GetHealth(){
     return (float) slider.value;
 }
}
Codice:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HealthBarSlider : MonoBehaviour
{

  public HealthSystem healthSystem;

   public Button buttonVita;
     public Button buttonDanno;


    //public HealthSystem healthSystem = new HealthSystem();

   // Start is called before the first frame update
   void Start()
   
   {
       
       Button btnVita = buttonVita.GetComponent<Button>();
       Button btnDanno = buttonDanno.GetComponent<Button>();

       btnVita.onClick.AddListener(ClickVita);
       btnDanno.onClick.AddListener(ClickDanno);

}

void ClickVita(){
   healthSystem.health(10);
    Debug.Log ("Vita: " + healthSystem.GetHealth());
}
   void ClickDanno(){

   healthSystem.damage(10);
    Debug.Log ("Danno: " + healthSystem.GetHealth());
}


void Update()
   {
       
   }

   }

Ma quando provo ad usare il bottone vita o danno mi esce questo errore:

[Immagine: 11kw1s8.jpg]

Come posso fare per gestire questo problema?

Grazie Smile
 
Reply
#2
Ciao, rispondo qui al tuo problema così che potrebbe essere d'aiuto anche a qualcun'altro.
Ho trovato diversi errori da sistemare. Non dovresti neanche arrivare all'errore che da a te perché ci sono altri errori  in precedenza.
Mi raccomando di cercare di capire cosa hai sbagliato e perché, prima di copiare e incollare il codice corretto. Tongue

ERRORE 1.
Prima di tutto, l'errore che si nota subito dai tuoi scripts è che la classe HealthSystem non deriva da MonoBehaviour.
Già questo non fa caricare lo script.

L'apertura della classe dovrebbe essere così:

public class HealthSystem : MonoBehaviour

{   ......

Come descritto in questo articolo, MonoBehaviour è la classe base da cui derivano tutti gli scripts di Unity. Behaviour significa appunto “comportamento generico”. Senza di esso lo script non viene riconosciuto da Unity.


ERRORE 2.
In HealthBarSlider hai dichiarato i Button come variabili della classe (e va bene), ma poi dentro a Start le dichiari di nuovo con altri nomi, creando così altre due variabili nuove e poi fai riferimento a quelle.

Tu hai scritto così:

Codice:
public class HealthBarSlider : MonoBehaviour
{

   public HealthSystem healthSystem;

   public Button buttonVita;
   public Button buttonDanno;


   // Start is called before the first frame update
   void Start()

   {

       Button btnVita = buttonVita.GetComponent<Button>(); //Qui tu dichiari altre due nuove variabili
       Button btnDanno = buttonDanno.GetComponent<Button>();
.....

Come ho descritto nell'articolo riguardante l'inizializzazione delle variabili è importante capire cosa sia lo scopo.
Lo scopo è semplicemente lo spazio racchiuso tra le parentesi graffe. Si tratta del contesto in di un certo pezzo di codice delimitato dalle parentesi graffe. Dunque una classe ha il suo scopo, un metodo ha il suo scopo.
Se dichiari una variabile dentro ad uno scopo (nel tuo caso dentro al metodo Start) essa sarà visibile solo all'interno del metodo Start e non sarà possibile richiamarla o lavorarci all'esterno di tale metodo.
Le variabili vanno dichiarate al di fuori di un metodo (dentro lo scopo della classe).

Il ltuo codice dovrebbe essere così:

Codice:
public class HealthBarSlider : MonoBehaviour
{

   public HealthSystem healthSystem;

   public Button buttonVita; //Dichiaro le variabili qui, non dentro Start
   public Button buttonDanno;


   // Start is called before the first frame update
   void Start()

   {

       buttonVita = buttonVita.GetComponent<Button>(); //Ora sono accessibili in tutta la classe
       buttonDanno = buttonDanno.GetComponent<Button>();

       buttonVita.onClick.AddListener(ClickVita);
       buttonDanno.onClick.AddListener(ClickDanno);

   }

ERRORE 3.
In HealSystem dichiari lo slider come private. In questo modo non lo puoi linkare dall'inspector perché non pubblico.
Codice:
public class HealthSystem : MonoBehaviour
{

   private Slider slider;


Dovrebbe essere così:

Codice:
public class HealthSystem : MonoBehaviour
{

   public Slider slider;
A questo punto puoi trascinare il gameObject dello Slider nell'inspector dello script così che sia linkato ad esso.


Prova a sistemare queste cose e vedi se risolvi. Wink
 
Reply
#3
Grazie, ora funziona Smile
 
Reply
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Snapping System ottimizzato. Penca53 11 1,447 13-08-2017, 01:52 PM
Ultimo messaggio: aandrea1974
  iRDS - Intelligent Race Driver System info mattew1 2 576 10-06-2017, 03:52 PM
Ultimo messaggio: mattew1
  Spawnare un particle system con il mouse samuele55598@gmail.com 20 2,593 26-06-2015, 11:26 AM
Ultimo messaggio: Lorenz
  Problema script health bar per gioco 2D Master Gabriel 14 2,457 05-02-2015, 11:18 AM
Ultimo messaggio: Master Gabriel

Vai al forum:


Browsing: 1 Ospite(i)