无法重置团结游戏

时间:2018-03-18 22:54:31

标签: c# unity3d

https://i.imgur.com/El9iCsP.gifv

上面是正在发生的事情的GIF。当我只是按下重置按钮时,游戏重置正常,但是当玩家实际死亡(与墙壁碰撞)时,游戏不会重新启动。基本上我正在为一个大学项目制作一种速度赛跑者(非常快速的黑客攻击),但这也是我第一次使用Unity。从我收集到的问题是由于我创建了一个GameControl类来从播放器类访问gameOver变量但是我不完全确定如何解决这个问题。

GameControl:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class GameControl : MonoBehaviour
{
    public static GameControl instance;
    public bool gameOver = false;
    public float scrollSpeed;
    public float scrollIncrease;
    public float startTime;
    public Text timerText;

    public void resetGame()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    void Awake()
    {
        if(instance == null)
        {
            instance = this;
        }
        else if(instance != null)
        {
            Destroy(gameObject);
        }
        startTime = Time.time;
    }

    void Update()
    {
        if (gameOver == false)
        {
            float t = Time.time - startTime;
            string minutes = ((int)t / 60).ToString();
            string seconds = (t % 60).ToString("f2");
            timerText.text = minutes + ":" + seconds;
            scrollSpeed -= scrollIncrease;
        }
        else
        {
            Time.timeScale = 0;
        }
    }
}

播放器:

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;

public class player : MonoBehaviour {

    Rigidbody2D rb;
    public float moveSpeed;
    public float jump;
    public float jumps = 0;
    void Start () {
        rb = GetComponent<Rigidbody2D>();
    }
    void Update()
    {

        if (GameControl.instance.gameOver == false)
        {
            float moveHorizontal = Input.GetAxis("Horizontal");
            rb.velocity = new Vector2(moveHorizontal * moveSpeed, rb.velocity.y);
            if (Input.GetKeyDown(KeyCode.Space) && jumps < 2)
            {
                jumps++;
                rb.velocity = Vector2.zero;
                rb.AddForce(new Vector2(0, jump));
            }
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if(collision.gameObject.tag == "obstacle" || collision.gameObject.name == "Left Boundry")
        {
            GameControl.instance.gameOver = true;
        }
        else if(collision.gameObject.tag == "floor")
        {
            jumps = 0;
        }
    }

}

2 个答案:

答案 0 :(得分:0)

我不知道?action=xxxx&username=xxx&password=xxx&accesskey=secret_key_passphrase_goes_here 应该做什么,但我认为它不会重新初始化SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);类的静态实例。因此,GameControl不会重置并保持gameOver

要解决此问题,您可以在GameControl类中添加true方法,该方法初始化所有成员并在重置时调用。

答案 1 :(得分:0)

检测到碰撞后,您将GameControl.instance.gameOver设置为true

之后,if (gameOver == false)Update()内的GameControl执行Time.timeScale=0,这意味着您基本上暂停游戏,而不是重置游戏。

根据您发布的代码,gameOvertrue时没有其他任何事情发生。

您应该通过调用重置游戏的方法来切换Time.timeScale=0(即:按下gif中显示的重置按钮时使用的那个)。或者两者都做,如果这是你的意图。