2016-07-28 4 views
0

プレイヤーの現在の健康状態が0になったときにタイマーカウントダウンを開始したいと思います。これまでのタイマーは、彼の心(生命)の。アプリケーション(ゲーム)をプレイすると、タイマーが自動的に起動し、ゲームオーバーパネルが滑って停止します。それは私が望むものではありません。私がしたいのは、プレイヤーがすべての心(命)を失い、パネル上のゲームが滑ってしまったときにタイマーを始めることです。 「あなたは覚醒()およびアップデートにあなたのコードを持っている()メソッドが、私はドンUnity 2D:プレイヤーがすべての命を失ったときにタイマーを開始する方法

public Text timer; 
int minutes = 1; 
int seconds = 0; 
float miliseconds = 0; 

public int curHealth; 
public int maxHealth = 3; 

[Range(1, 59)] 
public int defaultStartMinutes = 1; 
public bool allowTimerRestart = false; 
public bool useElapsedTime = true; 

private int savedSeconds; 
private bool resetTimer = false; 

private DateTime centuryBegin = new DateTime(2001, 1, 1); 

void Start() 
{ 
    curHealth = maxHealth; 
} 

void Awake() 
{ 
    minutes = defaultStartMinutes; 
    if (PlayerPrefs.HasKey("TimeOnExit")) 
    { 
     miliseconds = PlayerPrefs.GetFloat("TimeOnExit"); 
     savedSeconds = (int)miliseconds; 

     if (useElapsedTime && PlayerPrefs.HasKey("CurrentTime")) 
     { 
      int elapsedTicks = (int)(DateTime.Now.Ticks/10000000); 
      int ct = PlayerPrefs.GetInt("CurrentTime", elapsedTicks); 
      PlayerPrefs.DeleteKey("CurrentTime"); 
      elapsedTicks -= ct; 
      if (elapsedTicks < miliseconds) 
      { 
       miliseconds -= elapsedTicks; 
      } 
      else 
      { 
       miliseconds = 0; 
      } 
     } 

     minutes = (int)miliseconds/60; 
     miliseconds -= (minutes * 60); 

     seconds = (int)miliseconds; 
     miliseconds -= seconds; 

     PlayerPrefs.DeleteKey("TimeOnExit"); 

    } 
    savedSeconds = 0; 
} 

public void Update() 
{ 
    // count down in seconds 
    miliseconds += Time.deltaTime; 
    if (resetTimer) 
    { 
     ResetTime(); 
    } 
    if (miliseconds >= 1.0f) 
    { 
     miliseconds -= 1.0f; 
     if ((seconds > 0) || (minutes > 0)) 
     { 
      seconds--; 
      if (seconds < 0) 
      { 
       seconds = 59; 
       minutes--; 
      } 
     } 
     else 
     { 
      resetTimer = allowTimerRestart; 
     } 
    } 

    if (seconds != savedSeconds) 
    { 
     // Show current time 
     timer.text = string.Format("{0}:{1:D2}", minutes, seconds); 
     savedSeconds = seconds; 
    } 
} 

void ResetTime() 
{ 
    minutes = defaultStartMinutes; 
    seconds = 0; 
    savedSeconds = 0; 
    miliseconds = 1.0f - Time.deltaTime; 
    resetTimer = false; 
} 

private void OnApplicationQuit() 
{ 
    int numSeconds = ((minutes * 60) + seconds); 
    if (numSeconds > 0) 
    { 
     miliseconds += numSeconds; 
     PlayerPrefs.SetFloat("TimeOnExit", miliseconds); 

     if (useElapsedTime) 
     { 
      int elapsedTicks = (int)(DateTime.Now.Ticks/10000000); 
      PlayerPrefs.SetInt("CurrentTime", elapsedTicks); 
     } 
    } 
} 
} 

答えて

0

は、これが私のプレイヤーの健康スクリプトです:

public int curHealth; 
public int maxHealth = 3; 
Vector3 startPosition; 
public PlayerHealth playerhealthRef; 
float counter; 
public Animator anima; // drag the panel in here again 
private UI_ManagerScripts UIM; 
private PandaScript ps; 
DateTime currentDate; 
DateTime oldDate; 


void Start() 
{ 
    curHealth = maxHealth; 
    startPosition = transform.position; 
    ps = GameObject.FindGameObjectWithTag("PandaScript").GetComponent <PandaScript>(); 
    currentDate = System.DateTime.Now;  
} 


void Update() 
{ 

    if (curHealth > maxHealth) { 
     curHealth = maxHealth; 
    } 
    if (curHealth <= 0) { 

     Die(); 
    } 
} 

void Awake() 
{ 
    UIM = GameObject.Find ("UIManager").GetComponent<UI_ManagerScripts>(); 
} 

void Die(){ 

    if (PlayerPrefs.HasKey ("Highscore")) { 
     if (PlayerPrefs.GetInt ("Highscore") < ps.Score) { 
      PlayerPrefs.SetInt ("Highscore", ps.Score); 
     } 
    } else 
    { 
     PlayerPrefs.SetInt ("Highscore", ps.Score); 
    } 

    UIM.EnableBoolAnimator(anima); 
    PlayerPrefs.SetInt("RemainingLives", curHealth); 
    print("Remanining Lives: " + curHealth); 
    PlayerPrefs.Save(); 
} 

void OnApplicationQuit() 
{ 
    PlayerPrefs.SetString("sysString", System.DateTime.Now.ToBinary().ToString()); 
    print("Saving this date to prefs: " + System.DateTime.Now); 
} 

void LoadSaveData() 
{ 
    PlayerPrefs.GetInt ("RemainingLives",0); 
    OnApplicationQuit(); 
} 

public void Damage(int dmg) 
{ 
    curHealth -= dmg; 
    Reset(); 
} 

void Reset() 
{ 
    transform.position = startPosition; 
    GotoMouse.target = startPosition; 

} 
} 

そして、これは私のタイマースクリプトですプレーヤーが敗北するのを待つように指示しているものは見ないでください。タイマーを開始させるときは、フラグを設定するか、タイマースクリプトを有効にすることができます。

PlayerPrefsは、必ずしも必要ではないものにも使用されているようです。ゲームが終了して再始動した後で残っている人生を追跡したくない(あまり意味をなさない)場合を除いて、インスタンス、あるいはクラスの変数を使う方が良いでしょう。

+0

それは私はすでに私の問題を修正しました罰金です。しかし、ありがとう –

1

使用この自由と非常に便利な資産:https://www.assetstore.unity3d.com/en/#!/content/17276

次に、このような何か書く:ときの条件はtrueを返すところで.Subscribeに

Observable.EveryUpdate() 
    .Where(_ => currentHealth <= 0) 
    .Subscribe(_ => 
    { 
     //Do something... 
     //Ex. Die(); 
    }); 

すべてのものが行います。 Start()ではなくUpdate()でこれを使用します。

あー...、あなたはいくつかの簡単なタイマーをしたい場合は、例えば、書き込み:

Observable.Timer(TimeSpan.FromMilliseconds(1000)) 
    .Subscribe(_ => 
    { 

    }); 
+0

私はすでに私の問題を修正しても問題ありません。ありがとう、結構です –

関連する問題