using Thousandto.Code.Logic; using Thousandto.Core.Asset; using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; namespace Thousandto.Code.Logic { /// /// Skin和Shader的关系类 /// public class FSkinShaderRelation { #region//常量信息 //属性的分割字符 public static char[] CN_PROPERTY_SPLIT_CHAR = new char[] { ';' }; //颜色的分割字符 public static char[] CN_COLOR_SPLIT_CHAR = new char[] { '_' }; //纹理类型的分割字符 public static char[] CN_TEXTURE_TYPE_SPLIT_CHAR = new char[] { ':' }; #endregion #region//私有变量 //存储状态与Shader效果的关系 //FSkinStatusCode private static Dictionary> _reldict1 = new Dictionary>(); //存储模型与Shader效果的关系--ModelConfig private static Dictionary> _relDict2 = new Dictionary>(); //存储效果与属性信息的关系--ModelConfig private static Dictionary _relDict3 = new Dictionary(); #endregion #region//静态构造函数 //构造函数 static FSkinShaderRelation() { #region //状态与Shader的关系 //正常状态 var list = new List(); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FSkinStatusCode.Normal, FSkinTypeCode.LocalPlayer, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_SHOW, FSkinStatusCode.Normal, FSkinTypeCode.LocalPlayer, FSkinPartCode.Wing)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_SHOW, FSkinStatusCode.Normal, FSkinTypeCode.Player, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_SHOW, FSkinStatusCode.Normal, FSkinTypeCode.Player, FSkinPartCode.Wing)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER, FSkinStatusCode.Normal, FSkinTypeCode.Monster, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_BOSS, FSkinStatusCode.Normal, FSkinTypeCode.BossMonster, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SPECIAL, FSkinStatusCode.Normal, FSkinTypeCode.SpecMonster, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER, FSkinStatusCode.Normal, FSkinTypeCode.NPC, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_PET, FSkinStatusCode.Normal, FSkinTypeCode.Pet, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_PET, FSkinStatusCode.Normal, FSkinTypeCode.LocalPet, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_WING, FSkinStatusCode.Normal, FSkinTypeCode.None, FSkinPartCode.Wing)); _reldict1[(int)FSkinStatusCode.Normal] = list; //被击状态 list = new List(); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_BEHIT, FSkinStatusCode.BeHit, FSkinTypeCode.None, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING, FSkinStatusCode.BeHit, FSkinTypeCode.LocalPlayer, FSkinPartCode.Wing)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITY_WING, FSkinStatusCode.BeHit, FSkinTypeCode.None, FSkinPartCode.Wing)); _reldict1[(int)FSkinStatusCode.BeHit] = list; //出生状态 list = new List(); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_GROWN, FSkinStatusCode.Grown, FSkinTypeCode.None, FSkinPartCode.Body)); _reldict1[(int)FSkinStatusCode.Grown] = list; //死亡状态 list = new List(); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_DEAD, FSkinStatusCode.Dead, FSkinTypeCode.None, FSkinPartCode.Body)); _reldict1[(int)FSkinStatusCode.Dead] = list; //霸体状态 list = new List(); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_SUPERARMOR, FSkinStatusCode.SuperArmor, FSkinTypeCode.None, FSkinPartCode.Body)); list.Add(new ShaderRelation1(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_SUPERARMOR_WING, FSkinStatusCode.SuperArmor, FSkinTypeCode.None, FSkinPartCode.Wing)); _reldict1[(int)FSkinStatusCode.SuperArmor] = list; #endregion #region//模型与Shader的关系 _relDict3[(int)FModelEffectCode.None] = null; //流光的Shader处理 var list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER, FModelEffectCode.Flow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING, FModelEffectCode.Flow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER, FModelEffectCode.Flow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER, FModelEffectCode.Flow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING, FModelEffectCode.Flow, FSkinTypeCode.None, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER, FModelEffectCode.Flow, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.Flow] = list1; //边缘光效果 list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_BOSS, FModelEffectCode.Rim, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.Rim] = list1; //透明效果 list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_GROWN, FModelEffectCode.Transparent, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.Transparent] = list1; //溶解效果 list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITYSTATE_DEAD, FModelEffectCode.Dissolving, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.Dissolving] = list1; //brdf效果 /* list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_SHOW_ENTITY_GENERALENTITY, FModelEffectCode.Brdf, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.Brdf] = list1; */ list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.LocalPlayer, ModelTypeCode.Monster)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.None, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.NPC, ModelTypeCode.None)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.Monster, ModelTypeCode.None)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.BossMonster, ModelTypeCode.None)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_SHOW, FModelEffectCode.Brdf, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.Brdf] = list1; //使用Cube采样来实现Glaze琉璃的效果 list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_CUBE, FModelEffectCode.Cube, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.Cube] = list1; //颜色流光的Shader处理 list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_FLUX, FModelEffectCode.Flux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_FLUX, FModelEffectCode.Flux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_FLUX, FModelEffectCode.Flux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_FLUX, FModelEffectCode.Flux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_FLUX, FModelEffectCode.Flux, FSkinTypeCode.None, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_FLUX, FModelEffectCode.Flux, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.Flux] = list1; //流光的Shader处理 list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.None, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.NPC, ModelTypeCode.None)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.Monster, ModelTypeCode.None)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.BossMonster, ModelTypeCode.None)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_SHOW_FLOW, FModelEffectCode.BrdfFlow, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.BrdfFlow] = list1; //流光的Shader处理 list1 = new List(); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Player)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALWING_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Mount)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_LOCALPLAYER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.LocalPlayer, ModelTypeCode.Weapon)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_WING_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.None, ModelTypeCode.Wing)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.NPC, ModelTypeCode.None)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.Monster, ModelTypeCode.None)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_MONSTER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.BossMonster, ModelTypeCode.None)); list1.Add(new ShaderRelation2(ShaderNameDefine.CN_SN_ARES_ENTITY_PLAYER_SHOW_FLUX, FModelEffectCode.BrdfFlux, FSkinTypeCode.None, ModelTypeCode.None)); _relDict2[(int)FModelEffectCode.BrdfFlux] = list1; #endregion #region//效果对应的参数的 _relDict3[(int)FModelEffectCode.None] = null; _relDict3[(int)FModelEffectCode.Flow] = new ShaderEffectPropertyInfo(FModelEffectCode.Flow , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTEX) //纹理 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR) //颜色 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR2) //颜色 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSPEED) //速度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTILECOUNT) //折叠次数 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSTRENGTH) //流光强度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTYPE) //方向 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHSPEED) //闪烁速度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHCOLOR) //闪烁颜色 ); _relDict3[(int)FModelEffectCode.Rim] = new ShaderEffectPropertyInfo(FModelEffectCode.Rim , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_RIMPOWER) //边缘光的集中度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_RIMCOLOR) //边缘光颜色 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_INNERCOLORPOWER) //边缘光内部颜色的强度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_INNERCOLOR) //边缘光内部颜色 ); _relDict3[(int)FModelEffectCode.Dissolving] = new ShaderEffectPropertyInfo(FModelEffectCode.Dissolving , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_GRAYTIME) //灰色时间 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_DISSTIME) //溶解的时间 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_TIMELINE) //时间线,用于设置当前的状态 ); _relDict3[(int)FModelEffectCode.Transparent] = new ShaderEffectPropertyInfo(FModelEffectCode.Transparent , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_COLOR) //颜色 ); _relDict3[(int)FModelEffectCode.AlphaTest] = new ShaderEffectPropertyInfo(FModelEffectCode.AlphaTest , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_CUTOFF) //cut值 ); _relDict3[(int)FModelEffectCode.Brdf] = new ShaderEffectPropertyInfo(FModelEffectCode.Brdf); _relDict3[(int)FModelEffectCode.Cube] = new ShaderEffectPropertyInfo(FModelEffectCode.Cube , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_ENVCUBE) //环境Cube , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_ENVCUBEMIXER) //混合值 ); _relDict3[(int)FModelEffectCode.Flux] = new ShaderEffectPropertyInfo(FModelEffectCode.Flux , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTEX) //纹理 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR) //颜色1 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR2) //颜色2 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSPEED) //速度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTILECOUNT) //折叠次数 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSTRENGTH) //流光强度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHSPEED) //闪烁速度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHCOLOR) //闪烁颜色 ); _relDict3[(int)FModelEffectCode.BrdfFlow] = new ShaderEffectPropertyInfo(FModelEffectCode.BrdfFlow , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTEX) //纹理 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR) //颜色 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR2) //颜色 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSPEED) //速度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTILECOUNT) //折叠次数 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSTRENGTH) //流光强度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTYPE) //方向 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHSPEED) //闪烁速度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHCOLOR) //闪烁颜色 ); _relDict3[(int)FModelEffectCode.BrdfFlux] = new ShaderEffectPropertyInfo(FModelEffectCode.BrdfFlux , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTEX) //纹理 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR) //颜色1 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWCOLOR2) //颜色2 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSPEED) //速度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWTILECOUNT) //折叠次数 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLOWSTRENGTH) //流光强度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHSPEED) //闪烁速度 , Shader.PropertyToID(ShaderPropertyNameDefine.CN_SPN_FLASHCOLOR) //闪烁颜色 ); #endregion } #endregion #region//公共接口 //获取某个状态的Shader public static string GetStatusShader(FSkinTypeCode skinType, int part, FSkinStatusCode status) { List rlist = _reldict1[(int)status]; if (rlist != null) { int idx = -1; int noneIdx = -1; //先对Skin做比较 for (int i = 0; i < rlist.Count; i++) { if (rlist[i].SkinCode == skinType) { if (rlist[i].PartCode == part) { idx = i; break; } else if (rlist[i].PartCode == FSkinPartCode.Body) { noneIdx = i; } } } if (idx < 0 ) {//如果没有精确匹配,再选择SkinType==None的某个部位的Shader for (int i = 0; i < rlist.Count; i++) { if (rlist[i].SkinCode == FSkinTypeCode.None) { if (rlist[i].PartCode == part) { idx = i; break; } else if (noneIdx < 0 && rlist[i].PartCode == FSkinPartCode.Body) { noneIdx = i; } } } } //最后获取查找信息 idx = idx < 0 ? noneIdx : idx; if (idx < 0) { //Debug.LogError("没有从关系中找到Shader:" + skinType + ";;" + part + ";;" + status); return null; } return rlist[idx].ShaderName; } return null; } //获取某个模型的Shader public static string GetModelShader(FSkinTypeCode skinType, ModelTypeCode modelType, int modelEffect) { if (_relDict2.ContainsKey(modelEffect)) { List rlist = _relDict2[modelEffect]; if (rlist != null) { int idx = -1; int noneIdx = -1; //先对Skin做比较 for (int i = 0; i < rlist.Count; i++) { if (rlist[i].SkinCode == skinType) { if (rlist[i].ModelType == modelType) { idx = i; break; } else if (rlist[i].ModelType == ModelTypeCode.None) { noneIdx = i; } } } if (idx < 0) {//如果没有精确匹配,再选择SkinType==None的某个模型的Shader for (int i = 0; i < rlist.Count; i++) { if (rlist[i].SkinCode == FSkinTypeCode.None) { if (rlist[i].ModelType == modelType) { idx = i; break; } else if (noneIdx < 0 && rlist[i].ModelType == ModelTypeCode.None) { noneIdx = i; } } } } //最后获取查找信息 idx = idx < 0 ? noneIdx : idx; if (idx < 0) { Debug.LogError("没有从关系中找到Shader:"+ skinType+";;"+ modelType+";;"+ (FModelEffectCode)modelEffect); return null; } return rlist[idx].ShaderName; } } return null; } //获取效果参数 public static ShaderEffectPropertyInfo GetEffectPropertyInfo(int modelEffect) { if (_relDict3.ContainsKey(modelEffect)) { return _relDict3[modelEffect]; } return null; } //获取效果属性 public static Dictionary GetEffectProperties(int modelEffect, string cfgParams) { if (modelEffect < 0) return null; if (cfgParams == null) return null; if (_relDict3.ContainsKey(modelEffect)) { var rel = _relDict3[modelEffect]; if (rel != null) { var arr = cfgParams.Split(CN_PROPERTY_SPLIT_CHAR, StringSplitOptions.RemoveEmptyEntries); return rel.AnalyzeCfgParams(arr); } } return null; } //获取效果属性 public static Dictionary GetEffectProperties(FModelEffectCode modelEffect, string cfgParams) { return GetEffectProperties((int)modelEffect, cfgParams); } //获取效果的属性信息 public static Dictionary GetEffectProperties(int modelEffect, string[] cfgParams) { if (modelEffect < 0) return null; if (_relDict3.ContainsKey(modelEffect)) { var rel = _relDict3[modelEffect]; if (rel != null) { return rel.AnalyzeCfgParams(cfgParams); } } return null; } //获取效果的属性信息 public static Dictionary GetEffectProperties(FModelEffectCode modelEffect, string[] cfgParams) { return GetEffectProperties((int)modelEffect, cfgParams); } #endregion #region//静态公共函数 -- 用于解析字符串 /// /// 解析Color字符串,字符串格式:255_255_255_255 /// /// 255_255_255_255 /// 输出的Color /// public static bool TryParseColorText(string text, ref Color color) { var arr = text.Split(CN_COLOR_SPLIT_CHAR, StringSplitOptions.RemoveEmptyEntries); bool isValid = false; if (arr.Length >= 3) { int r = 255, g = 255, b = 255, a = 255; isValid = int.TryParse(arr[0], out r); isValid = isValid && int.TryParse(arr[1], out g); isValid = isValid && int.TryParse(arr[2], out b); if (arr.Length > 3 && isValid) { isValid = int.TryParse(arr[3], out a); } if (isValid) { color = new Color((float)r / 255f, (float)g / 255f, (float)b / 255f, (float)a / 255f); return true; } } return false; } /// /// 解析四向量的字符串 格式:1_2_3_4 /// /// /// /// public static bool TryParseVectorText(string text, ref Vector4 vector) { var arr = text.Split(CN_COLOR_SPLIT_CHAR, StringSplitOptions.RemoveEmptyEntries); bool isValid = false; if (arr.Length >= 4) { float v1 = 1, v2 = 1, v3 = 1, v4 = 1; isValid = float.TryParse(arr[0], out v1); isValid = isValid && float.TryParse(arr[1], out v2); isValid = isValid && float.TryParse(arr[2], out v3); isValid = isValid && float.TryParse(arr[3], out v4); if (isValid) { vector = new Vector4(v1, v2, v3, v4); } } return false; } /// /// 解析float的字符串 格式:1.2047 /// /// /// /// public static bool TryParseFloatText(string text, ref float f) { return float.TryParse(text, out f); } #endregion #region //内部子类 //Shader与Skin的关系1 //根据当前Skin状态,来获取各个部位的Shader信息 private class ShaderRelation1 { public FSkinTypeCode SkinCode { get; set; } public int PartCode { get; set; } public FSkinStatusCode EffectType { get; set; } public string ShaderName { get; set; } public ShaderRelation1(string name, FSkinStatusCode c1, FSkinTypeCode c2, int c3) { EffectType = c1; SkinCode = c2; PartCode = c3; ShaderName = name; } } //Shader与Skin的关系2 //这个关系所属与关系1的Normal状态,但是他的优先级更高 //根据设置效果,来获取当前Skin中某个模型的Shader private class ShaderRelation2 { public FSkinTypeCode SkinCode { get; set; } public ModelTypeCode ModelType { get; set; } public FModelEffectCode EffectType { get; set; } public String ShaderName { get; set; } public ShaderRelation2(string name, FModelEffectCode c1, FSkinTypeCode c2, ModelTypeCode c3) { EffectType = c1; SkinCode = c2; ModelType = c3; ShaderName = name; } } //Shader效果的信息 public class ShaderEffectPropertyInfo { public FModelEffectCode EffectType { get; set; } public int[] PropertyIDs { get; set; } public ShaderPropertyType[] PropertyTypes { get; set; } public ShaderEffectPropertyInfo(FModelEffectCode effect, params int[] propertyIDs) { EffectType = effect; if (propertyIDs == null) propertyIDs = new int[0]; PropertyIDs = propertyIDs; PropertyTypes = new ShaderPropertyType[propertyIDs.Length]; for (int i = 0; i < propertyIDs.Length; i++) { var pID = PropertyIDs[i]; PropertyTypes[i] = ShaderManager.SharedInstance.GetShaderPropertyType(pID); } } //分析配置参数 public Dictionary AnalyzeCfgParams(string[] cfgValues) { Dictionary result = new Dictionary(); for (int i = 0; i < cfgValues.Length && i < PropertyIDs.Length && i < PropertyTypes.Length; i++) { var val = cfgValues[i]; var pID = PropertyIDs[i]; if (!string.IsNullOrEmpty(val) && pID > 0) { val = val.Trim(); var pType = PropertyTypes[i]; switch (pType) { case ShaderPropertyType.Color: { Color c = Color.black; if (TryParseColorText(val, ref c)) { result[pID] = c; } else { Debug.LogError("颜色解析失败:" + pID + ";;" + val); } } break; case ShaderPropertyType.Vector: { Vector4 v = Vector4.zero; if (TryParseVectorText(val, ref v)) { result[pID] = v; } else { Debug.LogError("Vector解析失败:" + pID + ";;" + val); } } break; case ShaderPropertyType.TexEnv: { if (!string.IsNullOrEmpty(val)) //这里再判断一次,是因为之前做了一次Trim(); { //判断当前值是否全路径 if (val.StartsWith("Texture/")) { result[pID] = val; } else { result[pID] = AssetUtils.GetImageAssetPath(ImageTypeCode.Shader, val); } } else { Debug.LogError("纹理名字为空." + pID + ";;" + val); } } break; case ShaderPropertyType.Float: case ShaderPropertyType.Range: { float f = 0; if (TryParseFloatText(val, ref f)) { result[pID] = f; } else { Debug.LogError("float解析失败:" + pID + ";;" + val); } } break; default: break; } } } return result; } } #endregion } }