在UI窗口中获取每次获取配置都要从AA中获取一个资源,对应就要有一次释放,实际上配置可以直接从Player_View层获取(保存在配置字典中)。

    /// <summary>
    /// 拿到ProjectConfig中Index对应的某一类部位配置
    /// 这里会从AA中加载一个资源
    /// </summary>
    private CharacterPartConfigBase GetCurrentCharacterPartConfig(CharacterParType currPartType)
    {
        int currIndex = characterConfigIndexDic[(int)currPartType];
        int currID = projectConfig.CustomCharacterPartConfigIDDic[currPartType][currIndex];
        CharacterPartConfigBase partConfig = ConfigTool.GetCharacterPartConfig(currPartType, currID);
        return partConfig;
    }

为此在Player_View中提供一个获取当前配置的方法。

    /// <summary>
    /// 获取当前的角色配置
    /// </summary>
    public CharacterPartConfigBase GetCurrentPartConfig(CharacterParType characterParType)
    {
        if (characterPartDic.TryGetValue((int)characterParType,out CharacterPartConfigBase characterPartConfig))
        {
            return characterPartConfig;
        }

        return null;
    }

在UI窗口中通过Controller调用player_View中方法完成优化。


    /// <summary>
    /// 拿到ProjectConfig中Index对应的某一类部位配置
    /// 这里会从AA中加载一个资源
    /// </summary>
    private CharacterPartConfigBase GetCurrentCharacterPartConfig(CharacterParType currPartType)
    {
        return CharacterCreator.Instance.GetCurrentCharacterPartConfig(currPartType);
    }

    public CharacterPartConfigBase GetCurrentCharacterPartConfig(CharacterParType currPartType)
    {
        return player_View.GetCurrentPartConfig(currPartType);
    }

对Player_View中设置部位逻辑进行优化,即使不更新UI,也要完成资源的释放。

    /// <summary>
    /// 设置部位
    /// </summary>
    public void SetPart(CharacterPartConfigBase characterPartConfig, bool updateCharacterView = true)
    {

        if (characterPartDic.TryGetValue((int)characterPartConfig.CharacterParType,out CharacterPartConfigBase currentConfigBase))
        {
            ResManager.Release<CharacterPartConfigBase>(currentConfigBase);
            characterPartDic[(int)characterPartConfig.CharacterParType] = characterPartConfig;
        }
        else
        {   
            //这个部位之前是空的,不存在资源释放问题
            characterPartDic.Add((int)characterPartConfig.CharacterParType,characterPartConfig);
        }

        //不更新资源
        if (!updateCharacterView) return;
      	.....

原先设置颜色需要把具体的配置传给View层进行修改,因为现在View层已经持有配置,直接传部位类型自己找即可,进行优化,对应UI窗口中方法进行修改,此处略。

    /// <summary>
    /// 设置颜色1
    /// </summary>
    public void SetColor1(CharacterParType characterParType, Color color)
    {
        CharacterPartConfigBase characterPartConfig = GetCurrentPartConfig(characterParType);
        //根据不同的部位类型,确定具体要改主色时,材质球中对应修改哪个颜色
        switch (characterParType)
        {
            case CharacterParType.Hair:
                HairConfig hairConfig = characterPartConfig as HairConfig;
                if (hairConfig.ColorIndex >= 0)
                    partSkinnedMeshRenderers[1].sharedMaterial.SetColor("_Color0" + (hairConfig.ColorIndex + 1), color);
                break;
            case CharacterParType.Cloth:
 
                ClothConfig clothConfig = characterPartConfig as ClothConfig;
                if (clothConfig.ColorIndex >= 0)
                    partSkinnedMeshRenderers[2].sharedMaterial.SetColor("_Color0" + (clothConfig.ColorIndex + 1), color);
                break;

        }
    }

检查职业有效性,会用到AA获取配置,要进行资源释放。


        //检查职业有效性(先找部位,再找职业)
        //通过currIndex知道当前是ProjectConfig中某个部位的第几个可用配置,根据这个位置从ProjectConfig取出实际的配置ID
        CharacterPartConfigBase partConfig = ConfigTool.LoadCharacterPartConfig(currPartType, projectConfig.CustomCharacterPartConfigIDDic[currPartType][currIndex]);
        while(!partConfig.ProfessionTypes.Contains(professionType))
        {   

            if (isLeft) currIndex -= 1;
            else currIndex += 1;

            //到达边界
            if (currIndex < 0) currIndex = projectConfig.CustomCharacterPartConfigIDDic[currPartType].Count - 1;
            else if (currIndex > projectConfig.CustomCharacterPartConfigIDDic[currPartType].Count - 1) currIndex = 0;

            //释放资源
            ResManager.Release<CharacterPartConfigBase>(partConfig);
            partConfig = ConfigTool.LoadCharacterPartConfig(currPartType, projectConfig.CustomCharacterPartConfigIDDic[currPartType][currIndex]);
        }
        //释放资源
        ResManager.Release<CharacterPartConfigBase>(partConfig);

最终效果。

alt