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;
}
}
}
答案 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
,这意味着您基本上暂停游戏,而不是重置游戏。
根据您发布的代码,gameOver
为true
时没有其他任何事情发生。
您应该通过调用重置游戏的方法来切换Time.timeScale=0
(即:按下gif中显示的重置按钮时使用的那个)。或者两者都做,如果这是你的意图。