CS0120 происходит (функции) Unity - PullRequest
0 голосов
/ 11 января 2019
public int[,] position = new int[8, 8];

Figure pawn1 = new Figure();
void Start()
{
    pawn1.Create("pawn", 1, new Vector2Int(1, 2));
}

void Update()
{

}

[System.Serializable]
public class Figure
{
    public int id;
    public void Create(string nameEntered, int IdEntered, Vector2Int positionEntered)
    {
        position[positionEntered.x, positionEntered.y] = IdEntered;
        //CS0120 occurs here
    }
}

Получаю эту ошибку и не знаю как ее исправить Кто-нибудь может помочь? Любая помощь приветствуется

1 Ответ

0 голосов
/ 11 января 2019

CS0120 означает

Ссылка на объект требуется для нестатического поля, метода или свойства 'member'


ссылка на

public int[,] position = new int[8, 8];

- это non-static или instanced, поскольку здесь не используется ключевое слово static. Это означает, что единственный способ получить к нему доступ через ссылку на экземпляр внешнего класса.


Решение зависит от того, что вы хотите с ним сделать:

Если вы хотите его non-static, чтобы не"разделяли" между всеми экземплярами внешнего класса, можно решить, что передать ссылку на экземпляр вашего внешнего класса, например

private void Start()
{
    pawn1.Create("pawn", 1, new Vector2Int(1, 2), this);
}   

А в Рисунок Ожидается соответствующее значение (замените <OuterType> на фактическое имя внешних классов)

[System.Serializable]
public class Figure
{
    public int id;
    public void Create(string nameEntered, int IdEntered, Vector2Int positionEntered, <OuterType> reference)
    {
        reference.position[positionEntered.x, positionEntered.y] = IdEntered;
    }
}

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

public static int[,] position;

Hint1
Если это все, что должен делать ваш Create метод, почему бы не установить значение в самом внешнем классе?

private void Start()
{
    position[1,2] = 1;
    // Rather pass on the value in this direction if Figure needs it
    pawn1 = new Figure("pawn", position[1,2], /*...*/);
}

Чем нет необходимости передавать position и т. Д. В экземпляр Figure и затем возвращать записанное значение (если больше не происходит, что вы не показали).

Hint2
Вместо создания нового Figure в

Figure pawn1 = new Figure();

, а затем используйте его метод Create для установки значения, вам, вероятно, лучше использовать конструктор, например ::101057

[System.Serializable]
public class Figure
{
    public int id;
    public Figure(string nameEntered, int IdEntered, Vector2Int positionEntered, <OuterType> reference)
    {
        reference.position[positionEntered.x, positionEntered.y] = IdEntered;
    }
}

и используйте его, например,

Figure pawn1;

private void Start()
{
    pawn1 = new Figure("pawn", 1, new Vector2Int(1, 2), this);
}

Hint3
Использование Start и Update давайте сделаем вывод, что вы очень вероятно используете MonoBehaviour.

Во избежание путаницы с transform.position Я бы порекомендовал назвать ваше поле лучше Positions.

Hint4
Пока вы не используете какую-либо функциональность Vector2Int, а используете ее только для получения двух значений int.

В случае, если вы ничего не делаете с positionEntered, было бы меньше затрат вместо передачи new Vector2Int только для того, чтобы получить два int значения, просто передав сами int значения

pawn1.Create("pawn", 1, 1, 2, this);

и

public void Create(string nameEntered, int IdEntered, int x, int y, <OuterType> reference)
{
    reference.position[x, y] = IdEntered;
}

Hint5
В общем, если вы используете MonoBehaviour компоненты, но не используете один из Start или Update и т. Д., Удалите их полностью из своего класса, потому что Unity вызывает их, как только они существуют, что вызывает ненужные накладные расходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...