Jump to content
Unity Insider Forum

Ärger mit Variabel die übergreifend nicht addiert


Ricky-W

Recommended Posts

Hallöchen,

was ich versuche: Ich würfle 5 Würfel (was sonst 😉 ) mit trigger ermittle ich wie die Würfel liegen (klappt soweit) nun müsste sich die Variable "Teilsumme" 5 mal mit anderen variabel hoch addieren. Tut´s aber nicht, sie bekommt den Wert vom script aber nicht von den anderen. Hab es mit public, static und private probiert. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Trig_6 : MonoBehaviour {
	public float Trig6;
	public float TeilSumme;
	 void OnTriggerEnter(Collider other) {
    if (other.tag == "Spielfeld") {
        Trig6 = Trig6 + 0.1f;
			TeilSumme = TeilSumme + Trig6;
			
    }
}

}

 

Fehler_1.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da du etwas addieren willst, solltest du die public Variable mit 0 initialisieren. Es nur zu deklarieren genügt nicht. Er kann nicht zu "nichts" etwas dazu addieren. Es sollte daher mit einer Zahl initialisiert werden.

Static spielt an der Stelle keine Rolle. Esseidenn du willst von einer anderen Klasse darauf zugreifen. public und private spielt ebenfalls keine Rolle. Hauptsache die Variable ist global.

Anschließend kannst du schreiben Teilsumme += Trig6.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die schnelle Antwort, aber funkt noch nicht wie gewollt, habe aber zusätzlich ein anderes Problem (wäre auch verwunderlich wenn nicht 😉 ) . Theoretisch müsste je bei einen Würfel nur ein wert sein, aber bei 3 Würfel ist es nicht so. Obwohl der Collidertrigger nur bei Spielfeld berühren reagieren sollte, tut er es höchstwahrscheinlich öfters, zumindest zeigt er mir bei mehreren Collider einen Wert an. Die Würfel rollen auch nicht, so dass sie auch nicht auf verschiedenen Seiten das Spielfeld berühren können.

Lg

Richard 

Link zu diesem Kommentar
Auf anderen Seiten teilen

ist das Skript auch auf jedem Würfel drauf? Initialisier einfach die Globale Würfelgesammtsumme mit 0 und addiere die Augenzahll von jedem Würfel.

Ich habe in Richtung 3D noch gar nix gemacht, sondern nur 2D Sachen. Aber normal müsste dann jeder Würfel der den Trigger auslöst, dann auch die Augenzahl hinzuaddieren.

Hast du schonmal geguckt, ob bei den anderen Würfeln das Feld "IsTrigger" angehakt ist? Weil nur wenn das angehakt ist, erkennt er auch den Trigger. 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sind das echte Würfel, die auch richtig fallen?
Wenn ja, würde ich abwarten mit dem Zählen, bis der Würfel wirklich liegt. Also keine Forces mehr ausgeübt werden, bzw. der RB eingeschlafen ist.
Erst dann würde ich den Wert an ein Script übergeben, was natürlich jeder Würfel kennen muss.

Einfach in eine public Void rein springen und den Wert übergeben.

Warum machst du das mit Triggern? Du kannst doch auch die Achsen abfragen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Weil ich komplett Null beim Programmieren bin (hat man wohl schon bemerkt) aber habe es auch in betracht gezogen mit den Achsen und mit den warten, aber hab mich nicht daran getraut. Aber wie es ausschaut funkt die Triggerabfrage nicht, da es mir 6 Debug.Log ausgibt (6 scripte) und nicht nur 5  (Würfel) mal.

Lg

Ricky-W

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mach es ruhig mit den Triggern. Aber du darfst nicht nur OnTriggerEnter nehmen, sondern auch OnTriggerExit. Weil wenn der Würfel fällt und über mehrere Seiten rollt, würden auch mehrere Trigger berührt werden. Es darf aber nur der eine Ausgewertet werden, der am Schluß liegt.

Erzeuge dir also mal eine Zeitnehmvariable um eine gewisse Zeit zu warten. Diese Variable bekommt die Zeit übergeben, sobald der Trigger etwas berührt.
Erzeuge dir zusätzlich eine boolsche Variable die auf true gesetzt wird wenn der Trigger berührt wird und auf false, wenn der Trigger wieder raus ist.
In der Update wird dann einfach abgefragt, ob die Variable auf true ist und zusätzlich die Zeit abgelaufen ist. Wenn ja, wird der Würfelwert übergeben.

bool liege;
float startZeit;
public float warteZeit=1f; // die kannst du im Inspector anpassen

void OnTriggerEnter(Collider other){
  if(other.CompareTag("tisch")){ // immer überprüfen, ob ich den Tisch berühre, denn ich könnte ja auch nen Würfel berühren, der mir aber egal ist
    startZeit=Time.time; // startZeit jedes mal nehmen
    liege=true; // momentan liege ich
  }
}
void OnTriggerExit(Collider other){
  if(other.CompareTag("tisch")){
    liege=false; // ich habe den Tischtrigger verlassen, also liege ich nicht mehr
  }
}
void Update(){
  if(liege && startZeit + warteZeit <Time.time){ // zeit ist abgelaufen und ich liege immer noch
    print("ich liege jetzt ne ganze Weile, also sollte ich meinen Wert übermitteln können");
    liege=false; // zurücksetzen, damit nicht ständig gesendet wird
  }
}

