2017-04-04 20 views
0

基本上我想讓一個玩家可以隨時變換成惡魔,只要用戶按下加電按鈕,但是我希望轉換在60秒後結束(當轉換結束時,我希望玩家恢復到原始狀態)。如果玩家被敵人擊中,我也希望變形結束。到目前爲止,我已經編寫了這段代碼,但它的工作原理很簡單,但是如果玩家被敵人擊中並且用戶決定按下按鈕將玩家轉換回來,我很難將秒數等待時間重置爲60秒變成一個惡魔。任何人都可以幫我解決這個問題嗎?如何在玩家被敵人擊中時將等待秒數設置回60秒?

在我的層次結構中,我的玩家是父母,我的惡魔玩家是孩子。附加到玩家的玩家移動腳本以及下面的轉換腳本:

public GameObject demon; 
    public BoxCollider2D col; 
    public Renderer rend; 
    public ParticleSystem par1; 
    public static Vector3 target; 


    void Start() { 
     target = transform.position; 
    } 

    void Update() { 
     target.z = transform.position.z; 
    } 

    public void DemonCharacter() { 
    StartCoroutine (PowerUpCoroutine()); 
} 

    private IEnumerator PowerUpCoroutine() { 

     yield return new WaitForSeconds (0.3f); 

     par1.Play(); // particle system animation to cover transformation happening 
    par1.transform.position = target; 

     yield return new WaitForSeconds (0.2f); 

     demon.SetActive (true); // activates demon gameobject 

     rend.enabled = false; // deactivate players spriterenderer 

     col.enabled = false; 

     yield return new WaitForSeconds (60f); 

     demon.SetActive (false); // deactivates demon gameobject 

     rend.enabled = true; // activate players spriterenderer 

     col.enabled = true; 

     par1.Stop(); 
    } 

而在我的惡魔玩家中,我附加了這個腳本; 我的工作原理是,但當用戶點擊按鈕轉換成惡魔時,屈服等待秒數不會停止,所以當玩家轉換成惡魔秒後,惡魔玩家轉換回玩家,而不是重置等待秒數。

public BoxCollider2D Playercol; 
    public Renderer PlayerRend; 

void Start() 
{ 

} 

void Update() 
{ 

} 

void OnTriggerEnter2D(Collider2D col) { 
    if (col.tag == "enemy") { 
     demon.SetActive (false); 
     PlayerRend.enabled = true; 
     Playercol.enabled = true; 
    } 
} 
+1

你說你有困難,但是你能否更清楚地告訴我們你的代碼現在做了什麼,以及你期望它或者希望它做什麼?我也沒有在你的問題中看到很多研究成果,你能告訴我們你已經嘗試過了嗎?您是否在網上搜索解決方案?如果是這樣,你能告訴我們你發現了什麼,它是否對你有用,爲什麼?也許還可以再看看[問]和[mcve]。 – PJvG

+1

'var demonRoutine = StartCoroutine(DemonCharacter()); if(takeDamage){StopCoroutine(demonRoutine); }'這樣的東西可以爲你工作。 – Maakep

回答

3

另一種方式比m.rogalski建議@將使用一個簡單的浮動變量作爲定時器:

public GameObject demon; 
public BoxCollider2D col; 
public Renderer rend; 
public ParticleSystem par1; 
public static Vector3 target; 

private float demonTimer; 

void Start() 
{ 
    target = transform.position; 
    demonTimer = 0.0f; 
} 

void Update() 
{ 
    target.z = transform.position.z; 

    if (demonTimer > 0.0f) 
    { 
     demonTimer -= Time.deltaTime; 
     if (demonTimer <= 0.0f) 
     { 
      demon.SetActive(false); 
      rend.enabled = true; 
      col.enabled = true; 
     } 
    } 
} 

public void DemonCharacter() 
{ 
    par1.Play(); 
    par1.transform.position = target; 
    demon.SetActive(true); 
    rend.enabled = false; 
    col.enabled = false; 

    demonTimer = 60.0f; 
} 

public void CancelDemon() 
{ 
    demonTimer = 0.0f; 
} 

希望這有助於

2

我的建議是你要修改你的Coroutine不使用WaitForSeconds但使用它自己的時間計算。

// create the flag indicating interruption 
bool _interrupt = false; 

// create your coroutine 
IEnumerator PowerUpCoroutine() 
{ 
    // set the time you want to hold transformation 
    const float TRANSFORMATION_INTERVAL = 60.0f; 

    // currently elapsed time 
    float currentlyElapsed = 0.0f; 

    // add your logic for pre-transformation 

    while (currentlyElapsed < TRANSFORMATION_INTERVAL && !_interrupt) 
    { 
     yield return null; 
     currentlyElapsed += Time.deltaTime; 
    } 

    // add post-transformation logic 

    // revert transformation process 

    _interrupt = false; 
} 

現在,如果你運行這個協同程序調用StartCoroutine(PowerUpCoroutine());你可以中斷它設置_interrupt標誌true。例如:

public void Interrupt() 
{ 
    _interrupt = true; 
} 

// in some update : 
if (gotHitThisFrame == true) 
    Interrupt(); 
+0

如果您在中斷方法中將currentlyElapsed提升爲成員變量並將currentlyElapsed設置爲TRANSFORMATION_INTERVAL,則甚至可能會除去單獨的_interrupt標誌。 – rs232

+0

謝謝你在我的問題上的幫助,我真的很感激:) –