#c# #unity3d
#c# #unity3d
Вопрос:
У меня есть пользовательский скрипт, прикрепленный к Gameobject в качестве компонента, скажем, это Gameobject G1 с компонентом C1
В компоненте C1 у него есть метод для вызова другого объекта Gameobject (G2)’ и присвоения его активному значению false У объекта Gameobject G2 есть другой компонент script C2, в этом скрипте, в методе OnEnable(), я пытаюсь получить объект Gameobject вызывающего скрипта, чтобы я мог ссылаться на него.
Я пытался использовать отражение, что-то вроде
System.Diagnostics.StackTrace()).GetFrame(1).GetMethod().
Я могу получить имя вызывающего метода, reflectType, но я не смог сослаться на фактический Gameobject (G1)
Любой другой способ, которым я могу выполнить этот запрос? tks
К вашему сведению, причина, по которой я не могу просто использовать параметр, заключается в том, что (G1 и C1) являются сторонним скриптом, который я загрузил из Assetstore, я просто не хочу изменять его исходный код, и, к сожалению, этот вызывающий метод не является методом переопределения.
Чтобы ответить на некоторые комментарии ниже:
Компонент (C1) — это сторонний скрипт из assetstore, я могу его точно отредактировать, но я бы предпочел этого не делать, потому что этот C1 может быть обновлен от автора следующими обновлениями, и за ним трудно следить.
C1 имеет общедоступное поле для назначения «Gameobject», и у него есть частный метод для вызова функции «SetActive» этого Gameobject.
Например, я перетаскиваю G2 в это поле, поэтому частный метод C1 может установить для него значение Active(true) всякий раз, когда это необходимо.
Проблема в том, что в этом плагине ресурсов так много gameobjects, к которым прикреплен этот скрипт C1, и мой дизайн заключается в том, чтобы перетащить мой gameobject G2 в каждое общедоступное поле этого скрипта.
И тогда, только если я смогу получить ссылку от G2> C2, чтобы определить, какой C1 вызывает gameobject
Надеюсь, я хорошо это объясню, и заранее спасибо 🙂
Комментарии:
1. Добавьте поле / свойство, общедоступное для редактирования, чтобы
C2
затем отредактироватьC1
, чтобы установить его в компоненте, если он существует:if (target.TryGetComponent(out C2 otherComponent)){C2.activatorGameobject = gameObject;}
2. Как C1 вызывает C2? Является ли это UnityEvent? Почему вы не добавляете в C2 поле, которое ссылается на C1? Немного неясно, что и почему.
3. Похоже, вам было бы лучше использовать статический контроллер или расширение, которое вы вызываете, а не непосредственно объект. передача как вызывающего, так и получателя указанному контроллеру или расширению и используйте это, чтобы затем выполнить необходимые действия, передав gameobject в c2 перед деактивацией g2