2017-11-16 6 views
-1

私はノックバック効果を出した単純な2Dプラットフォーマーゲームに取り組んでいます。プレイヤーが現在スパイクである障害物に当たったとき、彼はノックバックと一時的な不安定性を持っているので、不安定状態の間にスパイクを立てると、ヒットしません。しかし、一度invicibilityが終了すると、私は次のGIFのようにスパイクによってプレイヤーにヒットを与えたい。トラップを立てたときの不意打ちの後のヒット

https://media.giphy.com/media/26FeVTRop5PhBrJQs/giphy.gif

invicibilityがなくなって、それがスパイクの上に立っているので、プレイヤーがヒットを取得します。私が持っている問題は、敵意がなくなり、プレイヤーがまだスパイクに立っているなら、それは撃たれず、スパイクから降りるまで傷つけられないということです。この問題をどうやって解決するのかを提案できますか?ここでは、プレイヤーを狙うためのコードです。

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class HitThePlayer : MonoBehaviour 
{ 
    public int damage; 

    GameObject player; 
    PlayerController playerController; 
    PlayerMovement playerMovement; 

    void Start() 
    { 
     player = GameObject.FindGameObjectWithTag ("Player"); 
     playerController = GameObject.FindGameObjectWithTag ("GameController").GetComponent<PlayerController>(); 
     playerMovement = player.GetComponent<PlayerMovement>(); 
    } 

    void OnTriggerEnter2D (Collider2D other) 
    { 
     if (!playerController.isInvicible) 
     { 
      if (other.gameObject.CompareTag ("Player")) 
      { 
       playerController.AddPlayerHealth (-damage); 
       playerMovement.isKnockedBacked = true; 
       if (other.transform.position.x < transform.position.x) 
       { 
        playerMovement.knockFromRight = true; 
       } 
       else 
       { 
        playerMovement.knockFromRight = false; 
       } 
       StartCoroutine ("KnockBackEffectsDuration"); 
      } 
     } 
    } 

    IEnumerator KnockBackEffectsDuration() 
    { 
     player.GetComponent<Animator>().SetTrigger ("GotHurt");                 
     StartCoroutine (playerController.Invicibility (3.0f));                 
     yield return new WaitForSeconds (0.2f); 
     playerMovement.isKnockedBacked = false; 
     playerMovement.enabled = false;                  
     yield return new WaitForSeconds (0.2f); 
     playerMovement.enabled = true;                  
    } 
} 

また、別のスクリプトのInvicibility IEnumeratorもあります。

public IEnumerator Invicibility (float duration) 
{ 
    isInvicible = true; 
    yield return new WaitForSeconds (duration); 
    isInvicible = false; 
    player.GetComponent<Animator>().SetTrigger ("GoIdle");           
} 

HitThePlayerスクリプトは他のスクリプトを参照していますので、私もこれらのスクリプトを起動する必要がある場合はお知らせください。

答えて

1

スパイクトリガーが入力されてプレイヤーが損傷した後、無敵状態が解除されると、プレイヤーはすでにスパイクトリガーに入っているため、このメソッドは再び呼び出されません。これを解決する1つの方法は、OnTriggerEnterに直接的にプレーヤーを傷つけるのではなく、OnTriggerEnterとOnTriggerExitを使用して、プレイヤーに傷ついていないかどうかをboolに設定する必要があります。例:

bool damageable; 

void Update() 
{ 
     if (!playerController.isInvicible && damageable) 
     { 
      // damage, knockback, etc the player here; 
     } 
} 

void OnTriggerEnter2D(Collider2D other) 
{ 
    if (other.gameObject.CompareTag ("Player")) 
     damageable = true; 
} 

void OnTriggerExit2D(Collider2D other) 
{ 
    if (other.gameObject.CompareTag ("Player")) 
     damageable = false; // player is still damageable unless he leaves spikes 
} 
+0

ええ、これは、ありがとうございます。 :) – Alexander

+0

クール!その場合は、他の人が – ryeMoss

+0

を知っているように、それを最良の回答としてマークしてください。申し訳ありません。私はスタックオーバーフローのために新しいので、私はそれらのことを忘れています。 – Alexander

1

無敵が終了したときにスパイクとの衝突をチェックしていないようですが、確かめるために十分なコードが掲載されていません。無敵終了時にOnTriggerEnter2D関数を呼び出していることを確認してください。

関連する問題