2016-12-01 7 views
0

現在、私は、プレイヤーがキャンドルとマッチの両方を 'ピックアップ'してキャンドルが '出る'ときにスプライトキャンドルを消灯から点灯に変更しようとしています。一定の時間が経過した後。しかし、スペースバーが押されると、デバッグログが真を返すにもかかわらず、消灯から点灯への遷移は発生しません。私はほとんどの日をオンラインで見ていて、文字通りどのように進めるべきか分からないので、ここにいくつかのガイダンスを投稿しています。 基本的に、私は間に移行しようとしている画像は、資産の下のスプライトフォルダにある2つの異なる画像です。キーが押されてもスプライトが変化しない - ユニティ2D

これはこれまでのところ私が得たものです。

//the two sprites transition 
public Sprite unlitCandle; 
public Sprite litCandle; 

private SpriteRenderer spriteRenderer; 

bool pickUpMatches = false; 
bool pickUpCandle = false; 
float timeRemaining =5; 
bool candleLit = false; 

// Use this for initialization 
void Start() { 
    spriteRenderer = GetComponent<SpriteRenderer>(); 
    if (spriteRenderer.sprite == null) 
     spriteRenderer.sprite = unlitCandle; 

} 

// Update is called once per frame 

private void OnTriggerEnter2D(Collider2D collision) 
{ 
    if(collision.gameObject.CompareTag("Matches")) 
    { 
     collision.gameObject.SetActive(false); 
     pickUpMatches = true; 
    } 

    if (collision.gameObject.CompareTag("UnlitCandle")) 
    { 
     collision.gameObject.SetActive(true); 
     pickUpCandle = true; 
    } 

} 

public void CandleTimer() 
{ 
    if (candleLit == true) 
    { 
     timeRemaining = 5; 
     timeRemaining -= Time.deltaTime; 
     if (timeRemaining <= 0) 
     { 
      candleLit = false; 
      spriteRenderer.sprite = unlitCandle; 
     } 
    } 
} 

public void ChangeSprite() 
{ 
    if (spriteRenderer.sprite == unlitCandle) 
    { 
     spriteRenderer.sprite = litCandle; 
    } 
} 

void Update() { 


    if (pickUpCandle == true && pickUpMatches == true) 
    { 
     //Debug.Log(candleLit); 
     if (Input.GetKey(KeyCode.Space) && !candleLit) 
     { 
      CandleTimer(); 
      ChangeSprite(); 
      Debug.Log(timeRemaining); 
      candleLit = true; 
      //Debug.Log(candleLit); 
     } 
    } 
} 

}

+0

これは何も解決しないと思いますが、GetKeyの代わりにGetKeyDownを使用したいと思うかもしれません。 GetKeyDownは1回だけ発生し、GetKeyはキーが押されているすべてのフレームで発生します。 – Maakep

+0

また、キャンドルタイマーは決して始動しません。まず、ろうそくが偽であるかどうかを確認します。次に、それが真であるかどうかをチェックするCandleLitメソッドに行きます。それが偽である場合にのみ実行されるため、決して真実ではありません。 – Maakep

答えて

0

のequals(のような方法と比較してみ)の代わりに==の spriteRenderer.spriteで== unlitCandle

今あなただけの参照ではなくオブジェクトを比較しているため。

少なくとも私は問題だと思う。

+0

OPには、spriteRenderer.spriteを設定したSpriteを明示的に参照するため、後で比較することができます。 – Brien

0

コードにはいくつかの問題が考えられます。まず、Updateの先頭にあるchangeSpriteを呼び出しています。これは、無条件にすべてのフレームで呼び出されていることを意味します。したがって、キャンドルの1つのフレームが消灯した後、即座にスプライトがlitCandleに変更されます。

私は、毎回changeSpriteと呼んでいるのは、すでに点灯しているろうそくを持っている場合にタイマを処理するためだとします。実際には、タイマを処理するコード(changeSpriteの2番目のif文)を別の関数に移動し、processCandleTimerのような名前を付けてください。 Updateの先頭にあるに電話をかけ、changeSpriteメソッドをキー入力時にのみ呼び出すように保存します。

最後に、あなたがタイマーをリセットしていないことが最も問題であると思われる問題は、timeRemainingです。最初にキャンドルを点灯させると、5秒後にタイマーが0になります。その後、changeSpriteが実行されるたびに、最初のifステートメントでスプライトをlitCandleに変更し、次にに変更します.2番目のタイマーは0であるため、unlitCandleに戻します。これを解決するには、キーがヒットしたときにtimeRemaining = 5.0f;のような行を追加する必要があります。

+0

こんにちはブライアン、私はあなたが示唆したことを試みたと信じています。しかし、コンソールに時刻を記録すると、5秒後に止まってしまったことに気付きました。あなたの返事をありがとう、それは非常に感謝しています。 – Anonymous5642

+0

if文を 'if(Input.GetKey(KeyCode.Space)&&!candleLit)'に変更して、ろうそくが点灯していれば元の状態に戻りません。時間がなくなると 'candleLit'をfalseに戻す必要があります。 – Brien

+0

提案をお寄せいただきありがとうございますが、スペースを押した時のタイマーは5秒間しか表示されません。アップデート中ではないようですが、コンソールに5秒間表示されます。私はそれが理にかなったことを願う私はcandleTimerメソッドがタイマーを減らしてしまったと思った。途中で助けてくれてありがとう。 – Anonymous5642

関連する問題