2016-04-13 254 views
0

就像標題所說的那樣,我想要讓玩家的遊戲對象被破壞時,遊戲會暫停並調出一個屏幕(我做了一個叫做GameOverScreen),但是,我似乎無法擺脫它的困擾。但屏幕顯示遊戲不會暫停。任何想法可能會造成這種情況?這裏是我的代碼:Unity:在玩家對象被破壞之後暫停遊戲

using UnityEngine; 
using UnityEngine.UI; 

public class PlayerHealth : MonoBehaviour 
{ 
    public float m_StartingHealth = 100f;    // The amount of health each tank starts with. 

    public Slider m_Slider;        // The slider to represent how much health the tank currently has. 

    public Image m_FillImage;       // The image component of the slider. 

    public Color m_FullHealthColor = Color.green;  // The color the health bar will be when on full health. 

    public Color m_ZeroHealthColor = Color.red;   // The color the health bar will be when on no health. 

    public GameObject m_ExplosionPrefab;    // A prefab that will be instantiated in Awake, then used whenever the tank dies. 

    public Camera mainCamera; 

    public Camera gameOverCamera; 

    public GameObject GameOverMenu; 

    private bool gameover = false; 
    private AudioSource m_ExplosionAudio;    // The audio source to play when the tank explodes. 
    private ParticleSystem m_ExplosionParticles;  // The particle system the will play when the tank is destroyed. 
    private float m_CurrentHealth;      // How much health the tank currently has. 
    private bool m_Dead;        // Has the tank been reduced beyond zero health yet? 

    void Start() 
    { 
     GameOverMenu.SetActive(false); 
    } 

    private void Awake() 
    { 
     // Instantiate the explosion prefab and get a reference to the particle system on it. 
     m_ExplosionParticles = Instantiate(m_ExplosionPrefab).GetComponent<ParticleSystem>(); 

     // Get a reference to the audio source on the instantiated prefab. 
     m_ExplosionAudio = m_ExplosionParticles.GetComponent<AudioSource>(); 

     // Disable the prefab so it can be activated when it's required. 
     m_ExplosionParticles.gameObject.SetActive(false); 
    } 


    private void OnEnable() 
    { 
     // When the tank is enabled, reset the tank's health and whether or not it's dead. 
     m_CurrentHealth = m_StartingHealth; 
     m_Dead = false; 

     // Update the health slider's value and color. 
     SetHealthUI(); 
    } 


    public void TakeDamage(float amount) 
    { 
     // Reduce current health by the amount of damage done. 
     m_CurrentHealth -= amount; 

     // Change the UI elements appropriately. 
     SetHealthUI(); 

     // If the current health is at or below zero and it has not yet been registered, call OnDeath. 
     if (m_CurrentHealth <= 0f && !m_Dead) 
     { 
      { 
       gameover = !gameover; 
      } 


      if (gameover) 
      { 
       GameOverMenu.SetActive(true); 
       Time.timeScale = 0; 
      } 

      if (!gameover) 
      { 
       GameOverMenu.SetActive(false); 
       Time.timeScale = 1; 
      } 
      OnDeath(); 
      mainCamera.transform.parent = null; 
      mainCamera.enabled = true; 
      gameOverCamera.enabled = false; 

     } 
    } 


    private void SetHealthUI() 
    { 
     // Set the slider's value appropriately. 
     m_Slider.value = m_CurrentHealth; 

     // Interpolate the color of the bar between the choosen colours based on the current percentage of the starting health. 
     m_FillImage.color = Color.Lerp(m_ZeroHealthColor, m_FullHealthColor, m_CurrentHealth/m_StartingHealth); 
    } 


    private void OnDeath() 
    { 
     // Set the flag so that this function is only called once. 
     m_Dead = true; 

     // Move the instantiated explosion prefab to the tank's position and turn it on. 
     m_ExplosionParticles.transform.position = transform.position; 
     m_ExplosionParticles.gameObject.SetActive(true); 

     // Play the particle system of the tank exploding. 
     m_ExplosionParticles.Play(); 

     // Play the tank explosion sound effect. 
     m_ExplosionAudio.Play(); 

     // Turn the tank off. 
     gameObject.SetActive(false); 
    } 
} 
+0

「GameOverMenu」必須在第一個字母是小寫,'gameOverMenu' – Fattie

+0

只是你需要加載GAMEOVER屏幕在新場景。沒有代碼要求 –

回答

1

首先,你並不需要兩個if的,只是做:

if (gameover) { 
    Time.timeScale = 0; 
}else{ 
    Time.timeScale = 1; 
} 

接下來,補充一點:

void OnPauseGame() 
{ 
    GameOverMenu.SetActive(true); 
} 

如果仍然無法正常工作,則添加:

void Update(){ 
    if(Time.timeScale == 0)return; 
} 
1

設置精確的浮點值,如t他的,

Time.timeScale = 0.0f; 
0

我認爲最簡單的方式來暫停遊戲的事件是使用控制檯上的'錯誤暫停'按鈕。 當然,您需要生成一個錯誤,但這很容易。 只需使用

Debug.LogError("Game Paused"); 

好運