【问题标题】:I get an error in the Unity console. I like to know what is means and how to solve it?我在 Unity 控制台中收到错误消息。我想知道什么是手段以及如何解决它?
【发布时间】:2019-06-19 12:31:46
【问题描述】:

如果所有敌人都被杀死并赢得比赛,我试图让玩家运送游戏对象移动到下一个场景。我在 Unity 控制台中收到错误消息:

Assets\Scripts\GameController.cs(57,25):错误 CS0122:“SceneLoader.LoadNextScene()”因其保护级别而无法访问。

目前,我只有在改变这一行的值时才能进入下一个场景:

SceneManager.LoadScene(1); 

到场景 Loader.cs 中的 (2) 我在这里向游戏控制器添加了代码:public void WinGame() 方法对此错误的含义以及如何修复它的任何反馈表示赞赏。 :)

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour
{
    [SerializeField] float levelLoadDelay = 2f;
    private int currentSceneIndex = -1;

    private void Awake()
    {
        currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
    }

    private void Start()
    {
        if (currentSceneIndex == 0)
        {
             Invoke("LoadFirstScene", 2f);
        }

        private void LoadNextScene()
        {
            int currentSceneIndex =   SceneManager.GetActiveScene().buildIndex;
            int nextSceneIndex = currentSceneIndex + 1;
            SceneManager.LoadScene(nextSceneIndex);
        }

        public void LoadFirstScene()
        {
            SceneManager.LoadScene(1);
        }
    }


using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.UI;

public class GameController : MonoBehaviour
{
    public Text scoreText;
    public Text restartText;
    public Text gameOverText;

    [SerializeField] private Text outcome;
    [SerializeField] private PlayableDirector masterTimelinePlayableDirector;
    [SerializeField] private GameObject playerShip;

    private bool winGame = false;
    private bool gameOver = false;
    private int score;
    private int enemiesLeft = 0;
    private SceneLoader sceneLoader;

    public bool allEnemiesKilled;
    public float enemiesInScene = 10.0f;
    public float enemiesKilled;

    void Start()
    {
        sceneLoader = FindObjectOfType<SceneLoader>();
        enemiesLeft = GameObject.FindObjectsOfType<Enemy>().Length;
        restartText.text = "";
        gameOverText.text = "";
        outcome.text = "";
        score = 0;
        UpdateScore();
    }

    void Update()
    {
        if (gameOver)
        {
            if (Input.GetKeyDown(KeyCode.R))
            {
                 sceneLoader.LoadFirstScene();
            }
        }

        if (PlayerHealth.cur_health <= 0)
        {
            GameOver();
        }
    }

    public void WinGame()
    {
        if (enemiesKilled < enemiesInScene)
        {
             allEnemiesKilled = true;
        }

        sceneLoader.LoadNextScene();
    }

    public void DecreaseEnemyCount()
    {
        enemiesLeft--;
    }

    public void AddScore(int newScoreValue)
    {
        score += newScoreValue;
        UpdateScore();
    }

    void UpdateScore()
    {
        scoreText.text = "Score: " + score;
    }

   public void GameOver()
   {
        gameOver = true;
        gameOverText.text = "Game Over!";

        if (enemiesLeft > 0)
        {
             outcome.text = "You Lose";
        }
        else
        {
            outcome.text = "You Win";
        }

        restartText.text = "Press 'R' for Restart";

        masterTimelinePlayableDirector.Stop();
        playerShip.SetActive(false);
    }
}

【问题讨论】:

标签: c# unity3d


【解决方案1】:

使用您当前的代码结构,问题在于您在 start 函数中定义了方法。

修改后的脚本:

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour
{
[SerializeField] float levelLoadDelay = 2f;
private int currentSceneIndex = -1;
 public static SceneLoader instance;

private void Awake()
{
    currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
instance = this;
}

private void Start()
{
    if (currentSceneIndex == 0)
    {
         Invoke("LoadFirstScene", 2f);
    }
}

    public void LoadNextScene()
    {
        int currentSceneIndex =   SceneManager.GetActiveScene().buildIndex;
        int nextSceneIndex = currentSceneIndex + 1;
        SceneManager.LoadScene(nextSceneIndex);
    }

    public void LoadFirstScene()
    {
        SceneManager.LoadScene(1);
    }

您现在可以使用代码调用 LoadNextScene:

SceneLoader.instance.LoadNextScene();

【讨论】:

  • 感谢您的回复 Muhammad 我更新了代码但仍然无法进入下一个场景。
  • 您是否仍然遇到同样的错误或现在发生了什么?
  • @IDarkCoder 嗨,是的,我仍然没有进入下一个场景,但错误消失了。
猜你喜欢
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2018-05-31
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多