Передача данных между скриптами в реальном времени Unity
Есть 2 скрипта - EnemyBehavior и DefaultMovement (поведение противника и игрока). Возникла необходимость в создании окна с очками. При убийстве противника игроку начисляется одно очко. Противники спавнятся в определённом месте, префаб с противниками один. Метод уничтожения противников находится в EnemyBehavior, но т.к. постоянно спавнятся новые противники окно очков хотелось бы прикрутить к игроку (т.е. DefaultMovement). Встала необхдимость постоянно передавать переменную int scoreNumber из EnemyBehavior в DefaultMovement, где та из инта преобразуется в строку для поля с очками. Ответов в интернете много, но не один не подошёл под мою ситуацию с передачей в реальном времени. Вероятнее всего, я чего-то не понял Код в DefaultMovement предполагался такой (ничего не работает):
public Text score;
public int scoreNumber = 0;
void Update()
{
score.text = scoreNumber.ToString();
}
код в EnemyBehavior:
DefaultMovement1 mov = new DefaultMovement1;
private void OnTriggerEnter2D(Collider2D target)
{
if (target.tag == "Bullet")
{
canMove = false;
if(canShoot)
{
canShoot = false;
CancelInvoke("StartShooting");
}
Invoke("TurnOffGameObject", 0.5f);
mov.scoreNumber++;
}
}
Ответы (3 шт):
Попробуйте использовать статическую переменную
static int scopeNumber
Если это два разных класса то я наверное бы использовал синглтон. Тут можно ознакомиться: https://metanit.com/sharp/patterns/2.3.php#
Вариантов решения проблемы на самом деле много.
- Статический класс со счетом
- Синглтон-класс со счетом
- Создать префаб врага на который через инспектор навешен обьект со счетом. И спавнить врагов с этого префаба. (так себе идея, может создавать проблемы в ряде случаев)
- динамически искать игрока и вытягивать необходимый монобихейвор и при спавне игрока (плохая идея - проблемы с перформансом гарантированны, но сработает) или же при его убивании (то же самое)
- Создавать врагов через фабрику которая сразу прикручивает доступ к необходимому монобихейвору-счетчику
Вобщем, выбор более чем широкий. Лично я бы выбрал первый или второй вариант. Хотя пятый тоже неплох.
Unity не поддерживает создание объектов через new.
Unity предлогает альтернативу:
Вам нужно создать публичную переменную с именем скрипта к которому вы хотите обратиться, и в инспекторе указать на каком объекте лежит этот скрипт.
Вот пример указания и обращения к скрипту:
Скрипт: script1
public int hp = 0;
Скрипт: script2
public script1 sc;
void Start(){
sc.hp = 100;
}