Unity: доступ к вложенному классу из другого класса

414
11 мая 2017, 10:04

Доброго времени суток. В игре есть класс GameScore, в котором есть некоторое кол-во вложенных классов, которые должны хранить данные для сравнений. Вот сам класс:

public class GameScore : MonoBehaviour
{
    //first level info
    public class FirstLevel
    {
        internal const float HightScore = 7f;
        internal const float MiddleScore = 11f;
        internal const float LowScore = 15f;
        internal static int bestResult = 0;
    }
    //second level info
    public  class SecondLevel
    {
        internal const float HightScore = 5f;
        internal const float MiddleScore = 7f;
        internal const float LowScore = 9f;
        internal static int bestResult = 0;
    }
}

А теперь сам вопрос: как мне из другого класса получить доступ к вложенному классу FirstLevel, например?

P.S. Я пытаюсь добавить к другому классу public переменную GameScore и уже оттуда получить доступ к вложенному классу, но ничего не получается.

Update (как я пытаюсь получить доступ к классу FirstLevel):

public GameScore GameScorePrefab;
private void CheckStars()
    {
        int bestResult = GameScorePrefab.FirstLevel.bestResult;
        //другой код
    }

После этого пишет: "GameScore.FirstLevel is a type, which is not valid in the given context.FirstLevel cannot reference a type through an expresion, try GameScore.FirstLevel instead." А интелесенс класс FirstLevel вообще не видит.

Answer 1

Я бы на вашем месте сделал public переменные в GameScore и обращался через них. И возможно вместо internal использование public, поскольку вы возможно пытаетесь обращаться из другого namespace

public class GameScore : MonoBehaviour
{
public FirstLevel firstLevel;
public SecondLevel secondLevel;
//first level info
public class FirstLevel
{
    internal const float HightScore = 7f;
    internal const float MiddleScore = 11f;
    internal const float LowScore = 15f;
    public /*static*/ int bestResult = 0;
}
//second level info
public  class SecondLevel
{
    internal const float HightScore = 5f;
    internal const float MiddleScore = 7f;
    internal const float LowScore = 9f;
    public /*static*/ int bestResult = 0;
}

}

тогда доступ будет следующим образом:

public GameScore GameScorePrefab;
private void CheckStars()
{
    int bestResult = GameScorePrefab.firstLevel.bestResult;
    //другой код
}
Answer 2

Если вложенный тип нужно применять вне включающего типа, его надо квалифицировать именем включа­ющего типа.

То есть если имеется класс:

public class OuterClass {
    public class PublicInnerClass {}
    private class PrivatelnnerClass {}
}

то обращение должно быть таким:

void MyMethod() {
    // Создать и использовать открытый вложенный класс.
    OuterClass.PublicInnerClass inner;
    inner = new OuterClass.PublicInnerClass();    
             // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - полное имя
}

или

OuterClass.PublicInnerClass inner;
void MyMethod() {
    inner = new OuterClass.PublicInnerClass();    
             // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - полное имя
}

и т.д.

Если хочешь сохранять данные по каждому лвл, то почему бы не использовать какой-нибудь словарь, где ключом будет номер лвл? Да или просто в список добавлять. А этот список хранить в asset, к примеру.

Answer 3

Вам не нужна переменная типа GameScore. Статические поля принадлежат типам, а не объектам.

int bestResult1 = GameScore.FirstLevel.bestResult;
int bestResult2 = GameScore.SecondLevel.bestResult;
Answer 4

Добавьте в код:

using static YourNamespace.GameScore;

и используйте:

int bestResult = FirstLevel.bestResult;

или через имя "внешнего" класса:

int bestResult = GameScore.FirstLevel.bestResult;
READ ALSO
Переменные в регулярных выражениях

Переменные в регулярных выражениях

Господа, шаблон регвыражения состоит из трех частей - переменная, рег

424
Получить путь для папки ProgramFiles

Получить путь для папки ProgramFiles

этот код на 64 битной винде выдает путь до "C:\Program Files (x86)", а как получить путь до папки ProgramFiles?

232
Запись в скрытую сетевую папку

Запись в скрытую сетевую папку

Здравствуйте форумчане!

273
ICommand и получение ссылки на окно

ICommand и получение ссылки на окно

Добрый день, занялся реализацией кастомной командыРеализовал ICommand и все отлично работает, но возникла мысль, а хорошо бы получать данные...

245