Получить информацию о gameobject метода вызова

#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