所以我作为初学者尝试创建一个重生系统,第一次似乎一切正常,但第二次似乎不正常。如果有人知道如何帮助我,我将不胜感激
电平控制:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class LevelControl : MonoBehaviour
{
public int index;
public string levelName;
public GameObject GameOverPanel;
public static LevelControl instance;
private void Awake()
{
if (instance == null)
{
DontDestroyOnLoad(gameObject);
instance = GetComponent<LevelControl>();
}
}
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
//Loading level with build index
SceneManager.LoadScene(index);
//Loading level with scene name
SceneManager.LoadScene(levelName);
//Restart level
//SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
public void LoadLevel1()
{
SceneManager.LoadScene("Game");
}
public GameObject GetGameOverScreen()
{
return GameOverPanel;
}
}
PlayerMovement:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public CharacterController2D controller;
public float runSpeed = 40f;
float horizontalMove = 0f;
bool jump = false;
bool crouch = false;
// Update is called once per frame
void Update()
{
horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed;
if (Input.GetButtonDown("Jump"))
{
jump = true;
}
if (Input.GetButtonDown("Crouch"))
{
crouch = true;
}
else if (Input.GetButtonUp("Crouch"))
{
crouch = false;
}
}
void FixedUpdate()
{
// Move our character
controller.Move(horizontalMove * Time.fixedDeltaTime, crouch, jump);
jump = false;
//FindObjectOfType<GameManager>().EndGame();
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Enemy")
{
//Destroy(FindObjectOfType<CharacterController2D>().gameObject);
GameObject.Find("Player").SetActive(false);
LevelControl.instance.GetGameOverScreen().SetActive(true);
}
}
}
Unity 视频中的错误:https://imgur.com/a/Sr0YCWk
如果您想知道我要做什么,好吧,当 Player 和 Enemy 的 2 个碰撞器发生碰撞时,我希望弹出一个重新启动按钮,然后销毁角色,然后按原样重新启动关卡。
你提供的不多,但我努力用我们现有的东西工作。
在
LevelController
你有
private void Awake()
{
if (instance == null)
{
DontDestroyOnLoad(gameObject);
instance = GetComponent<LevelControl>();
}
}
首先只需使用
instance = this;
;)
那你在做什么
LevelControl.instance.GetGameOverScreenn().SetActive(true);
我没有看到你的设置,但可能
GetGameOverScreenn
在场景重新加载后可能不再存在,而 instance
仍然存在,因为 DontDestroyOnLoad
.
实际上,为什么还要在这里使用 Singleton?如果您无论如何都重新加载整个场景,您只需通过 Inspector 设置一次参考,而不必在场景更改后担心它们......
还有
GameObject.Find("Player").SetActive(false);
似乎很奇怪..你的
PlayerController
不是附加到 Player 对象吗?你可以只使用
gameObject.SetActive(false);
好的,通常这样做会更容易:
if (collision.gameObject.tag == "Enemy")
{
//Destroy(FindObjectOfType<CharacterController2D>().gameObject);
gameObject.SetActive(false);
LevelControl.instance.GetGameOverScreen().SetActive(true);
但是如果您出于任何原因想要将脚本附加到任何其他游戏对象,这将不起作用。如果您首先创建一个包含玩家的游戏对象变量,如下所示:
public GameObject Player = GameObject.Find("Player");
然后说
Player.SetActive(false);
这将创建一个玩家游戏对象,您可以通过调用变量来访问它。