Страница 1 из 1

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

СообщениеДобавлено: 18 фев 2018, 23:12
ShutTap
Здравствуйте
Понимаю, что тема избитая и изжеванная, но без примера никак не могу понять.
Есть несколько префабов со скриптом. Например, при соприкосновении с префабом нужно увеличить счет в игре (выбиваем очки из объекта, арканоид там, или вроде того).
На префабе
Синтаксис:
Используется 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, хотя в инспекторе назначен?

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

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

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

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

СообщениеДобавлено: 19 фев 2018, 09:01
ShutTap
в интернете я видел про [serializable] и про static функцию, которую можно вызывать наподобие как в моем примере (он взят как раз из интернета про static, и там не было Find...).
Не могли бы объяснить, какой способ лучше в плане нагрузки, памяти и тд, и каким способом в какой ситуации лучше пользоваться?
Очень желательно с примерами...

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

СообщениеДобавлено: 19 фев 2018, 12:44
TeslaGan
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.

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

СообщениеДобавлено: 19 фев 2018, 21:23
ShutTap
префабы расставляю в редакторе обычном, как тогда делать ссылку?
и что на счет serializible?
и в примерах много где встречаю просто gameData = new GameData(); ,например, и там нет ни статик функций, ни Find... Как и в каких случаях это работает?

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

СообщениеДобавлено: 19 фев 2018, 22:03
Anonymyx
Вам надо посмотреть базовые уроки по Unity и c#.

public static float scoreText;

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

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

gameData = new GameData();

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

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

Неа.

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

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