作者:邱子鉴
创建时间:2016.12.1
最后更新:2016.12.1
需求说明
经过几次UI改版,目前仓库各个类型物件的UI表现基本一致,so,打算将不同类型物件使用同一个UI控件,好处是提高UI控件的复用率,避免频繁创建UI控件导致卡顿。如果通用一个控件,数据源的数据类型也必须要统一,此处需要服务器更改仓库里数据的数据类型,做好老玩家数据更新的处理。但是,目前我们客户端的数据读取方式(从DataBase里直接读取)造成改数据类型这件事异常困难----一旦修改数据类型,该类型变量的所有连线就会断掉,而各个界面都可能直接使用DataBase里的数据,导致我们需要各个界面去重新连线,极易造成遗漏的情况。
鉴于以上问题,提出以下优化意见:
- 使用复用UI控件。
- 增加数据加工类。以仓库为例,创建仓库数据加工类(StorageDataController_BP,继承于UDataControllerBase),实现仓库相关数据的Set、Get以及数据Dispatcher。
数据加工类存储在GameManager里,首次调用时创建。
UDataControllerBase* UMobileZGameInstance::GetDataController(TSubclassOf<UDataControllerBase> ControllerClass)
{
//DataControllerList存储各种DataController
for (auto It : DataControllerList)
{
if (It->IsA(ControllerClass))
{
return It;
}
}
int32 Id = DataControllerList.Add(CreateDataController<UDataControllerBase>(this->GetWorld(), ControllerClass));
return DataControllerList[Id];
}
template< class T >
T* CreateDataController(UWorld* World, UClass* DataControllerClass = T::StaticClass())
{
if (World == nullptr)
{
FMessageLog("PIE").Error(LOCTEXT("WorldNull", "Unable to create a DataController to a null world."));
return nullptr;
}
if (!DataControllerClass->IsChildOf(UDataControllerBase::StaticClass()))
{
FMessageLog("PIE").Error(LOCTEXT("NotDataControllerBase", "CreateDataController can only be used on UDataControllerBase children."));
return nullptr;
}
if (DataControllerClass->HasAnyClassFlags(CLASS_Abstract | CLASS_NewerVersionExists | CLASS_Deprecated))
{
FMessageLog("PIE").Error(LOCTEXT("NotValidClass", "Abstract, Deprecated or Replaced classes are not allowed to be used to construct a DataController."));
return nullptr;
}
// Assign the outer to the game instance if it exists, otherwise use the world
UObject* Outer = World->GetGameInstance() ? StaticCast<UObject*>(World->GetGameInstance()) : StaticCast<UObject*>(World);
UDataControllerBase* NewDataController = NewObject<UDataControllerBase>(Outer, DataControllerClass);
return Cast<T>(NewDataController);
}
-
提供一个自定义节点,方便调用DataController。TODO:实现细节
Paste_Image.png
使用方法
- 创建一个DataCotnroller类,继承于DataControllerBase。对DataBase里的数据做Set/Get处理。
统一存放在:/Game/Blueprints/UI/DataController/
命名方式:**DataController_BP
-
使用节点获得DataController实例,参数为DataControllerClass。
DataController
优化仓库数据结构可能会影响到的模块
- 邮件。发送物品
- 商城。购买物品
- 奖励。 签到奖励、赛事奖励。
- 背包。
请大家补充。。。