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 вызывает их, как только они существуют, что вызывает ненужные накладные расходы.