Почему ругается Unity?

Есть скрипт который должен просто прибавлять очки. Эти два метода работают нормально, я вызываю Coins() с другого скрипта и все работает, но стоит мне разкомментить последнюю строчку, мне выдает ошибку:…
Assets\Scripts\PointsCode.cs(21,3): error CS0120: An object reference is required for the non-static field, method, or property ‘Component.GetComponent()’


Понимаю что ошибка может быть банальной, я просто только учусь и рассчитываю на вашу помощь!!!

Нельзя вызвать GetComponent из static, как он поймет у какого объекта компонент брать?

Вместо static можно просто добавить этот PointsCode как поле всем нужным скриптам.


Код лучше выкладывать текстом с помощью кнопки Код .

А что вы имели ввиду под словом поле? как это правильнее сделать?

Объявить public PointsCode pointsCode в скриптах, где они нужны, и в инспекторе кинуть в них объект с этим скриптом.

Значиться, по этапно:

  1. В скрипте который должен вызвать PointsCode.Coins() пишем…
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Group : MonoBehaviour
{
    float lastFall = 0;
    public GameObject pointsCode;

    void Start()
    {
      ...
    }

2)Создаем префаб с объектом текста (у меня это Canvas/Text) также в самом Text у меня скрипт PointsCode
3)В инспекторе перетаскиваем префаб в появившиеся окошко для объекта в скрипте Group
4)И теперь чтобы скрипт Group вызвал мне функцию Coins() мне надо написать… Могу лишь предположить что что-то вроде этого

    pointsCode.PointsCode.Coins();

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

Префаб не обязательно, сейчас же скрипт висит на каком-то объекте, вот этот объект и кинуть остальным.

Вместо

нужно класс скрипта

и тогда можно просто вызывать его функции и т.д.

pointsCode.Coins()

сейчас же скрипт висит на каком-то объекте, вот этот объект и кинуть остальным

Он не хочет “помещаться” в ячейку в скрипте :cold_sweat:
Просто не воспринимает, а если написать ( public GameObject pointsCode ) то помещается, я понимаю что так не заработает и не понимаю что делать

А что в нем? Может не тот объект?

Нет, там пусто
Туда не один объект не вставляется

Так там не пусто должно быть )
В нем должен быть этот скрипт.

(речь не о слоте на скрине, а о том объекте, что туда перетаскивается)

АААААААААА, Смотрите, так как я новичок и только познаю все прелести GameDev я решил начать с простого, я делаю тетрис. Я сейчас сделал вроде как все правильно, ошибок нет, появилась фигура и вылетела ошибка, я поставил игру на паузу, выделил фигуру и смог перенести в окошко текст со скриптом PointsCode, снял с паузы и все заработало как я и надеялся, но изначально фигур нет, и перенести в public PointsCode pointsCode объект Текст Unity не дает, как сделать префабы фигур с вставленным в них объектом Текст.
Надеюсь я понятно изложил свои мысли

хм, точнее на скрине не то открыто.

Надо так:

  1. Создать объект со скриптом (например, перетащив скрипт в пустое место внизу).

  2. Аналогично создать второй объект со своим скриптом, перетащить первый объект в поле. Выделять надо объект, а не скрипт в списке файлов.

using System;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    public void SayHi(string playerName)
    {
        Debug.Log(String.Format("Hi! I'm {0}. Nice to meet you, {1}.", name, playerName));
    }
}
using UnityEngine;

public class MyScript2 : MonoBehaviour
{
    public MyScript myScript;

    void Start()
    {
        myScript.SayHi("John");        
    }
}

Это я понимаю, просто у меня фигурок тетриса изначально нет, они в виде префабов, и пустой объект (спавнер) их на рандом создает, и вот когда они созданы все работает, но их же изначально нет, вот в этом вся загвоздка

Можно либо присваивать при создании объекта из префаба, либо найти объект на сцене по имени, тегу и т.д.

Unity - Scripting API: GameObject.Find

using UnityEngine;

public class MyScript2 : MonoBehaviour
{
    public MyScript myScript;

    void Start()
    {
        myScript = GameObject.Find("GameObject1").GetComponent<MyScript>();
        
        myScript.SayHi(name);        
    }
}