【问题标题】:Having trouble resetting unity game重置统一游戏时遇到问题
【发布时间】:2018-03-18 22:54:30
【问题描述】:

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

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

游戏控制:

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;
        }
    }

}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我不知道SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); 应该做什么,但我认为它不会重新初始化您的GameControl 类的静态实例。因此gameOver 不会重置并保持true

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

    【讨论】:

      【解决方案2】:

      当检测到碰撞时,将GameControl.instance.gameOver 设置为true

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

      根据您发布的代码,当gameOvertrue 时不会发生任何其他事情。

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

      【讨论】:

      • 谢谢伙计,甚至没有意识到 time.timescale=0 停止了整个运行时间。从字面上摆脱它,它工作得很好。我想我想做的是停止运行计时器和物理,这现在没有任何意义。
      • 好吧,如果你想停止物理更新,那么是的,将timeScale 设置为 0 就是这样做的方法(即:FixedUpdate() 根本不会在任何脚本上调用) .无论如何,Update() 在时间刻度为 0 时仍会被调用。如果它解决了您的问题,请不要忘记将答案标记为已接受。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多