Jump to content
Unity Insider Forum

Objekt alle paar Sekunden verschwinden lassen


unityalphanoob

Recommended Posts

Ich versuche gerade einen Cube alle 5 Sekunden verschwinden zu lassen. Der MeshRenderer und der MeshCollider sollen dabei immer alle 5 Sekunden jeweils ein- oder ausgeschaltet werden.

 

Mein Ansatz:

 

static var sichtbar : boolean = true;

 

function update()

{

if (sichtbar == true)

{

MeshRenderer.renderer.enabled = true;

MeshCollider.collider.enabled = true;

yield WaitForSeconds (5);

sichtbar == false;

}

 

if (sichtbar == false)

{

MeshRenderer.renderer.enabled = false;

MeshCollider.collider.enabled = false;

yield WaitForSeconds (5);

sichtbar == true;

}

}

 

Weiß jemand warum es nicht funktioniert? :unsure:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es funktioniert nicht da du keine Korutinen (yield, etc) in der Update aufrufen kannst. Das wäre ja: Warte 5 sec jeden Frame. Eine Lösung habe ich gerade nicht aber du solltest die Ausblenden und Einblenden in Funktionen Auslagern:

 

function Ausblenden () {
render.true = false;
mesh.true = false; //Deine Collider, Renderer etc. Ausblenden.
yield WaitForSeconds(5);
ausgelendet = true;
return();
}

 

der Code ist nur Pseudo und ich bin mir nicht sicher das er funktioniert da ich das Problem schon öfters hatte und immer wieder googeln musste.

Eins ist sicher: yield nicht in der Update.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um mal auf dein Script zu sprechen zu kommen... das funktioniert gleich aus einer ganzen Reihe von Gründen nicht.

  1. Update wird groß geschrieben
  2. yield in Update gibt's nicht
  3. sichtbar = false; und direkt danach if(sichtbar == false) ist nie eine gute Idee

Was du willst:

function OnEnable()
{
 while(true)
 {
yield WairForSeconds(5);
renderer.enabled = !renderer.enabled;
collider.enabled = renderer.enabled;
 }
}

function OnDisable()
{
 StopAllCoroutines();
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

So hier ein bisschen eleganter...

 

var dauer : int = 1;

 

function Update()

{

renderer.enabled = true;

collider.enabled = true;

dauer = dauer * Time.deltaTime;

if (dauer > 5)

{

renderer.enabled = false;

collider.enabled = false;

dauer = 1;

}

}

 

edit: also es kommen jetzt immerhin keine fehlermeldungen mehr :DDD

aber funktionieren tut es trotzdem nicht...

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber funktionieren tut es trotzdem nicht...

Warum nutzt du nicht die Lösung die Sascha dir geben hat? Ansonsten funktioniert auch dein neuer Code aus mehren Gründen nicht.

 

Erstmal ist das die Update() Funktion die jedes Frame ausgeführt wird. Und mit jedem Frame aktivierst du den Renderer ja sofort wieder.

 

Der Renderer würde wenn überhaupt genau nur den einen einzige Frame deaktiviert werden wo dauer > 5 sein würde. Wenn dein Spiel also mit 60fps läuft, dann kann es mal sein das 1 Frame das ganze nicht sichtbar ist. Das kann evtl. noch nichtmal auffallen. Oder wenn du genau hinschaust könnte es sein das du nur ein kurzes Flackern mal bemerkst.

 

Allerdings wird bei dir dauer nie größer als 5 sein. Den du multiplizierst die Dauer im jeden Frame mit Time.deltaTime. Time.deltaTime wird immer eine Zahl kleiner 1 sein (Auser dein Spiel läuft mit weniger als 1 frame pro sekunde). Und typsicherweise wird es eher sowas sein wie 0.016. Was passiert wenn man eine Zahl mit einer Zahl kleiner 1 multipliziert? Sie wird kleiner!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Pack es einfach in einer neuen Funktion.

 

function OnEnable() {
StartCoroutine("ToggleView");
}

function ToggleView() {
while(true) {
	yield WaitForSeconds(5);
	renderer.enabled = !renderer.enabled;
	collider.enabled = renderer.enabled;
}
}

 

Also der das mit dem Cube, dass er verschwindet und wieder kommt klappt einwandfrei, aber blöd nur das der Spieler sich nicht mehr bewegen kann bis der Cube wieder erscheint :/

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kurzer Denkanstoss:

 



float zeitAktuell = 0f; // var zeitAktuell : float = 0;
float zeitfaktor = 1f;  // var zeitfaktor : float = 1.0;
float zeitMax = 5f;  // var zeitMax : float = 5.0;

zeitAktuell += zeitfaktor * time.deltaTime // Zeitfaktor von 1 ist gut.
//...Wenn zeitAktuell größer oder gleich zeitMax ist. Setze mal den zeitAktuell wieder
//auf 0 zurück und führe deine Anweisungen aus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kurzer Denkanstoss:

 



float zeitAktuell = 0f; // var zeitAktuell : float = 0;
float zeitfaktor = 1f;  // var zeitfaktor : float = 1.0;
float zeitMax = 5f;  // var zeitMax : float = 5.0;

zeitAktuell += zeitfaktor * time.deltaTime // Zeitfaktor von 1 ist gut.
//...Wenn zeitAktuell größer oder gleich zeitMax ist. Setze mal den zeitAktuell wieder
//auf 0 zurück und führe deine Anweisungen aus.

 

danke, ich glaub das sollte es sein, was ich brauch.

 

Eine Frage hab ich aber. Was bewirkt dieses += Zeichen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...