2016-05-04 15 views
-1

見てください:私は、プレイヤーが彼と衝突したときにパネルが現れ、もう一度試してみるというモンスターをゲームに持っています。 シールドオブジェクトがあり、プレイヤーを死から守ります。プレイヤーがそれに衝突したときにモンスターに触れると、一度は死ぬべきではありません。それはシールドのようなものです。あなたは1人の死から保護されています。このコードを書くのを助けることができますか?Doodle jump unity C#

public GameObject panel; 
public bool hasShield = false; /* no shield in the beginning */  

void OnCollisionEnter(Collision col) 
{ 
    if(col.gameObject.tag == "Shield") 
    { 
     hasShield = true; //We are safe now. 
     /* TODO: StartCoroutine() or Invoke() to reset the variable and the graphic effect after some amount of time. */ 
    } 
    else if (col.gameObject.tag == "Monster" && !hasShield) 
    { 
     //We hit a monster and had no shield. Display gameover. 
     panel.SetActive (true); 
    } 
    //I assume the panel is inactive by default so no need to call SetActive(false) on it. 
} 
+0

「機能しない」より具体的なことができますか?デバッグをしましたか? – halfer

+0

あなたのロジックをよりよく表現できますか?パネルが活性化または非活性化されると正確にはいつですか? –

+0

モンスターに触れた後、パネルをアクティブにする必要がありますが、シールドとモンスターをタッチするとパネルが表示されません –

答えて

5

このコードの内部に到達することはできません:、タグ「盾」でなければならない、しかし、第二の試験に合格するために渡すために最初ifのチェックのために

 if (col.gameObject.tag == "Shield") 
    { 
     if(col.gameObject.tag == "Monster") 
     { 
      panel.SetActive(false); 
     } 
    } 

、それは "モンスター"でなければなりません。これらの2つの条件が同時にtrueにすることはできません、コードを使用すると、上記の式に(論理OR)||&&を交換する場合は、あなたが望む結果を得るでしょう、しかし

if(col.gameObject.tag == "Shield" && col.gameObject.tag == "Monster") 

に相当します。 「シールド」または「モンスター」であれば、書き換えられたコードは

if (col.gameObject.tag == "Monster") 
    { 
     panel.SetActive (true); 
    } 
    if (col.gameObject.tag == "Shield" || col.gameObject.tag == "Monster") 
    { 
     panel.SetActive(false); 
    } 

だろう内部のコードがトリガーされます。

編集: コメントの中で話したように、ロジックには全体的に欠陥がありました。今、あなたの説明によると

パネルは、私はモンスターに触れる後に起動する必要がありますが、私はその後、シールドと触れた場合モンスターは、パネルには、私は次のように助言

を表示されません。シールドが収集されると、

bool hasShield; 

のように、いくつかの変数にこれを保存し、シールドが収集されたときにtrueに設定します。次に、何かを叩いた場合、モンスターかどうかを確認し、盾がない場合は、「ゲームオーバー」画面が表示されます。だから、プレイヤーはみんな同じように見えるはずです

public GameObject panel; 
    public bool hasShield = false; /* no shield in the beginning */  

    void OnCollisionEnter(Collision col) 
    { 
     if(col.gameObject.tag == "Shield") 
     { 
      hasShield = true; //We are safe now. 
      /* TODO: StartCoroutine() or Invoke() to reset the variable and the graphic effect after some amount of time. */ 
     } 
     else if (col.gameObject.tag == "Monster") 
     { 
      if(!hasShield) 
       panel.SetActive (true); //We hit a monster and had no shield. Display gameover. 

      else 
       hasShield = false; //loose the shield 
     } 
     //I assume the panel is inactive by default so no need to call SetActive(false) on it. 
    } 
+0

2分半でタイピングしました! ':-O' – halfer

+1

@halferちょうど30秒前の時に質問を見る特権を持っていました:) –

+0

OR演算子を使用するとコードにアクセスできるようになりますが、目標を達成するとは思いません。それはそうではないでしょうか? 'panel.SetActive(false)'は、シールドが存在するかどうかにかかわらず毎回呼び出されますか? – Phaeze

0

これはcorectコードです!

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 
using UnityEngine.EventSystems; 
public class DestroyPlayerOnTouch : MonoBehaviour { 
    public GameObject panel; 
     bool hasshield = false; 

    void OnCollisionEnter(Collision col) 
    { 
      if (col.gameObject.tag == "Monster" && !hasshield) 
     { 
      panel.SetActive (true); 
     } 

     else if(col.gameObject.tag == "Monster" && hasshield) 
     { 
      panel.SetActive (false); 
     } 
    } 

    void OnTriggerEnter(Collider other) 
    { 
     if (other.gameObject.tag == "Shield") 
     { 
      Debug.Log("hasshield!"); 
      hasshield = true; 
     } 
    } 
}