初学者在 Unity 中死亡时遇到重启场景的问题

问题描述 投票:0回答:2

所以我作为初学者尝试创建一个重生系统,第一次似乎一切正常,但第二次似乎不正常。如果有人知道如何帮助我,我将不胜感激

电平控制:

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 个碰撞器发生碰撞时,我希望弹出一个重新启动按钮,然后销毁角色,然后按原样重新启动关卡。

c# visual-studio unity3d
2个回答
3
投票

你提供的不多,但我努力用我们现有的东西工作。

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

0
投票

好的,通常这样做会更容易:

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

这将创建一个玩家游戏对象,您可以通过调用变量来访问它。

© www.soinside.com 2019 - 2024. All rights reserved.