Ошибка отладки Unity: в качестве оператора могут использоваться только выражения присваивания, вызова, приращения, уменьшения, ожидания и новых объектов - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь создать 2D игру с мячом.Я хочу получить доступ к переменной int (public int ScoreTask = 10;), которая находится в другом скрипте.Однако, когда я отлаживаю код, я получаю следующие ошибки:

ошибка CS0201: в качестве оператора могут использоваться только выражения присваивания, вызова, приращения, уменьшения, ожидания и новых объектов

ошибка CS0103: имя `ScoreTask 'не существует в текущем контексте

Вот мой сценарий:

public class Countdown : MonoBehaviour 
{   
    private Ball scoreScript;
    public GameObject ScoreBoard;

    void Start () 
    {
        scoreScript = ScoreBoard.GetComponent<Ball> ();
    }
    void Update () 
    {
        GetScore ();
    }
    void GetScore() 
    {
        scoreScript.ScoreTask;

        if (timeLeft == 0 && ScoreTask != 0)
            Application.LoadLevel("GameOver");
    }
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Другое решение, если вы хотите сохранить его как переменную:

void GetScore() 
{
    int scoreTask = scoreScript.ScoreTask;
//  ^^^ because we are "declaring" or creating the variable, we have to specify what 
//      type of variable it is. That is the only time we have to do that. 

    if (timeLeft == 0 && scoreTask != 0)
        Application.LoadLevel("GameOver");
}

Другой вариант:

private int ScoreTest { get { return scoreScript.ScoreTask; } }
//          ^^^ This is a property, and is effectively a function. 
// It's body will get called everytime someone tries to read its value

void GetScore() 
{
    if (timeLeft == 0 && ScoreTask != 0)
        Application.LoadLevel("GameOver");
}

Преимущество перед свойством над полем состоит в том, что если бы я это сделалсохранено значение оценки в scoreTask и scoreScript.ScoreTask изменениях, теперь у меня неправильное значение, сохраненное в scoreTask, потому что все, что у меня есть, - это копия исходного значения, поэтому мне придется обновить scoreTask каждый раз, когда я хочу использовать его, чтобы убедиться, что я не использую устаревшие значения.

Тем не менее, свойства, при этом использовании, всегда будут давать наиболее актуальную стоимость без нас беспокоиться.Также:

void Test()
{
    scoreScript.ScoreTask = 0;
    int scoreTask = scoreScript.ScoreTask;

    scoreTask = 1;
    Debug.Log(scoreScript.ScoreTask);     // prints 0
    Debug.Log(scoreTask);                 // prints 1
}

Все, что мы сделали, это изменили значение copy , но не значение оригинала.Свойство, которое я показал вам, не позволяет вам фактически установить значение и выдает ошибку компиляции.Это хорошо, если ни у одного класса нет какого-либо бизнеса, устанавливающего значение.Но если бы мы сделали:

int ScoreTask
{
    get { return { scoreScript.ScoreTask; }
    set { scoreScript.ScoreTask = value;  } 
}

Теперь, если мы сделаем ScoreTask = 1;, это фактически изменит исходное значение.

0 голосов
/ 05 июня 2018

Просто сделайте:

void GetScore() 
{
    if (timeLeft == 0 && scoreScript.ScoreTask != 0){
        Application.LoadLevel("GameOver");
    }
}

Проблема в том, что вы спрашивали, что ScoreTask было в вашем if состоянии, но он не знает, что такое ScoreTask без контекста, гдеот scoreScript.ScoreTask

...