Доступ к скрипту из другого скрипта Unity - PullRequest
0 голосов
/ 26 января 2019

Я написал небольшой актив (редактор) для Unity. Это работает хорошо. Однако весь код был в едином поведении Monobehaviour, и я хотел разделить его на три дополнительных сценария, каждый из которых предназначен для определенного вида деятельности (чтение / запись файлов, управление объектами, управление навигацией). Таким образом, я столкнулся с методами Unity запрашивает доступ к данным в других скриптах (я пришел из Delphi с его простыми модулями). Решение, которое я нашел, заключается в следующем: различные компоненты в инспекторе используют SendMessage для вызова методов в сценарии Target, а некоторые из этих методов вызывают другие методы в трех дополнительных сценариях. Три сценария не имеют доступа друг к другу, но должны совместно использовать переменные целевого сценария. Для этого в целевом скрипте:

[HideInInspector] public FileScript1 Script1;
[HideInInspector] public FileScript2 Script2;
[HideInInspector] public FileScript3 Script3;

    public void Start () {
    Script1 = FindObjectOfType (typeof(FileScript1)) as FileScript1;
    Script2 = FindObjectOfType (typeof(FileScript2)) as FileScript2;
    Script3 = FindObjectOfType (typeof(FileScript3)) as FileScript3;
}

и для доступа к другим скриптам я могу использовать Script1.myMethod.

В трех сценариях я создаю экземпляр

public FileTarget myTarget;

Наконец, мне нужно добавить три сценария в качестве компонентов сценария Target и перетащить объект FileTarget на каждый из Иерархии. Тогда я могу использовать [HideInInspector]. Таким образом, я также могу получить доступ к целевому скрипту.

Все это выглядело очень трудоемким, и я подумал об использовании статических классов для трех сценариев вместо Monobehaviour (эти три сценария не являются объектами в иерархии). Но помимо того, что нет необходимости создавать экземпляры трех сценариев в сценарии Target, мне все еще нужно создать экземпляр сценария назначения в трех сценариях и добавить их в качестве компонентов Target. Я определенно не хочу просить вас преподавать программирование, но не могли бы вы дать мне лучший способ сделать это? Спасибо

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Поскольку ваши три сценария не нужно прикреплять к объектам Gameobjects, вы можете просто определить их как обычные классы C # и создать их экземпляры из Target.
Кроме того, вы можете дать им ссылку на Target в качестве параметра вконструктор, который вы можете сохранить как закрытый член для доступа позже, например:

class FileScript1
{
   private Target _target;
   public FileScript1(Target target)
   {
      _target = target;
   }
}

И создать объекты в Start из Target следующим образом:

private FileScript1 Script1;

public void Start () {
    Script1 = new FileScript1(this);
}
0 голосов
/ 26 января 2019

Предполагая, что эти сценарии будут прикреплены к GameObjects, вы захотите использовать GetComponent <> () .Способ вызова заключается в том, что он вернет компонент указанного типа или ноль, если он не существует.Таким образом, вы можете прикрепить ваш скрипт (который также является компонентом) к GameObject по вашему выбору, а затем сделать вызов.

Например:

myClassVariable = this.gameObject.getComponent<myClass>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...