(Unity) - Variable aus einem Skript in einem anderen benutzen?
Hallöchen,
ich möchte in einem Skript auf eine Variable von einem anderen Skript zugreifen.
ich habe bis jetzt das hier:
Meine Start-Funktion:
void Start()
{
var health = (Health)gameObject.GetComponent("Health");
}
Meine Funktion wo darauf zugegriffen werden soll:
void Hurt()
{
Health--;
if(health <= 0)
{
Application.LoadLevel(Application.loadedLevel);
}
}
Ich möchte diese verknüpfen weil ich eine Lebensanzeige habe in einem Skript und in einem anderen mache ich eben das mit dem Hurt() und einer Kollisionsabfrage.
Das "health" in dem Skript "Health" ist hierbei die Anzahl der Herzen die der Spieler noch hat.
Ich möchte das sich diese Anzeige eben mitändert.
Ich weis jetzt leider nicht wie ich auf die Variable zugreife. Ich sollte die Verknüpfung in der Start-Funktion richtig gemacht haben glaube ich.
Ich hoffe ich komme hier auf die Lösung :)
2 Antworten
Dir fehlen wie gesagt noch wichtige Grundlagen für C#. Die Lösung für dein Problem habe ich dir ja bereits beschrieben, aber du kannst scheinbar mit diesen Punkten noch nichts anfangen - verstehst offensichtlich auch den obigen Code noch nicht.
Wenn man dir hier nun eine fertige Lösung präsentiert, hilft dir das nur für den Moment. Und ich bin mir sicher, du würdest danach einfach weiterstolpern, dem Ratschlag zum Trotz, sich erst einmal mit den Grundlagen der Sprache zu befassen.
Dein Fehler ist:
- Das health eine lokale Variable ist. Du brauchst aber ein Feld, welches in der ganzen Klasse sichtbar ist.
- health ist ein Objekt des Typs Health. Das ist kein numerischer Typ, auf den man einfach Rechenoperationen durchführen kann. Stattdessen musst du über das Objekt auf das Property zugreifen, welches den numerischen Typ speichert. Sofern noch kein Property für diesen Wert vorhanden ist, solltest du dir eines anlegen.
Beschäftige dich mit den Themen, die ich dir schon in meinem Kommentar aufgezählt habe. Du brauchst sie.
Dafür verwendet man in C# das hier: Eigenschaften (C#-Programmierhandbuch)
Das könnte zum Beispiel so aussehen:
public class Health : MonoBehaviour {
[SerializeField]
private int health;
public Int Health {
get { return health; }
set { health = value; }
}
}
Das benutzt man dann so:
Hurt()
{
var component = gameObject.GetComponent<Health>();
var health = component.Health;
if(health <= 0)
{
Application.LoadLevel(Application.loadedLevel);
}
}
Heal()
{
var component = gameObject.GetComponent<Health>();
if(component.Health < component.MaxHealth){
component.Health = component.Health + 1;
}
}