您的当前位置:首页正文

[笔记][UE4] 仓库优化方案

来源:图艺博知识网

作者:邱子鉴
创建时间:2016.12.1
最后更新:2016.12.1


需求说明

经过几次UI改版,目前仓库各个类型物件的UI表现基本一致,so,打算将不同类型物件使用同一个UI控件,好处是提高UI控件的复用率,避免频繁创建UI控件导致卡顿。如果通用一个控件,数据源的数据类型也必须要统一,此处需要服务器更改仓库里数据的数据类型,做好老玩家数据更新的处理。但是,目前我们客户端的数据读取方式(从DataBase里直接读取)造成改数据类型这件事异常困难----一旦修改数据类型,该类型变量的所有连线就会断掉,而各个界面都可能直接使用DataBase里的数据,导致我们需要各个界面去重新连线,极易造成遗漏的情况。
鉴于以上问题,提出以下优化意见:

  1. 使用复用UI控件。
  2. 增加数据加工类。以仓库为例,创建仓库数据加工类(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);
}
  1. 提供一个自定义节点,方便调用DataController。TODO:实现细节


    Paste_Image.png

使用方法

  1. 创建一个DataCotnroller类,继承于DataControllerBase。对DataBase里的数据做Set/Get处理。

统一存放在:/Game/Blueprints/UI/DataController/
命名方式:**DataController_BP

  1. 使用节点获得DataController实例,参数为DataControllerClass。


    DataController

优化仓库数据结构可能会影响到的模块

  1. 邮件。发送物品
  2. 商城。购买物品
  3. 奖励。 签到奖励、赛事奖励。
  4. 背包。
    请大家补充。。。
Top