2013-04-19 20 views
7

che sto cercando di fare il mio flash player quando viene colpito. Ho rilevato il rilevamento dei colpi. Attualmente cambia in rosso. Mi sto chiedendo come far accadere il lampeggio vero e proprio. Ecco un frammento che gestisce stato colpito:Fai Player Flash Quando Hit

if(otherObject.CompareTag("Minion")) //hit by minion 
    { 
     if(hitFromTop(otherObject.gameObject)) //if player jumped on enemy 
     { 
      otherObject.GetComponent<Minion>().setMoving(false); //stop moving 
      playSound(KillEnemySound); //play killing enemy sound 
      jump(); 
      Destroy(otherObject.gameObject); //kill minion 

     } 
     else //otherwise, enemy hit player 
     { 
      if(canTakeDamage) 
      { 
       changeColor(Color.red); 
       loseHealth(1); //lose health 
       canTakeDamage=false; 
       yield return new WaitForSeconds(1.5f); //delay taking damage repeatedly 
       changeColor(Color.white); 
       canTakeDamage=true; 
      } 
      //indicate lost health somehow 
     } 

Attualmente, il cambio al rosso è costante (non lampeggiante) e temporaneo, tramite il yield return new WaitForSeconds(1.5f);. Potrei inserire un paio di queste chiamate, con cambiamenti di colore tra di loro, ma mi chiedevo se c'era un modo più ordinato. Non posso essere il primo a fare qualcosa in flash in un gioco.

EDIT: Ho aggiunto il codice Flash di heisenbug() come segue:

IEnumerator FlashPlayer(float time, float intervalTime) 
{ 
    canTakeDamage=false; 
    float elapsedTime = 0f; 
    int index = 0; 

    while(elapsedTime < time) 
    { 
     Debug.Log("Elapsed time = " + elapsedTime + " < time = " + time + " deltaTime " + Time.deltaTime); 
     mat.color = colors[index % 2]; 
     elapsedTime += Time.deltaTime; 
     index++; 
     yield return new WaitForSeconds(intervalTime); 
    } 
    canTakeDamage=true; 
} 

e si chiama qui:

void loseHealth(int damage) 
{ 
    //irrelevant details omitted for brevity 
      //the "if" checks if the player has run out of health, should not affect the else because this method is called from OnTriggerEnter...see below... 
    else 
    { 
     StartCoroutine(FlashPlayer (1.5f, 0.5f)); 
    } 
} 

e qui è dove che si chiama (in OnTriggerEnter):

if(otherObject.CompareTag("Minion")) //hit by minion 
    { 
     if(hitFromTop(otherObject.gameObject)) //if player jumped on enemy 
     { 
      //irrelevant to the problem 
     } 
     else //otherwise, enemy hit player 
     { 
      if(canTakeDamage) 
      { 
        loseHealth(1); 
      } 
      //indicate lost health somehow 
     } 
    } 

il problema ora è che il Flash non si ferma mai. Dovrebbe interrompersi quando il tempo trascorso raggiunge 1.5f, come ho specificato, ma poiché è solo incrementato di piccole quantità (in Time.deltaTime) quindi non raggiunge 1.5f per un tempo molto lungo. C'è qualcosa che ho lasciato fuori che dovrebbe farlo arrivare a 1,5f più veloce, o c'è un altro numero che posso scegliere che posso usare con precisione per fungere da punto di arresto? I numeri per il tempo trascorso tendono ad essere: 0, 0,02, 0,03693, 0,054132, ecc. Molto piccoli, quindi non posso davvero scegliere da qui.

+0

prendere in considerazione la pubblicazione di un SSCCE: http://sscce.org/. – Heisenbug

+0

Scusa, non ho ancora avuto la possibilità di farlo. Ci proverò non appena ne avrò l'opportunità. – muttley91

risposta

2

Il seguente codice può essere quello che stai cercando. L'oggetto deve lampeggiare per la quantità totale di time cambiare il suo colore dopo intervalTime

using UnityEngine; 
using System.Collections; 

public class FlashingObject : MonoBehaviour { 

    private Material mat; 
    private Color[] colors = {Color.yellow, Color.red}; 

    public void Awake() 
    { 

     mat = GetComponent<MeshRenderer>().material; 

    } 
    // Use this for initialization 
    void Start() { 
     StartCoroutine(Flash(5f, 0.05f)); 
    } 

    IEnumerator Flash(float time, float intervalTime) 
    { 
     float elapsedTime = 0f; 
     int index = 0; 
     while(elapsedTime < time) 
     { 
      mat.color = colors[index % 2]; 

      elapsedTime += Time.deltaTime; 
      index++; 
      yield return new WaitForSeconds(intervalTime); 
     } 
    } 

} 
+0

Questo sta funzionando finora. L'unica cosa è che non si sta fermando dopo che è passato il tempo. Ho intenzione di inserire alcune dichiarazioni di debug, ma qualche idea del perché questo potrebbe essere? Nota che non sto chiamando la coroutine da Start come hai fatto, lo chiamo dalla funzione 'loseHealth (1)' che vedi nel mio frammento di codice sopra (ho rimosso tutto il resto da quella condizione diversa dalla chiamata per 'loseHealth (1)'). – muttley91

+0

è lostHealth chiamato all'interno di Aggiornamento o metodi simili? – Heisenbug

+0

No, è chiamato solo su onTriggerEnter (a meno che non contenga un metodo simile ...). – muttley91

0

la risposta di cui sopra è grande, ma non smette di lampeggiare, perché richiede troppo tempo per il galleggiante raggiungere 5f.

Il trucco è impostare il primo parametro nella funzione Flash su qualcosa di più piccolo, come 1f, anziché 5f. Prendi questo script e collegalo a qualsiasi oggetto di gioco. Lampeggerà tra giallo e rosso per circa 2,5 secondi, quindi si fermerà.

using UnityEngine; 
using System.Collections; 

public class FlashingObject : MonoBehaviour 
{ 

    private Material _mat; 
    private Color[] _colors = { Color.yellow, Color.red }; 
    private float _flashSpeed = 0.1f; 
    private float _lengthOfTimeToFlash = 1f; 

    public void Awake() 
    { 

     this._mat = GetComponent<MeshRenderer>().material; 

    } 
    // Use this for initialization 
    void Start() 
    { 
     StartCoroutine(Flash(this._lengthOfTimeToFlash, this._flashSpeed)); 
    } 

    IEnumerator Flash(float time, float intervalTime) 
    { 
     float elapsedTime = 0f; 
     int index   = 0; 
     while (elapsedTime < time) 
     { 
      _mat.color = _colors[index % 2]; 

      elapsedTime += Time.deltaTime; 
      index++; 
      yield return new WaitForSeconds(intervalTime); 
     } 
    } 
} 
Problemi correlati