在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);
最终效果。