玩家选择的部位、颜色等数据最终肯定是要进入存档的,并在游戏运行开始时,设置每个部位初始的显示类型,因此需要定义角色部位的数据,并做好相关的初始化。
/// <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代表更新人物模型。
游戏运行正确加载了默认配置,且材质是clone实例化出来的。