(godot引擎筆記)反射、特性
????????嚴(yán)格來(lái)說(shuō)這不算是godot里的內(nèi)容,但是鑒于該內(nèi)容我還蠻喜歡的,索性就放進(jìn)來(lái)好了。
????????要理解反射with特性能做什么,首先要了解反射以及特性的概念。鑒于網(wǎng)上的文章對(duì)這一塊都不怎么講人話,這里就斗膽對(duì)這兩個(gè)東西進(jìn)行解讀。
一、反射:
????????微軟在C#的文檔是這么講解的:反射提供描述程序集、模塊和類型的對(duì)象(Type?類型)。?可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類型,然后調(diào)用其方法或訪問其(注:官方翻譯寫成“器”,是錯(cuò)別字)字段和屬性。?如果代碼中使用了特性,可以利用反射來(lái)訪問它們。
????????微軟在C#的反射里提供了一個(gè)小例子:
下面一個(gè)簡(jiǎn)單的反射示例,使用方法?GetType()(被?
Object
?基類的所有類型繼承)以獲取變量類型:
?備注????請(qǐng)確保在 .cs 文件頂部添加?
using System;
?和?using System.Reflection;
。
輸出為:
System.Int32
。
????????可以發(fā)現(xiàn),這里使用了反射中的System.GetType(),事實(shí)上,反射的命名空間中有System和System.Reflection兩個(gè),這里著重講System.Reflection。
二、特性
微軟在C#的文檔是這么講解的:使用特性,可以有效地將元數(shù)據(jù)或聲明性信息與代碼(程序集、類型、方法、屬性等)相關(guān)聯(lián)。?將特性與程序?qū)嶓w相關(guān)聯(lián)后,可以在運(yùn)行時(shí)使用?反射?這項(xiàng)技術(shù)查詢特性。
這么說(shuō)可能還不太懂,那就用下面這個(gè)代碼例子來(lái)說(shuō)明:
輸出為:
????????可以看到,利用反射篩選特性,可以輕松的做到獲取具體實(shí)例所需要的內(nèi)容,并忽略掉不需要的內(nèi)容,這在游戲數(shù)據(jù)開發(fā)的時(shí)候是很好用的,比如:
我們給一個(gè)裝備類設(shè)計(jì)了以下詞條:
????????如果我要設(shè)計(jì)一把物理武器,那在不使用反射的情況下,我可能要用一個(gè)子類代表只有物理攻擊力的武器,用一個(gè)子類代表只有魔法攻擊力的武器,用一個(gè)子類代表只有真實(shí)攻擊力的武器,用一個(gè)子類代表同時(shí)擁有物理攻擊力和魔法攻擊力的武器,用一個(gè)子類代表……
????????這還只是三個(gè)詞條,如果詞條復(fù)雜起來(lái),并且有刪改的需求的話,那么這就是一個(gè)繼承的地獄。
????????而用反射with特性,可以很好的解決這個(gè)問題,只需要搭好反射和特性的框架,后面的類怎么修改都不會(huì)影響前面框架的使用。
????????除此之外,反射with特性還能通過IO很好的和游戲數(shù)據(jù)表相結(jié)合,用得好的話改表能輕松很多。