UnityMod開發(fā)教程 09 Harmony工具類

一. 前言

??經(jīng)過前面8節(jié)的學習霍骄,我們已經(jīng)可以制作很多種mod,但是在開發(fā)中扑庞,總會出現(xiàn)一點意外情況譬重,比如,我想修改的數(shù)據(jù)是private的怎么辦罐氨?如果你對C#有些經(jīng)驗臀规,第一反應應該是,反射栅隐。是的塔嬉,在C#中訪問和修改私有成員需要使用反射,對于mod來說租悄,我們不可避免的總是需要訪問一些被設(shè)置為私有的成員或者還有一些特別的需要谨究,所以,Harmony為我們準備了幾個工具類泣棋,讓我們更方便的完成需求胶哲。

二. AccessTools

??這是Harmony為了簡化反射為我們準備的類,通過它我們可以輕松的訪問這個成員潭辈,因為所有的方法都使用完整的綁定標志纪吮,無論它是私有還是靜態(tài)的等等都可以訪問。
常用方法

public static Type TypeByName(string name) //根據(jù)名字獲取類型
public static FieldInfo Field(Type type, string name) //根據(jù)類型和名字獲取字段
public static PropertyInfo Property(Type type, string name) //根據(jù)類型和名字獲取屬性
public static MethodInfo Method(Type type, string name, Type[] parameters = null, Type[] generics = null) //根據(jù)類型和名字和(參數(shù)萎胰、泛型 可選)來獲取方法
public static ConstructorInfo Constructor(Type type, Type[] parameters = null) //根據(jù)類型和參數(shù)來獲取構(gòu)造函數(shù)
public static Type Inner(Type type, string name) //根據(jù)類型和名字來獲取內(nèi)部類型

三. Traverse

??上面AccessTools獲取到的都是宏觀的信息,我們通常需要得到的是具體的數(shù)據(jù)棚辽,這個時候就到了Traverse出場的時候了技竟。

// 從類型或者實例來創(chuàng)建Traverse
public static Traverse Create(Type type)
public static Traverse Create<T>()
public static Traverse CreateWithType(string name)

// 繼續(xù)深入我們需要的數(shù)據(jù)
public Traverse Type(string name)
public Traverse Field(string name)
public Traverse Property(string name, object[] index = null)
public Traverse Method(string name, params object[] arguments)
public Traverse Method(string name, Type[] paramTypes, object[] arguments = null)

// 獲取數(shù)據(jù)
public object GetValue()
public T GetValue<T>()
public object GetValue(params object[] arguments)
public T GetValue<T>(params object[] arguments)
public override string ToString()

// 設(shè)置值
public Traverse SetValue(object value)

// 迭代
public static void IterateFields(object source, Action<Traverse> action)
public static void IterateFields(object source, object target, Action<Traverse, Traverse> action)
public static void IterateProperties(object source, Action<Traverse> action)
public static void IterateProperties(object source, object target, Action<Traverse, Traverse> action)

例子:假設(shè)游戲中有一個類People,它是這樣的

public class People
{
    public string Name;
    public int Age;
    private string address;
    ...
}

People的地址是私有的屈藐,我們不能直接訪問它榔组,這個時候我們使用Traverse熙尉。

// 游戲中某個地方的People
People p = new People();
//我們獲取p.address的值
string address = Traverse.Create(p).Field("address").GetValue<string>();

四. FileLog

??為了簡單和快速的記錄日志用以開發(fā)調(diào)試,Harmony準備了FileLog類搓扯,它只有3個方法检痰,非常簡單。

//創(chuàng)建一個新的日志文件锨推,名為"harmony.log.txt"铅歼,保存在電腦的桌面上,如果已經(jīng)存在這個文件换可,則會將str添加到文件末尾
public static void Log(string str)

//刪除日志文件
public static void Reset()

//用法相當于Log(string str)椎椰,但是以16進制保存
public static unsafe void LogBytes(long ptr, int len)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者沾鳄。
  • 序言:七十年代末慨飘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子译荞,更是在濱河造成了極大的恐慌瓤的,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吞歼,死亡現(xiàn)場離奇詭異圈膏,居然都是意外死亡,警方通過查閱死者的電腦和手機浆熔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門本辐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人医增,你說我怎么就攤上這事慎皱。” “怎么了叶骨?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵茫多,是天一觀的道長。 經(jīng)常有香客問我忽刽,道長天揖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任跪帝,我火速辦了婚禮今膊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伞剑。我一直安慰自己斑唬,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恕刘,像睡著了一般缤谎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褐着,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天坷澡,我揣著相機與錄音,去河邊找鬼含蓉。 笑死频敛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谴餐。 我是一名探鬼主播姻政,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岂嗓!你這毒婦竟也來了汁展?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤厌殉,失蹤者是張志新(化名)和其女友劉穎食绿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體公罕,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡器紧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了楼眷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铲汪。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罐柳,靈堂內(nèi)的尸體忽然破棺而出掌腰,到底是詐尸還是另有隱情,我是刑警寧澤张吉,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布齿梁,位于F島的核電站,受9級特大地震影響肮蛹,放射性物質(zhì)發(fā)生泄漏勺择。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一伦忠、第九天 我趴在偏房一處隱蔽的房頂上張望省核。 院中可真熱鬧,春花似錦昆码、人聲如沸芳撒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笔刹。三九已至,卻和暖如春冬耿,著一層夾襖步出監(jiān)牢的瞬間舌菜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工亦镶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留日月,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓缤骨,卻偏偏與公主長得像爱咬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绊起,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 一次培訓聽專家這樣定義教師:用昨天的知識教今天的學生精拟,培養(yǎng)明天需要的人才。初次聽到被震撼了虱歪,想想還真是這樣蜂绎。如果不...
    白露霜花閱讀 251評論 0 5
  • 深深庭院,門閉幽寂笋鄙,滿目枯秋蕭色师枣。正是斜陽無暖,沉沉暗寒結(jié)萧落。檐下燕践美,舊時客,似笑我找岖、孤影悄息陨倡。亂花過、隔墻余...
    姜妮_向華閱讀 209評論 0 0
  • 摩西奶奶說:“在我們漫長而又短暫的一生中,找到自己發(fā)自內(nèi)心喜愛去做的事情爹脾,堅持做下去帖旨。讓這一點點小小的堅持,帶給我...
    S1213閱讀 652評論 5 12
  • 前幾天急沖沖轉(zhuǎn)了一圈廣州货抄,對那座大城市的感覺和以前完全不同了述召,以前就算住著20平方的出租屋,每次在外地回到這大城市...
    law紅閱讀 271評論 4 2