最近發現GAS的Attribute初始化時那張CurveTable,在打包版本時會把多餘的資料移除,造成FAttributeSetInitterDiscreteLevels在進行初始化時會失敗,猜測這個行為是在4.23以後(2020年3月的commit)的修改。
由於CurveTable本身設計是被用來當成連續型資料使用,因此進行重覆點的移除是可以理解的,因為可以減少個存的資料量進而增進效能,只要我們可以在2點之間利用內插法取得數值就行。
但是用在GAS的Attribute初始化上就出問題了,因為在GAS中他並不被當成連續型資料使用;而是轉成離散型資料,並以CurveTable上面的點進行屬性的分群。
移除重覆點,代表我們會遺失某個等級的資訊,例如當我們某個GAS Attribute在不同的等級上的數值都沒有變化,例如1~3級的移動速度都是200,他就只會保留等級1跟等級3,中間的等級2被當成重覆資料移除掉了。
當我們對等級2的角色進行屬性初始化時,就會因為找不到該等級資料而失敗。 這個議題比較噁心的點在於,它只會在打包版本發生,因為在editor中並沒有進行移除重覆資料的動作。 這個問題解決方法有幾種:
- 使用ConsoleVariable把CurveTable.RemoveRedundantKeys這個預設行為關閉,但會影響所有的CurveTable,造成這項優化失效。
int32 CVar_CurveTable_RemoveRedundantKeys = 1; static FAutoConsoleVariableRef CVarCurveTableRemoveRedundantKeys(TEXT("CurveTable.RemoveRedundantKeys"), CVar_CurveTable_RemoveRedundantKeys, TEXT(""), ECVF_Default);
- 重新設計AttributeSetInitter,不要離散化,而是直接用CurveTable