Я получаю ошибку в консоли Unity.Мне нравится знать, что такое средства и как их решить? - PullRequest
0 голосов
/ 19 июня 2019

Я попытался заставить игровой объект игрока корабля перейти к следующей сцене, если все враги будут убиты и выиграли игру. Я получаю сообщение об ошибке в консоли Unity:

Assets \ Scripts \ GameController.cs (57,25): ошибка CS0122: «SceneLoader.LoadNextScene ()» недоступен из-за уровня защиты.

В настоящее время я могу перейти к следующей сцене только при изменении значения в этой строке:

SceneManager.LoadScene(1); 

to (2) в сцене Loader.cs Я добавил код к игровому контроллеру здесь: общедоступный метод WinGame () void, любая обратная связь с тем, что означает эта ошибка, и как я могу ее исправить, приветствуется. :)

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

1 Ответ

0 голосов
/ 19 июня 2019

С вашей текущей структурой кода проблема в том, что у вас есть метод, определенный внутри функции запуска.

Модифицированный скрипт:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...