Das Problem bei nem Trigger ist ja, dass theoretisch 2 Würfel übereinander liegen könnten. Dann würde der Obere den Tischtrigger nicht berühren. Deswegen würde ich eigentlich auf Trigger verzichten. Aber das soll jetzt erstmal egal sein. Hauptsache du lernst dabei. :)
Ach so, ich habe den Code einfach so aqus dem Kopf da hin geschrieben. Kann also sein, dass da Fehler drin sind.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal vielen dank. Das Script funktioniert ohne zu meckern und genau wie es sollte. Nun ist ein Problem gelöst, aber es addiert immer noch nicht. es wäre so, als ob die Variabel nur für dieses Script gilt.Und warum schreibt er mir nur 3 mal (anstatt 5 mal) in die Console?

Frau meckert bereits, ich soll mir ein neues Hobby suchen 😱

 

Lg

Ricky-W

Fehler_2.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja das kann ich nicht sagen, weil ich nicht weiß ob dieses Script auf all deinen Triggern drauf ist.

Ja und wegen dem Addieren:
Du musst natürlich im Code, da wo jetzt die print Anweisung ist, einen Wer an ein bekanntes Script übermitteln.

Wenn du jetzt z.B. ein Berechnungsscript hättest, was z.B. auf der Kamera liegt, und dort eine public Void drin wäre, die Einfach nur zusammenrechnet, dann kannst du der einen Wert übermitteln.

Beim Triggerscript wäre das z.B.

public int augen; // im Inspector die Augenzahl einstellen
public Berechnungsscript Rechner;

void Update(){
  if(liege && startZeit + warteZeit <Time.time){ // zeit ist abgelaufen und ich liege immer noch
    print("ich liege jetzt ne ganze Weile, also sollte ich meinen Wert übermitteln können");
    liege=false; // zurücksetzen, damit nicht ständig gesendet wird
    Rechner.Addiere(augen); 
  }
}



Dafür musst du natürlich eine Referenzvariable namens Rechner haben, die für das Berechnungsscript steht.
 

public Berechnungsscript Rechner; // hier das Objekt das das Berechnungsscript hat im Inspector drauf ziehen. 

Ja und im Berechnungsscript gibt es dann diese offentliche Methode namens Addiere.

public class Berechnungsscript : MonoBehaviour {
  int summe=0;
  void Update(){
   // hier machste tolle dinge 
  }
  public void Addiere(int zahl){
    summe+=zahl; // einfach die übermittelte Zahl der Summe dazu addieren
    print(summe); // sollte jetzt eine höhere Zahl sein
  }
}

 

Ach so:
wie ich ganz oben bei deinem Post gesehen habe, hast du für jede Würfelzahl scheinbar ein Script erstellt. Und willst da drin dann auch addieren. Das ist aber unnötig.

Gib einfach jedem Trigger das Script, wie ich es vorgefertigt hatte. Füge in dem Script einfach noch eine public Variable hinzu, die die Zahl repräsentiert, die auf dem Würfel zu sehen ist, und stell sie im Inspector ein.
So hast du ein einziges Script, was für jede Seite gilt und sich nur duch die Zahl unterscheidet, die du übermitteln willst.

Der Rechner addiert das dann schon.

Also nocheinmal für das Verständnis:
Du hast mehrere Würfel. Jeder Würfel hat auf jeder Seite einen Trigger, der So angelegt ist, dass er nur die Tischplatte berührne kann, wenn diese Seite unten liegt.
Jeder Trigger hat ein und das selbe Script drauf, was das Triggern (Enter und Exit) auswertet und eine gewisse Zeit wartet.
Für jeden Trigger muss die Zahl der gegenüberliegende Seite in der Variable augen eingestellt werden.
Dieses Script sendet dann an ein anderes Script die eingestellte Zahl, wenn die Zeit abgelaufen ist. Dafür muss das andere Script dem Trigger bekannt sein.
Die Variable für das andere Script ist vom Typ Berechnungsscript. Das bedeutet, nur ein Script mit diesem (Klassen)Namen kann dort eingefügt sein.
Natürlich muss dieses Berechnungsscript in der Szene sein. Da bietet sich die Kamera an, weil ne Kamera ist immer da.
Um das Berechnungsscript jetzt dem Triggerscript bekannt zu machen, kannst du entweder per Code danach suchen, oder aber einfach im Inspector die Kamera in den Variablenslot fallen lassen. Es wird automatisch das Berechnungsscript auf der Kamera referenziert.

In dem Berechnungsscript passiert erstmal nicht viel. Dort gibt es nur die Methode, in die von den Triggerscriptenaufgerufen wird und wo die augen übergeben werden.
Das Berechnungsscript addiert dann diese augen zu der Variable summe und zeigt dir den Wert dann auch noch einmal in der Konsole an. Mehr macht es nicht.

Verstehst du das ?
Wenn nicht einfach fragen. :)
 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...