Из скрипта префаба вызвать метод другого класса

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Из скрипта префаба вызвать метод другого класса

Сообщение ShutTap 18 фев 2018, 23:12

Здравствуйте
Понимаю, что тема избитая и изжеванная, но без примера никак не могу понять.
Есть несколько префабов со скриптом. Например, при соприкосновении с префабом нужно увеличить счет в игре (выбиваем очки из объекта, арканоид там, или вроде того).
На префабе
Синтаксис:
Используется csharp
public class blockBehaviour : MonoBehaviour {
GameControll gameControll;
    private void OnCollisionEnter(Collision collision)
    {
        gameControll = new GameControll();
        gameControll.Score(10f);
    }
}

то есть, при соприкосновении вызываем счетчик счета со значением 10 (на 10 увеличивается общий счет)
И есть сам объект gameControll с кодом
Синтаксис:
Используется csharp
public class GameControll : MonoBehaviour {
    public float scoreText;
    public Text scoreObj;
   
    public void Score(float scoreNum)
    {
        scoreText += scoreNum;
        scoreObj.text = scoreText.ToString();
    }
}

где этот счет считается и выводится в текстовый ui.
Но данные код вызывает ошибку
You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()

и

NullReferenceException: Object reference not set to an instance of an object
GameControll.Score (Single scoreNum)

почему вдруг нельзя вызывать new и почему объект не задан в score, хотя в инспекторе назначен?
ShutTap
UNец
 
Сообщения: 25
Зарегистрирован: 04 фев 2017, 20:42

Re: Из скрипта префаба вызвать метод другого класса

Сообщение BFZ 19 фев 2018, 00:25

gameControll это просто ссылка на экземпляр класса, найти его можно так: GameObject.Find("ОбъектНаКоторомВиситЭтотЭкземпляр").GetComponent<GameControll>();

то есть:
Синтаксис:
Используется csharp
public class blockBehaviour : MonoBehaviour {
GameControll gameControll;
    private void OnCollisionEnter(Collision collision)
    {
        GameObject.Find("ОбъектНаКоторомВиситЭтотЭкземпляр").GetComponent<GameControll>();
        gameControll.Score(10f);
    }
}
BFZ
UNITрон
 
Сообщения: 252
Зарегистрирован: 28 июн 2017, 02:16

Re: Из скрипта префаба вызвать метод другого класса

Сообщение ShutTap 19 фев 2018, 09:01

в интернете я видел про [serializable] и про static функцию, которую можно вызывать наподобие как в моем примере (он взят как раз из интернета про static, и там не было Find...).
Не могли бы объяснить, какой способ лучше в плане нагрузки, памяти и тд, и каким способом в какой ситуации лучше пользоваться?
Очень желательно с примерами...
ShutTap
UNец
 
Сообщения: 25
Зарегистрирован: 04 фев 2017, 20:42

Re: Из скрипта префаба вызвать метод другого класса

Сообщение TeslaGan 19 фев 2018, 12:44

ShutTap писал(а):Но данные код вызывает ошибку
You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()

ошибка так и говорит: нельзя использовать для классов, унаследованных от MonoBehaviour слово new. связанно это с архитектурой самого Unity. их можно только инстанцировать(Instatiate). Но оба этих действия создают новый объект типа gameControll и вам оно не подойдет.
ShutTap писал(а):почему вдруг нельзя вызывать new и почему объект не задан в score, хотя в инспекторе назначен?

один префаб можно использовать в любой сцене, даже в той, в которой нет пресловутого объекта, на котором висит скрипт gameControll. по этому никакие ссылки на объекты не сохраняются.
Выхода у вас три:
BFZ писал(а):GameObject.Find("ОбъектНаКоторомВиситЭтотЭкземпляр").GetComponent<GameControll>();

но если эта функция вызывается часто, а вы делаете игру для мобильника(а бывает и не только на мобильном), это может вызывать лаги.
ShutTap писал(а): про static функцию

статик функции - общие функции. их главное преимущество - их можно вызвать из любого места, но тут дела обстоят как с префабами: т.к. мы не знаем, существует ли объект на сцене, сл-но переменные, с которыми работают статик функции, должны быть тоже статик.

третий способ: вы же в каком-то месте добавляете на сцену префабы. добавьте в этом же месте добавление ссылок на GameControll в скрипт blockBehaviour.
TeslaGan
UNITрон
 
Сообщения: 315
Зарегистрирован: 01 авг 2015, 18:00

Re: Из скрипта префаба вызвать метод другого класса

Сообщение ShutTap 19 фев 2018, 21:23

префабы расставляю в редакторе обычном, как тогда делать ссылку?
и что на счет serializible?
и в примерах много где встречаю просто gameData = new GameData(); ,например, и там нет ни статик функций, ни Find... Как и в каких случаях это работает?
ShutTap
UNец
 
Сообщения: 25
Зарегистрирован: 04 фев 2017, 20:42

Re: Из скрипта префаба вызвать метод другого класса

Сообщение Anonymyx 19 фев 2018, 22:03

Вам надо посмотреть базовые уроки по Unity и c#.

public static float scoreText;

При коллизии:
GameControll.score += 10;

Serializable - атрибут, указывающий что данный класс пригоден для сериализации, т.е. Untity может запомнить значение этого поля.

gameData = new GameData();

Скорее всего класс GameData не наследуется то MonoBeh'а.

сл-но переменные, с которыми работают статик функции, должны быть тоже статик

Неа.
Аватара пользователя
Anonymyx
Адепт
 
Сообщения: 1973
Зарегистрирован: 05 апр 2015, 15:55

Re: Из скрипта префаба вызвать метод другого класса

Сообщение юnity 22 фев 2018, 11:01

Give exact coordinates of the decision of the problems
Аватара пользователя
юnity
UNITрон
 
Сообщения: 290
Зарегистрирован: 21 июл 2015, 18:30


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24