2017-04-04 3 views
0

基本的には、ユーザーがパワーアップボタンを押すたびにいつでもデーモンに変身できるプレイヤーを作りたいと思っていますが、変換が終わると60秒後に変換が終了します(変換が終了すると、元の状態)。私はまた、プレイヤーが敵に当たった場合、変換が終了するようにします。これまで私はこのコードを作っていますが、動作しますが、プレーヤーが敵に当たった場合と、プレーヤーがボタンを押してプレーヤーを元に戻すことに決めた場合、60秒間の歩留まりをリセットするのに問題があります悪魔になる。誰もこの問題で私を助けることができますか?プレーヤーが敵に当たったときの歩留まりを秒単位で60秒に戻す方法を教えてください。

私の階層では、私は親としてプレイヤーを、子として私の悪魔プレイヤーを持っています。 playermovementスクリプトは以下の選手としてだけでなく、変換スクリプトに添付:

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

に役立ちますあなたがしていると言います問題はありますが、あなたのコードが今何をしているのか、そして実際にそれが期待しているか、やりたいことをもっと明確に(教えて)くれますか?また、私はあなたの質問に研究努力の多くを見ていない、あなたはすでにあなたが試したことを教えてくれますか?オンラインでソリューションを検索しましたか?そうであれば、あなたが見つけたもの、それがあなたにとって有用であったかどうか、そしてその理由を教えてください。また、[ask]と[mcve]をもう一度見てみてください。 – PJvG

+1

'var demonRoutine = StartCoroutine(DemonCharacter()); if(takeDamage){StopCoroutine(demonRoutine); } 'それはあなたのために働くことができるようなもの。 – Maakep

答えて

3

別の方法:

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

あなたがWaitForSecondsを使用しますが、それ自身のタイミングの計算を使用しないように、あなたのCoroutineを修正するために私の提案は次のようになります。あなたがStartCoroutine(PowerUpCoroutine());を呼び出し、このコルーチンを実行する場合

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

今、あなたはtrue_interruptフラグを設定し、それを中断することができます。例えば:何m.rogalski @提案するタイマーのような単純なフロート変数を使用する場合よりも

public void Interrupt() 
{ 
    _interrupt = true; 
} 

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

currentElapsedをメンバ変数にプロモートし、割り込みメソッドでcurrentlyElapsedをTRANSFORMATION_INTERVALに設定すると、別の_interruptフラグがなくなることさえあります。 – rs232

+0

私の問題であなたの助けをありがとう、私は本当にそれを感謝します:) –

関連する問題