玩家选择的部位、颜色等数据最终肯定是要进入存档的,并在游戏运行开始时,设置每个部位初始的显示类型,因此需要定义角色部位的数据,并做好相关的初始化。

/// <summary>
/// 自定义角色的全部数据
/// </summary>
[Serializable]
public class CustomCharacterData
{   
    //TODO:字典结构和Color都不支持Serializable
    public Dictionary<CharacterParType, CustomCharacterPartData> CustomPartDataDic;

}

/// <summary>
/// 自定义角色部位的数据
/// </summary>
[Serializable]
public class CustomCharacterPartData
{
    public int Index; //第几个部位
    public float Size;
    public float Height;
    public Color Color1;
    public Color Color2;
}

使用字典存储不同部位下的类型数据,实际存档时还需要对其进行序列化。

	//UI_CreateCharacterWindow 
    //自定义角色的数据
    private CustomCharacterData customCharacterData;

	        //初始化默认数据
        customCharacterData = new CustomCharacterData();
        customCharacterData.CustomPartDataDic = new Dictionary<CharacterParType, CustomCharacterPartData>();
        customCharacterData.CustomPartDataDic.Add(CharacterParType.Face, new CustomCharacterPartData()
        {
            Index = 1,
            Size = 1,
            Height = 0
        });
        customCharacterData.CustomPartDataDic.Add(CharacterParType.Hair, new CustomCharacterPartData()
        {
            Index = 1,
            Color1 = Color.white
        });
        customCharacterData.CustomPartDataDic.Add(CharacterParType.Cloth, new CustomCharacterPartData()
        {
            Index = 1,
            Color1 = Color.white,
            Color2 = Color.black
        });

UI窗口持有角色数据(充当中转),并在Init方法中初始化好相关数据。

        //应用默认的部位
        SetCharacterPart(CharacterParType.Face, customCharacterData.CustomPartDataDic[CharacterParType.Face].Index);
        SetCharacterPart(CharacterParType.Hair, customCharacterData.CustomPartDataDic[CharacterParType.Hair].Index);
        SetCharacterPart(CharacterParType.Cloth, customCharacterData.CustomPartDataDic[CharacterParType.Cloth].Index);

有了初始化好的数据,根据数据设置默认部位类型。

		public Dictionary<int, CustomCharacterPartData> CustomPartDataDic;

        SetCharacterPart(CharacterParType.Face, customCharacterData.CustomPartDataDic[(int)CharacterParType.Face].Index);
        SetCharacterPart(CharacterParType.Hair, customCharacterData.CustomPartDataDic[(int)CharacterParType.Hair].Index);
        SetCharacterPart(CharacterParType.Cloth, customCharacterData.CustomPartDataDic[(int)CharacterParType.Cloth].Index);

字典使用枚举做索引会存在Key hash时值类型装箱成引用类型引起性能消耗的问题,对字典的Key进行优化成int,在外部用字典的时候手动强转一下。

    private void Start()
    {
        player_View.Init();
    }

在CharacterCreator类(Controller)中调用Player_View的初始化方法完成View层的初始化。

        //应用默认的部位
        SetCharacterPart(CharacterParType.Face, customCharacterData.CustomPartDataDic[(int)CharacterParType.Face].Index,false,true);
        SetCharacterPart(CharacterParType.Hair, customCharacterData.CustomPartDataDic[(int)CharacterParType.Hair].Index,false,true);
        SetCharacterPart(CharacterParType.Cloth, customCharacterData.CustomPartDataDic[(int)CharacterParType.Cloth].Index,false,true);

为应用默认部位添加后两个参数,false代表不更新UI(调整尺寸、高度、颜色的窗口),true代表更新人物模型。

alt

游戏运行正确加载了默认配置,且材质是clone实例化出来的。