2016-12-01 7 views
0

Momentan versuche ich nur, die Sprites-Kerze von unbeleuchtet zu beleuchten, wenn der Spieler sowohl die Kerze als auch die Streichhölzer "abgeholt" hat und die Kerze erlischt. nach einer bestimmten Zeit. Wenn jedoch die Leertaste gedrückt wird, tritt der Übergang von unbeleuchtet zu erleuchtet nicht auf, obwohl das Debug-Protokoll True zurückgibt, wenn es sollte. Ich poste hier, um eine Anleitung zu bekommen, da ich den größten Teil des Tages damit verbracht habe, online zu gucken und buchstäblich keine Ahnung zu haben, wie ich vorgehen soll. Grundsätzlich sind die Bilder, zwischen denen ich zu wechseln versuche, zwei verschiedene Bilder, die sich im Sprites-Ordner unter Assets befinden.Sprite ändert sich nicht, wenn die Taste gedrückt wird - unity 2D

Das ist, was ich bisher habe.

//the two sprites transition 
public Sprite unlitCandle; 
public Sprite litCandle; 

private SpriteRenderer spriteRenderer; 

bool pickUpMatches = false; 
bool pickUpCandle = false; 
float timeRemaining =5; 
bool candleLit = false; 

// Use this for initialization 
void Start() { 
    spriteRenderer = GetComponent<SpriteRenderer>(); 
    if (spriteRenderer.sprite == null) 
     spriteRenderer.sprite = unlitCandle; 

} 

// Update is called once per frame 

private void OnTriggerEnter2D(Collider2D collision) 
{ 
    if(collision.gameObject.CompareTag("Matches")) 
    { 
     collision.gameObject.SetActive(false); 
     pickUpMatches = true; 
    } 

    if (collision.gameObject.CompareTag("UnlitCandle")) 
    { 
     collision.gameObject.SetActive(true); 
     pickUpCandle = true; 
    } 

} 

public void CandleTimer() 
{ 
    if (candleLit == true) 
    { 
     timeRemaining = 5; 
     timeRemaining -= Time.deltaTime; 
     if (timeRemaining <= 0) 
     { 
      candleLit = false; 
      spriteRenderer.sprite = unlitCandle; 
     } 
    } 
} 

public void ChangeSprite() 
{ 
    if (spriteRenderer.sprite == unlitCandle) 
    { 
     spriteRenderer.sprite = litCandle; 
    } 
} 

void Update() { 


    if (pickUpCandle == true && pickUpMatches == true) 
    { 
     //Debug.Log(candleLit); 
     if (Input.GetKey(KeyCode.Space) && !candleLit) 
     { 
      CandleTimer(); 
      ChangeSprite(); 
      Debug.Log(timeRemaining); 
      candleLit = true; 
      //Debug.Log(candleLit); 
     } 
    } 
} 

}

+0

Es wird nichts lösen, denke ich, aber ich denke, dass Sie GetKeyDown anstelle von GetKey verwenden möchten. GetKeyDown tritt nur einmal auf, während GetKey bei jedem Drücken einer Taste auftritt. – Maakep

+0

Auch. Candle-Light-Timer wird nie starten. Zuerst prüfen Sie, ob Candlelight falsch ist. Dann gehen Sie zur CandleLit-Methode, wo Sie prüfen, ob es wahr ist. Es wird niemals wahr sein, da es nur ausgeführt wird, wenn es falsch ist. – Maakep

Antwort

0

Versuchen Sie es mit einem Verfahren wie equals Vergleich() anstelle von == in spriteRenderer.sprite == unlitCandle

Denn jetzt sind Sie nur zu vergleichen Referenzen und nicht die Objekte.

Zumindest denke ich, dass das das Problem ist.

+0

OP hat einen expliziten Verweis auf die Sprites, auf die er "spriteRenderer.sprite" setzt und kann sie daher später vergleichen. – Brien

0

Es gibt einige mögliche Probleme mit Ihrem Code. Zuerst rufen Sie changeSprite an der Spitze von Update, was bedeutet, dass es bedingungslos jeden Frame aufgerufen wird. Wenn ein einzelner Rahmen Ihrer Kerze nicht leuchtet, ändert sich das Sprite sofort in litCandle.

Ich nehme an, dass der Grund, dass Sie changeSprite jeden Rahmen aufrufen, ist, um den Timer zu verarbeiten, wenn Sie bereits eine brennende Kerze haben. Wirklich, Sie sollten den Code verschieben, um den Timer (Ihre ganze Sekunde if Anweisung in changeSprite) zu einer separaten Funktion zu verarbeiten und nennen Sie es so etwas wie processCandleTimer. Rufen Sie , dass an der Spitze der Update und speichern Sie die changeSprite Methode, nur auf den Tastendruck aufgerufen werden.

Schließlich, das Problem, das ich vermute, gibt Ihnen das größte Problem ist, dass Sie nicht Ihren Timer zurücksetzen, timeRemaining. Das erste Mal, wenn Sie die Kerze anzünden, wird der Timer nach 5 Sekunden auf 0 sinken. Jedes Mal, changeSprite danach ausgeführt wird, werden Sie das Sprit zu litCandle in der ersten if Anweisung ändern und dann es sofort Änderung unlitCandle zurück, weil der Timer 0 im zweiten ist. Um dies zu beheben, müssen Sie eine Zeile wie timeRemaining = 5.0f; hinzufügen, wenn der Schlüssel gedrückt wird.

+0

Hallo Brien, ich glaube, ich habe versucht, was du vorgeschlagen hast. Als ich jedoch die Zeit in der Konsole protokollierte, bemerkte ich, dass sie nach 5 Sekunden feststeckte. Vielen Dank für Ihre Antwort, es wird sehr geschätzt. – Anonymous5642

+0

Versuchen Sie, Ihre if-Anweisung in 'if (Input.GetKey (KeyCode.Space) &&! CerceLit)' zu ändern, damit es nicht wieder eingeht, wenn die Kerze leuchtet. Sie müssen 'celceLit' auch zurück auf" false "setzen, wenn die Zeit abgelaufen ist. – Brien

+0

Vielen Dank für den Vorschlag, aber der Timer, wenn der Raum gedrückt wird, zeigt nur noch 5 Sekunden.Es scheint nicht zu aktualisieren, in der Konsole zeigt es einmal 5 Sekunden. Ich hoffe das ergibt Sinn. Ich dachte, die CandleTimer-Methode hätte den Timer dekrementiert. Danke für Ihre Hilfe übrigens. – Anonymous5642

Verwandte Themen