2013-04-19 32 views
7

Tôi đang cố gắng làm cho trình phát của mình nhấp nháy khi nhấn. Tôi đã phát hiện hit đang hoạt động. Ông hiện đang thay đổi màu đỏ. Tôi tự hỏi làm thế nào để thực sự nhấp nháy thực tế xảy ra. Dưới đây là một đoạn trích xử lý lượt truy cập:Tạo Flash Player Khi Nhấn

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 
     } 

Hiện tại, thay đổi thành màu đỏ là không đổi (không nhấp nháy) và tạm thời, qua yield return new WaitForSeconds(1.5f);. Tôi có thể đặt một vài trong số những cuộc gọi này, với những thay đổi màu sắc giữa chúng, nhưng tôi đã tự hỏi nếu có một cách neater. Tôi không thể là người đầu tiên làm một cái gì đó flash trong một trò chơi.

EDIT: Tôi đã thêm Heisenbug Flash() code như sau:

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; 
} 

và nó được gọi ở đây:

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)); 
    } 
} 

và đây là nơi đó được gọi là (trong 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 
     } 
    } 

Vấn đề bây giờ là Flash không bao giờ dừng lại. Nó sẽ dừng lại khi elapsedTime đạt đến 1.5f, như tôi đã chỉ định, nhưng vì nó chỉ tăng thêm một lượng nhỏ (trong Time.deltaTime) sau đó nó không đạt tới 1.5f trong một thời gian rất dài. Có bất cứ điều gì tôi đã rời ra mà nên làm cho nó đạt đến 1,5f nhanh hơn, hoặc là có một số khác tôi có thể chọn mà tôi có thể sử dụng chính xác để hoạt động như một điểm dừng? Các con số cho elapsedTime có xu hướng là: 0, 0,02, 0,03693, 0,054132, vv rất nhỏ, vì vậy không có gì tôi thực sự có thể chọn từ đây.

+0

xem xét đăng SSCCE: http://sscce.org/. – Heisenbug

+0

Xin lỗi, tôi chưa có cơ hội để làm điều đó. Tôi sẽ cố gắng ngay khi tôi có cơ hội. – muttley91

Trả lời

2

Mã sau có thể là những gì bạn đang tìm kiếm. Các đối tượng cần flash cho tổng số tiền time thay đổi màu sắc của nó sau khi 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

Tính năng này hiện đang hoạt động. Điều duy nhất là, nó không thực sự dừng lại sau khi 'thời gian' trôi qua. Tôi sẽ ném vào một số báo cáo gỡ lỗi, nhưng bất kỳ ý tưởng tại sao điều này có thể? Lưu ý rằng tôi không gọi coroutine từ Start như bạn đã làm, tôi gọi nó từ hàm 'loseHealth (1)' của tôi mà bạn thấy trong đoạn mã của tôi ở trên (tôi đã xóa mọi thứ khác khỏi điều kiện đó ngoài cuộc gọi thành 'loseHealth (1)'). – muttley91

+0

bị mấtSức khỏe được gọi bên trong Cập nhật hoặc các phương pháp tương tự? – Heisenbug

+0

Không, nó được gọi là bên trong onTriggerEnter chỉ (trừ khi đó được tính là một phương pháp tương tự ...). – muttley91

0

Câu trả lời ở trên là rất tốt, nhưng nó không chỉ dừng lại nhấp nháy, vì phải mất quá lâu để phao để đạt 5f.

Bí quyết là đặt thông số đầu tiên trong hàm Flash thành một thứ nhỏ hơn, như 1f, thay vì 5f. Thực hiện kịch bản này và đính kèm nó vào bất kỳ đối tượng trò chơi nào. Nó sẽ nhấp nháy giữa màu vàng và đỏ trong khoảng 2,5 giây, sau đó dừng lại.

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); 
     } 
    } 
} 
Các vấn đề liên quan