2016-04-13 72 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"); 

好运