C# Game Programming Cookbook for Unity 3D / Программирование игр на Unity 3D C#. Книга готовых решений.: 1.1.2 Связь скриптов

Оглавление
Английский оригинал Перевод на русский

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

Важная часть наших управляюще- и компонентно-основанных структур это как наши скрипты будут
взаимодействовать друг с другом. Это неизбежно, что нам нужно будет получать доступ к нашем
скриптам из множества других областей игры, а это значит, мы должны попытаться предоставить
интерфейсы наиболее имеющие смысл. Есть несколько различных способов взаимодействия
между скриптами и объектами в Unity:

leral 26.09.14 в 00:54

0

Важная часть нашей управляющей и компонентной основы это то как наши скрипты будут взаимодействовать друг с другом. Неизбежно то, что нам по требуется получать доступ к нашим скриптам из множества других частей игры, а это значит, мы должны предоставить интерфейсы с наибольшей эффективностью. Есть несколько различных способов взаимодействия
между скриптами и объектами в Unity:

Zeke0028 26.09.14 в 03:21

0

1. Прямые ссылающиеся управляющие скрипты через переменные, заданные в редакторе окна Инспектора.

leral 26.09.14 в 01:01

0

1. Прямые ссылки на переменные управляющих скриптов, изменяемые в редакторе окна Инспектора.

Zeke0028 26.09.14 в 03:26

0

Самый простой способ, чтобы ваши скрипты общались друг с другом, это иметь прямые ссылки к ним в форме публичных переменных в классе. Они заполняются в Unity редакторе с прямой ссылкой на другой скрипт.
Вот пример из прямой ссылки:

leral 26.09.14 в 01:47

0

Самый простой способ, чтобы ваши скрипты общались друг с другом, это иметь прямые ссылки к ним в форме публичных переменных в классе. В Unity редакторе задается ссылка на другой скрипт.
Вот пример прямой ссылки:

Zeke0028 26.09.14 в 03:33

0

public void aScript otherScript;

Zeke0028 25.09.14 в 02:58

0

В редакторе, Инспекторе будет видно поле otherScript. На это поле перетаскивается,объект содержащий скрипт, с который мы хотим связаться. А в классе, вызываем функцию этой переменой, например,

Zeke0028 26.09.14 в 03:41

0

otherScript.DoSomething();

Zeke0028 25.09.14 в 02:59

0

2 Сообщение GameObject с помощью SendMessage.
SendMessage это отличный способ, чтобы отправить сообщение на другой игровой объект и вызвать функцию в одном из подключенных к нему скриптов или компонентов, когда нам не нужна обратная связь. Например,

Zeke0028 27.09.14 в 02:01

0

SomeGameObject.SendMessage("DoSomething");

Zeke0028 25.09.14 в 02:59

0

SendMessage может также принимать несколько параметров, так бы из передача не вызывала ошибки, того что нет приемника, то есть, нет функции в скрипте, прикрепленному к GameObject с именем, совпадающим с в вызовом SendMessage. (SendMessageOptions). Вы также можете передать один параметр в выбранной функции так же, как если вы просто обычно вызывали функцию, на пример

Zeke0028 27.09.14 в 04:00

0

SomeGameObject.SendMessage("AddScore",2);
SomeGameObject.SendMessage("AddScore",
SendMessageOptions.RequireReceiver);
SomeGameObject.SendMessage("AddScore",
SendMessageOptions.DontRequireReceiver);

Zeke0028 25.09.14 в 02:59

0

3. Статические переменные.
Статическая переменная полезна для связи, поскольку оно распространяется по всей системе; она будет доступна в любом другом скрипте. Это особенно полезно для скриптов управления игрой, где несколько различных скриптов общаются с остальными решая такие вещи, как добавить к счету игрока, потеряете жизни, или, возможно, изменить уровень.
Пример декларация статической переменной

Zeke0028 27.09.14 в 09:45

0

private static GameController aController;

Zeke0028 25.09.14 в 02:59

0

Хотя статические переменные видны во всей программе, вы можете их делать частные и публичные. Все становится немного сложнее, когда вы пытаетесь понять разницу между частной и публичной статической переменой. Мне повезло иметь друзей в Twitter, которые смогли объяснить все это для меня, так что позвольте мне передать, что мне сказали:

Zeke0028 27.09.14 в 10:27

0

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

Zeke0028 27.09.14 в 10:51

0

1 В нашем скрипте gamecontroller.cs контролирующему игру, мы создали открытую статическую переменую:

Zeke0028 27.09.14 в 10:58

0

public static GameController gateway;

Zeke0028 25.09.14 в 02:59

0

2 Когда игровой контроллер (gamecontroller.cs) запускает функцию Start (), она сохраняет ссылку на себя в публичной статической переменной, как это:

Zeke0028 27.09.14 в 11:07

0

gateway = this;

Zeke0028 25.09.14 в 02:59

0

3 Из любова другова класса, мы можем теперь получить доступ в игровой контроллер, ссылаясь на его типа а потом на статическую переменную (GameController.gateway), вот так

Zeke0028 27.09.14 в 11:15

0

GameController.gateway.GotBanana();

Zeke0028 25.09.14 в 02:59

0

Частная статическая переменная
Частная статическая переменная видима в классе и в любых других объектах того же класса. Другие классы / скрипты не смогут получить доступа к ней.

Zeke0028 27.09.14 в 11:21

0

В качестве рабочего примера, попробуйте представить себе, что скрипт с название player.cs непосредственно управляет объектами игроков в вашей игре. Все они должны сообщать скрипту менеджеру игроков, когда что-то случится, так мы объявляем менеджера игроков как статическою переменной в нашей скрипте player.cs, как то так:

Zeke0028 27.09.14 в 11:27

0

private static PlayerManager playerManager;

Zeke0028 25.09.14 в 03:00

0

Объект PlayerManager должен быть создан только один раз, для всех экземпляров класса игрока, чтобы быть его можно было использовать для объектов этого класса. Все player.cs скрипты смогут иметь доступ к этому экземпляру PlayerManager.

Zeke0028 27.09.14 в 11:34

0

4 Дизайн шаблон Singleton
В предыдущей части этого раздела, мы рассмотрели использование статической переменной предоставляющей доступ к скрипту менеджеру игры. Самая большая опасность этого метода является то, что можно создать несколько экземпляров одного и того же скрипта. Если это произойдет, вы можете обнаруживать, что ваш скрипт игрока сообщает не тому экземпляру менеджера игры.

Zeke0028 27.09.14 в 11:40

0

Singletonis стандартный шаблон проектирования, который позволяет создавать только один объект определенного класса. Эта модель идеально подходит для игровых скриптов, которым, придется общаться по всему коду игры. Обратите внимание, что мы будем предоставлять статический ссылку на скрипт, точно так же, как мы делали в методе "Статические переменные» ранее в этом разделе, но в реализации класса Singletonis, мы будем добавлять дополнительный код, чтобы убедиться, что только один экземпляр нашего скрипта мог быть создан.

Zeke0028 27.09.14 в 11:45

0
Минутку...