C 反射 掀起Unity Editor面紗

2021-08-02 05:48:42 字數 1219 閱讀 3517

感覺非常棒的spy手法,可以拿到更強大的api使用!

之前在群裡看到有人提到profiler memory plus這個外掛程式,相當不錯~在原來profiler功能上擴充套件出了diff功能 非常實用。

然後我就在想這個是怎麼做的呢,某天在折騰shader keyword的時候突然靈光一閃,莫非是private api搞的? 動手試了下果然可行。

具體解釋一下:unity引擎底層是用c++寫的,但是外圍邏輯絕大部分都是c#實現,包括editor本身。平常我們常見的unityengine.dll和unityeditor.dll裡就有大量的寶藏值得挖掘,網上已經有提供了乙份unitydecompiled(當然也可以自己用ilspy等工具處理)。我個人覺得可以分為兩類:

但是誰讓這些**是人見人愛的c#**呢!在編輯器下完全可以使用反射來繞開這個限制。具體來說舉個例子,如果我們希望訪問到profilerwindow裡的某個私有變數m_profilerwindow

private

static

list

<

profilerwindow

>

m_profilerwindows

=new

list

<

profilerwindow

>();

完全可以這麼寫

m_profilerwindows

=tprofilerwindow

.getfield

("m_profilerwindows"

,bindingflags

.nonpublic

|bindingflags

.static

);ilist

windows

=m_profilerwindows

.getvalue

(null)as

ilist

;

這樣直接繞開了internal和private雙重限制。在這個思路下,三下五除二就自己實現了想要的功能

最後也不得不提示下這樣做的缺點:

不過總得來說,作為編輯器擴充套件非常靠譜,最近用這個思路還折騰了不少事情,譬如設定material inspector面板的reflection probe/完美抓取shader keyword等。這酸爽感覺就是開啟了乙個新世界的大門(逃)

C 反射 掀起Unity Editor面紗

之前在群裡看到有人提到profiler memory plus這個外掛程式,相當不錯 在原來profiler功能上擴充套件出了diff功能 非常實用。然後我就在想這個是怎麼做的呢,某天在折騰shader keyword的時候突然靈光一閃,莫非是private api搞的?動手試了下果然可行。具體解釋...

c so 反射 C 實現反射機制

net下的很多技術都是基於反射機制來實現的,反射讓.net平台下的語言變得得心應手。最簡單的,比如列舉型別,我們我可以很容易的獲得乙個列舉變數的數值以及其名稱字串。可是,在c 中,列舉變數本質上和乙個整形變數沒有區別,我們很難獲取乙個列舉變數的名稱字串。其實在c 中,我們可以通過巨集來實現類似反射的...

c so 反射 c 實現反射機制

下午接了個阿里 面試,當時剛剛睡醒,感覺有點懵。大腦莫名當機狀態,很多問題沒有表述清楚,有乙個關於 c 如何實現反射機制的問題,感覺蠻有意思,當時雖然回答了用函式指標和工廠模式,但是表述並不當,細節也沒有想清楚。晚上抽空簡單實現了一發 file name reflector.cpp author x...