CharacterBoneControl.cs 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. #if UNITY_EDITOR
  5. using UnityEditor;
  6. #endif
  7. /// <summary>
  8. /// This script is to apply the appearance data and facial expressions to the character.
  9. /// </summary>
  10. namespace SoftKitty.MasterCharacterCreator
  11. {
  12. public class CharacterBoneControl : MonoBehaviour
  13. {
  14. [Header("Don't change this on the prefabs from package.")]
  15. public int DefaultSex = 0;
  16. [Header("AutoInittialize will inittialize this character with default appearance on start.")]
  17. public bool AutoInittialize = false;
  18. [Header("Ignore height setting and make all characters same height.")]
  19. public bool ForceHeightEven = false;
  20. [Header("Make the appearance sliders have wider range.")]
  21. public float SliderMutiplier = 0F;
  22. [Header("Make the character randomly blink.")]
  23. public bool AutoBlink = true;
  24. [Range(0F,100F)]
  25. public float EyeOpen = 100F;
  26. [Header("Disable this if you want other system to manage blend shapes, such as LipSync system.")]
  27. public bool ManageBlendShapes = true;
  28. #region ComponentsReference
  29. [Header("Components Reference")]
  30. public SkinnedMeshRenderer EyesRenderer;
  31. public SkinnedMeshRenderer EyeShadowsRenderer;
  32. public SkinnedMeshRenderer HeadRenderer;
  33. public SkinnedMeshRenderer TeethRenderer;
  34. public SkinnedMeshRenderer BodyRenderer;
  35. public SkinnedMeshRenderer PantsRenderer;
  36. public SkinnedMeshRenderer FeetRenderer;
  37. public SkinnedMeshRenderer HandsRenderer;
  38. public SkinnedMeshRenderer HelmetRenderer;
  39. public SkinnedMeshRenderer EyelashRenderer;
  40. public Transform [] Bones;
  41. #endregion
  42. #region variables
  43. [HideInInspector]
  44. public CharacterAppearance MyData;
  45. public Dictionary<string, Transform> BoneDictionary = new Dictionary<string, Transform>();
  46. [HideInInspector]
  47. public Animation BackAnimation;
  48. [HideInInspector]
  49. public Animation TailAnimation;
  50. [HideInInspector]
  51. public Animation HeadAccAnimation;
  52. [HideInInspector]
  53. public float mHeight = 1F;
  54. [HideInInspector]
  55. public Transform LookAtTarget;
  56. [HideInInspector]
  57. public string EditorPath = "";
  58. public Color RimColor
  59. {
  60. get => _rimColor;
  61. set
  62. {
  63. if (!Application.isPlaying) return;
  64. _rimColor = value;
  65. foreach (var obj in RendererMapping.Values)
  66. {
  67. if (obj != null) obj.material.SetColor("_OutlineRimColor", _rimColor);
  68. }
  69. }
  70. }
  71. private Color _rimColor;
  72. public Dictionary<string, GameObject> AccessoryObjs = new Dictionary<string, GameObject>();
  73. public Dictionary<string, int> AccessoryIDs = new Dictionary<string, int>();
  74. private Dictionary<string, Renderer> MyRenderer = new Dictionary<string, Renderer>();
  75. private Dictionary<OutfitSlots, Renderer> RendererMapping = new Dictionary<OutfitSlots, Renderer>();
  76. public bool Inited = false;
  77. public bool isInited
  78. {
  79. get
  80. {
  81. return Inited;
  82. }
  83. }
  84. private bool ShowHair = true;
  85. private bool ShowFace = true;
  86. private float BlinkValue = 0F;
  87. private int[] OldOutfitID;
  88. private int PhotoMode = 0;
  89. private float BlinkTimer =5F;
  90. private Uint8Color[] OldCusColor1;
  91. private Uint8Color[] OldCusColor2;
  92. private Uint8Color[] OldCusColor3;
  93. private Coroutine BlinkCo;
  94. private int OutfitSlotsCount;
  95. private KeyValuePair<string, float> ActiveEmotion = new KeyValuePair<string, float>();
  96. #endregion
  97. #region internal methods
  98. private void Awake()
  99. {
  100. InternalInit();
  101. }
  102. public void InternalInit()
  103. {
  104. MyRenderer.Clear();
  105. ActiveEmotion = new KeyValuePair<string, float>("null", 0F);
  106. RendererMapping.Clear();
  107. RendererMapping.Add(OutfitSlots.Armor, BodyRenderer);
  108. RendererMapping.Add(OutfitSlots.Helmet, HelmetRenderer);
  109. RendererMapping.Add(OutfitSlots.Gauntlet, HandsRenderer);
  110. RendererMapping.Add(OutfitSlots.Boot, FeetRenderer);
  111. RendererMapping.Add(OutfitSlots.Pants, PantsRenderer);
  112. BoneDictionary.Clear();
  113. foreach (Transform trans in Bones)
  114. {
  115. if (trans.tag == "Bone")
  116. {
  117. BoneDictionary.Add(trans.name, trans);
  118. }
  119. }
  120. OutfitSlotsCount = System.Enum.GetValues(typeof(OutfitSlots)).Length;
  121. OldOutfitID = new int[OutfitSlotsCount];
  122. for (int i = 0; i < OutfitSlotsCount; i++)
  123. {
  124. OldOutfitID[i] = 0;
  125. }
  126. OldCusColor1 = new Uint8Color[OutfitSlotsCount];
  127. OldCusColor2 = new Uint8Color[OutfitSlotsCount];
  128. OldCusColor3 = new Uint8Color[OutfitSlotsCount];
  129. for (int i = 0; i < OutfitSlotsCount; i++)
  130. {
  131. OldCusColor1[i] = Uint8Color.Set(Color.white);
  132. OldCusColor2[i] = Uint8Color.Set(Color.white);
  133. OldCusColor3[i] = Uint8Color.Set(Color.white);
  134. }
  135. }
  136. private void UpdateRace()
  137. {
  138. if (CharacterDataSetting.instance == null) return;
  139. if (Application.isEditor && !Application.isPlaying)
  140. {
  141. HeadRenderer.sharedMaterials[0].SetTexture("_MainTex",
  142. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleHeadColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleHeadColorTexture);
  143. HeadRenderer.sharedMaterials[0].SetTexture("_MaskMap3",
  144. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleHairTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleHairTexture);
  145. HeadRenderer.sharedMaterials[0].SetTexture("_BodyNormal",
  146. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleHeadNormalTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleHeadNormalTexture);
  147. BodyRenderer.sharedMaterials[0].SetTexture("_MainTex",
  148. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleBodyColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleBodyColorTexture);
  149. BodyRenderer.sharedMaterials[0].SetTexture("_BodyNormal",
  150. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleBodyNormalTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleBodyNormalTexture);
  151. PantsRenderer.sharedMaterials[0].SetTexture("_MainTex",
  152. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleBodyColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleBodyColorTexture);
  153. PantsRenderer.sharedMaterials[0].SetTexture("_BodyNormal",
  154. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleBodyNormalTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleBodyNormalTexture);
  155. HandsRenderer.sharedMaterials[0].SetTexture("_MainTex",
  156. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleHandColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleHandColorTexture);
  157. FeetRenderer.sharedMaterials[0].SetTexture("_MainTex",
  158. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleFeetColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleFeetColorTexture);
  159. }
  160. else
  161. {
  162. HeadRenderer.materials[0].SetTexture("_MainTex",
  163. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleHeadColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleHeadColorTexture);
  164. HeadRenderer.materials[0].SetTexture("_MaskMap3",
  165. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleHairTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleHairTexture);
  166. HeadRenderer.materials[0].SetTexture("_BodyNormal",
  167. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleHeadNormalTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleHeadNormalTexture);
  168. BodyRenderer.materials[0].SetTexture("_MainTex",
  169. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleBodyColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleBodyColorTexture);
  170. BodyRenderer.materials[0].SetTexture("_BodyNormal",
  171. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleBodyNormalTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleBodyNormalTexture);
  172. PantsRenderer.materials[0].SetTexture("_MainTex",
  173. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleBodyColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleBodyColorTexture);
  174. PantsRenderer.materials[0].SetTexture("_BodyNormal",
  175. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleBodyNormalTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleBodyNormalTexture);
  176. HandsRenderer.materials[0].SetTexture("_MainTex",
  177. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleHandColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleHandColorTexture);
  178. FeetRenderer.materials[0].SetTexture("_MainTex",
  179. MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].MaleFeetColorTexture : CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].FemaleFeetColorTexture);
  180. }
  181. for (int i = 0; i < CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].RaceMorph.Length; i++)
  182. {
  183. HeadRenderer.SetBlendShapeWeight(i + 13, CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].RaceMorph[i]);
  184. }
  185. for (int i = 0; i < CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].TeethMorph.Length; i++)
  186. {
  187. TeethRenderer.SetBlendShapeWeight(i + 1, CharacterDataSetting.instance.RaceSettings[MyData._CharacterData.Race].TeethMorph[i]);
  188. }
  189. }
  190. private void SetOutfitColor(OutfitSlots _slot)
  191. {
  192. OldCusColor1[(int)_slot] = MyData._CusColor1[(int)_slot];
  193. OldCusColor2[(int)_slot] = MyData._CusColor2[(int)_slot];
  194. OldCusColor3[(int)_slot] = MyData._CusColor3[(int)_slot];
  195. if ((int)_slot >= 5)
  196. {
  197. if (AccessoryObjs.ContainsKey(_slot.ToString()+ "Type"))
  198. {
  199. foreach (Renderer obj in AccessoryObjs[_slot.ToString() + "Type"].GetComponentsInChildren<Renderer>(true))
  200. {
  201. if (Application.isEditor && !Application.isPlaying )
  202. {
  203. if (obj.sharedMaterial != null)
  204. {
  205. obj.sharedMaterial.SetColor("_Color1", Uint8Color.Get(MyData._CusColor1[(int)_slot]));
  206. obj.sharedMaterial.SetColor("_Color2", Uint8Color.Get(MyData._CusColor2[(int)_slot]));
  207. obj.sharedMaterial.SetColor("_Color3", Uint8Color.Get(MyData._CusColor3[(int)_slot]));
  208. }
  209. }
  210. else
  211. {
  212. if (obj.material != null)
  213. {
  214. obj.material.SetColor("_Color1", Uint8Color.Get(MyData._CusColor1[(int)_slot]));
  215. obj.material.SetColor("_Color2", Uint8Color.Get(MyData._CusColor2[(int)_slot]));
  216. obj.material.SetColor("_Color3", Uint8Color.Get(MyData._CusColor3[(int)_slot]));
  217. }
  218. }
  219. }
  220. }
  221. }
  222. else
  223. {
  224. if (RendererMapping.ContainsKey(_slot) && RendererMapping[_slot] != null)
  225. {
  226. if (Application.isEditor && !Application.isPlaying)
  227. {
  228. if (RendererMapping[_slot].sharedMaterial != null)
  229. {
  230. RendererMapping[_slot].sharedMaterial.SetColor("_Color1", Uint8Color.Get(MyData._CusColor1[(int)_slot]));
  231. RendererMapping[_slot].sharedMaterial.SetColor("_Color2", Uint8Color.Get(MyData._CusColor2[(int)_slot]));
  232. RendererMapping[_slot].sharedMaterial.SetColor("_Color3", Uint8Color.Get(MyData._CusColor3[(int)_slot]));
  233. }
  234. }
  235. else
  236. {
  237. if (RendererMapping[_slot].material != null)
  238. {
  239. RendererMapping[_slot].material.SetColor("_Color1", Uint8Color.Get(MyData._CusColor1[(int)_slot]));
  240. RendererMapping[_slot].material.SetColor("_Color2", Uint8Color.Get(MyData._CusColor2[(int)_slot]));
  241. RendererMapping[_slot].material.SetColor("_Color3", Uint8Color.Get(MyData._CusColor3[(int)_slot]));
  242. }
  243. }
  244. }
  245. }
  246. }
  247. private OutfitInfo GetOutfitSetting(OutfitSlots _slot, int _id, int _sex)
  248. {
  249. switch (_slot)
  250. {
  251. case OutfitSlots.Gauntlet: return _sex == 0 ? CharacterDataSetting.instance.MaleGloveSetting[_id] : CharacterDataSetting.instance.FemaleGloveSetting[_id];
  252. case OutfitSlots.Boot: return _sex == 0 ? CharacterDataSetting.instance.MaleBootSetting[_id] : CharacterDataSetting.instance.FemaleBootSetting[_id];
  253. case OutfitSlots.Helmet: return _sex == 0 ? CharacterDataSetting.instance.MaleHelmetSetting[_id] : CharacterDataSetting.instance.FemaleHelmetSetting[_id];
  254. case OutfitSlots.Pants: return _sex == 0 ? CharacterDataSetting.instance.MalePantsSetting[_id] : CharacterDataSetting.instance.FemalePantsSetting[_id];
  255. default: return _sex == 0 ? CharacterDataSetting.instance.MaleArmorSetting[_id] : CharacterDataSetting.instance.FemaleArmorSetting[_id];
  256. }
  257. }
  258. private void Start()
  259. {
  260. if (AutoInittialize && !Inited) Initialize(new CharacterAppearance(CharacterData.Create((byte)DefaultSex)));
  261. }
  262. private void CheckHairVisibility()
  263. {
  264. if (AccessoryObjs.ContainsKey("HairType"))
  265. {
  266. AccessoryObjs["HairType"].SetActive(ShowHair);
  267. }
  268. if (AccessoryObjs.ContainsKey("BeardType"))
  269. {
  270. AccessoryObjs["BeardType"].SetActive(ShowHair);
  271. }
  272. }
  273. private void OnDestroy()
  274. {
  275. }
  276. private void LoadSkinnedMesh(SkinnedMeshRenderer _renderer, string _meshPath, string _matPath, string[] boneNames)
  277. {
  278. if (_meshPath.Length > 0 && _matPath.Length > 0)
  279. {
  280. _renderer.enabled = false;
  281. _renderer.sharedMesh = CharacterManager.LoadMesh(_meshPath);
  282. if (Application.isEditor && !Application.isPlaying)
  283. {
  284. if(CharacterManager.LoadMaterial(_matPath)!=null) _renderer.sharedMaterial = CharacterManager.LoadMaterial(_matPath);
  285. }
  286. else{
  287. _renderer.material = CharacterManager.LoadMaterial(_matPath);
  288. }
  289. Transform[] bones = new Transform[boneNames.Length];
  290. for (int i = 0; i < bones.Length; i++)
  291. {
  292. bones[i] = BoneDictionary[boneNames[i]];
  293. }
  294. _renderer.bones = bones;
  295. _renderer.enabled = true;
  296. Bounds _bound = _renderer.localBounds;
  297. _bound.center = Vector3.zero;
  298. _bound.extents = new Vector3(0.8F, 1.8F, 0.8F);
  299. _renderer.localBounds = _bound;
  300. }
  301. else
  302. {
  303. _renderer.enabled = false;
  304. }
  305. }
  306. private void Update()
  307. {
  308. if (!Inited) return;
  309. CheckEmotions();
  310. CheckOutfits();
  311. CheckPhotoMode();
  312. CheckLookAt();
  313. }
  314. private void CheckLookAt()
  315. {
  316. if (LookAtTarget != null)
  317. {
  318. Vector3 _dirL = (LookAtTarget.position - BoneDictionary["LookAtL"].position).normalized;
  319. if (Vector3.Angle(_dirL, BoneDictionary["Bip001 Head"].up) < (DefaultSex==0?20F:12F))
  320. {
  321. Quaternion _lookRotL = Quaternion.LookRotation( -_dirL, Vector3.up);
  322. if(DefaultSex==1) _lookRotL = Quaternion.LookRotation(_dirL, -Vector3.up);
  323. BoneDictionary["LookAtL"].rotation = Quaternion.RotateTowards(BoneDictionary["LookAtL"].rotation, _lookRotL, 300F * Time.deltaTime);
  324. }
  325. Vector3 _dirR = (LookAtTarget.position - BoneDictionary["LookAtR"].position).normalized;
  326. if (Vector3.Angle(_dirR, BoneDictionary["Bip001 Head"].up) < (DefaultSex == 0 ? 20F : 12F))
  327. {
  328. Quaternion _lookRotR = Quaternion.LookRotation(-_dirR, Vector3.up);
  329. if (DefaultSex == 1) _lookRotR = Quaternion.LookRotation(_dirR, Vector3.up);
  330. BoneDictionary["LookAtR"].rotation = Quaternion.RotateTowards(BoneDictionary["LookAtR"].rotation, _lookRotR, 300F * Time.deltaTime);
  331. }
  332. }
  333. else
  334. {
  335. BoneDictionary["LookAtL"].localRotation = Quaternion.RotateTowards(BoneDictionary["LookAtL"].localRotation, Quaternion.identity, Time.deltaTime * 900F);
  336. BoneDictionary["LookAtR"].localRotation = Quaternion.RotateTowards(BoneDictionary["LookAtR"].localRotation, Quaternion.identity, Time.deltaTime * 900F);
  337. }
  338. }
  339. private void CheckPhotoMode()
  340. {
  341. if (HeadRenderer == null || !Application.isPlaying) return;
  342. if (PhotoMode != CharacterManager.PhotoMode)
  343. {
  344. PhotoMode = CharacterManager.PhotoMode;
  345. if (PhotoMode == 0)
  346. {
  347. UpdateMaterialData();
  348. }
  349. else
  350. {
  351. HeadRenderer.materials[0].SetColor("_Color1", new Color(0F, 0F, 0F, 0F));
  352. HeadRenderer.materials[0].SetColor("_Color2", new Color(0F, 0F, 0F, 0F));
  353. HeadRenderer.materials[0].SetColor("_Color3", new Color(0F, 0F, 0F, 0F));
  354. HeadRenderer.materials[1].SetColor("_BaseColor", new Color(0F, 0F, 0F, 0F));
  355. }
  356. }
  357. }
  358. private void CheckOutfits()
  359. {
  360. for (int i = 0; i < OldOutfitID.Length; i++)
  361. {
  362. if (OldOutfitID[i] != MyData._OutfitID[i]) SwitchOutfit((OutfitSlots)i, MyData._OutfitID[i]);
  363. if (OldCusColor1[i] != MyData._CusColor1[i] || OldCusColor2[i] != MyData._CusColor2[i] || OldCusColor3[i] != MyData._CusColor3[i]) SetOutfitColor((OutfitSlots)i);
  364. }
  365. }
  366. private void CheckEmotions()
  367. {
  368. if (HeadRenderer != null)
  369. {
  370. if (HeadRenderer.enabled != ShowFace) HeadRenderer.enabled = ShowFace;
  371. if (TeethRenderer.enabled != ShowFace) TeethRenderer.enabled = ShowFace;
  372. if (EyesRenderer.enabled != ShowFace) EyesRenderer.enabled = ShowFace;
  373. if (EyeShadowsRenderer.enabled != ShowFace) EyeShadowsRenderer.enabled = ShowFace;
  374. if (ActiveEmotion.Key != "null")
  375. {
  376. ActiveEmotion = new KeyValuePair<string, float>(ActiveEmotion.Key, Mathf.MoveTowards(ActiveEmotion.Value, 0F, Time.deltaTime));
  377. if (ActiveEmotion.Value <= 0F) ActiveEmotion = new KeyValuePair<string, float>("null",0F);
  378. }
  379. for (int i = 1; i <= 21; i++)
  380. {
  381. if ((ManageBlendShapes || i < 6 || i > 12) && (i<13 || i>18))
  382. {
  383. HeadRenderer.SetBlendShapeWeight(i, Mathf.MoveTowards(HeadRenderer.GetBlendShapeWeight(i),
  384. CharacterManager.CharacterEmotions.ContainsKey(ActiveEmotion.Key) ? CharacterManager.CharacterEmotions[ActiveEmotion.Key].GetHeadMorph(i) : 0F, Time.deltaTime * 300F));
  385. }
  386. }
  387. TeethRenderer.SetBlendShapeWeight(0, Mathf.MoveTowards(TeethRenderer.GetBlendShapeWeight(0),
  388. CharacterManager.CharacterEmotions.ContainsKey(ActiveEmotion.Key) ? CharacterManager.CharacterEmotions[ActiveEmotion.Key].GetTeethOpen() : 0F, Time.deltaTime * 300F));
  389. float _eyeClose = Mathf.Clamp((CharacterManager.CharacterEmotions.ContainsKey(ActiveEmotion.Key) ? CharacterManager.CharacterEmotions[ActiveEmotion.Key].GetHeadMorph(0) : 0F)+ BlinkValue + (100F - EyeOpen), 0F, 100F);
  390. HeadRenderer.SetBlendShapeWeight(0, Mathf.MoveTowards(HeadRenderer.GetBlendShapeWeight(0), _eyeClose, Time.deltaTime * 200F));
  391. if (EyelashRenderer)
  392. {
  393. EyelashRenderer.SetBlendShapeWeight(0, HeadRenderer.GetBlendShapeWeight(0));
  394. EyelashRenderer.SetBlendShapeWeight(1, HeadRenderer.GetBlendShapeWeight(3));
  395. EyelashRenderer.SetBlendShapeWeight(2, HeadRenderer.GetBlendShapeWeight(21));
  396. }
  397. if (AutoBlink)
  398. {
  399. BlinkTimer = Mathf.MoveTowards(BlinkTimer, 0F, Time.deltaTime);
  400. if (BlinkTimer <= 0F)
  401. {
  402. BlinkTimer = Random.Range(5F, 10F);
  403. Blink();
  404. }
  405. }
  406. }
  407. }
  408. private void LateUpdate()
  409. {
  410. BoneTransform();
  411. }
  412. private void BoneTransform()
  413. {
  414. if (CharacterDataSetting.instance == null) return;
  415. foreach (CharacterBoneDeformSetting obj in MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.MaleBoneSettings : CharacterDataSetting.instance.FemaleBoneSettings)
  416. {
  417. if (BoneDictionary.ContainsKey(obj.BoneNmae))
  418. {
  419. ApplyBoneData(BoneDictionary[obj.BoneNmae], obj);
  420. }
  421. else
  422. {
  423. BoneDictionary.Add(obj.BoneNmae, FindAllChild(transform, obj.BoneNmae));
  424. ApplyBoneData(BoneDictionary[obj.BoneNmae], obj);
  425. }
  426. }
  427. mHeight = (ForceHeightEven ? 1F : ((MyData._CharacterData.Sex == 0 ? 0.7F : 0.8F) + MyData._CharacterData.DataFloat[81] * 0.004F));
  428. transform.localScale = Vector3.one * mHeight;
  429. }
  430. IEnumerator DoBlink()
  431. {
  432. while (BlinkValue < 100F)
  433. {
  434. BlinkValue += Time.deltaTime * 500F;
  435. }
  436. yield return new WaitForSeconds(0.3F);
  437. while (BlinkValue >0F)
  438. {
  439. BlinkValue = Mathf.MoveTowards(BlinkValue, 0F, Time.deltaTime * 200F);
  440. }
  441. }
  442. private void LoadAccessories()
  443. {
  444. foreach (AccessoryInfo setting in MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.MaleAccessorySettings : CharacterDataSetting.instance.FemaleAccessorySettings)
  445. {
  446. int _id = (int)setting.Slot>9? MyData._OutfitID[(int)setting.Slot-5] : MyData._CharacterData.DataInt[(int)setting.Slot];
  447. bool _load = false;
  448. if (AccessoryIDs.ContainsKey(setting.DisplayName))
  449. {
  450. if (AccessoryIDs[setting.DisplayName] != _id) _load = true;
  451. }
  452. else
  453. {
  454. _load = true;
  455. }
  456. if (_load)
  457. {
  458. if (AccessoryObjs.ContainsKey(setting.DisplayName))
  459. {
  460. if (AccessoryObjs[setting.DisplayName] != null)
  461. {
  462. if (AccessoryObjs[setting.DisplayName].name != setting.SkinnedRendererName)
  463. {
  464. DestroyImmediate(AccessoryObjs[setting.DisplayName]);
  465. }
  466. }
  467. AccessoryObjs.Remove(setting.DisplayName);
  468. }
  469. if (AccessoryIDs.ContainsKey(setting.DisplayName)) AccessoryIDs.Remove(setting.DisplayName);
  470. if (setting.SkinnedRendererName != "")
  471. {
  472. FindAllChild(transform, setting.SkinnedRendererName).GetComponent<SkinnedMeshRenderer>().enabled = false;
  473. }
  474. if (_id > 0 || !setting.ZeroForNull)
  475. {
  476. GameObject _newAccObj = Instantiate(CharacterManager.LoadObject(setting.PrefabPath + _id.ToString("00")), BoneDictionary[setting.RootBoneNames]);
  477. if (setting.Slot == CharacterDataSetting.CharacterTextureNames.Back)
  478. BackAnimation = _newAccObj.GetComponentInChildren<Animation>();
  479. else if (setting.Slot == CharacterDataSetting.CharacterTextureNames.Tail)
  480. TailAnimation = _newAccObj.GetComponentInChildren<Animation>();
  481. else if (setting.Slot == CharacterDataSetting.CharacterTextureNames.BeardID)
  482. HeadAccAnimation = _newAccObj.GetComponentInChildren<Animation>();
  483. #if UNITY_EDITOR
  484. foreach (var obj in _newAccObj.GetComponentsInChildren<Renderer>(true))
  485. {
  486. CreateEditorMaterialCopy(obj);
  487. }
  488. #endif
  489. _newAccObj.transform.localPosition = Vector3.zero;
  490. _newAccObj.transform.localEulerAngles = Vector3.zero;
  491. _newAccObj.transform.localScale = Vector3.one;
  492. if (_newAccObj.tag == "Skinned" && _newAccObj.GetComponentInChildren<SkinnedMeshRenderer>())
  493. {
  494. if (setting.SkinnedRendererName != "")
  495. {
  496. SkinnedMeshRenderer _proxyRenderer = FindAllChild(transform, setting.SkinnedRendererName).GetComponent<SkinnedMeshRenderer>();
  497. SkinnedMeshRenderer _accRenderer = _newAccObj.GetComponentInChildren<SkinnedMeshRenderer>();
  498. Transform[] _bones = new Transform[_accRenderer.bones.Length];
  499. for (int i = 0; i < _bones.Length; i++)
  500. {
  501. _bones[i] = BoneDictionary[_accRenderer.bones[i].name];
  502. }
  503. _proxyRenderer.sharedMesh = _accRenderer.sharedMesh;
  504. if (Application.isEditor && !Application.isPlaying)
  505. {
  506. _proxyRenderer.sharedMaterial = _accRenderer.sharedMaterial;
  507. }
  508. else
  509. {
  510. _proxyRenderer.material = _accRenderer.sharedMaterial;
  511. }
  512. _proxyRenderer.rootBone = BoneDictionary[_accRenderer.rootBone.name];
  513. _proxyRenderer.bones = _bones;
  514. _proxyRenderer.enabled = true;
  515. _proxyRenderer.ResetBounds();
  516. _newAccObj.transform.SetParent(_proxyRenderer.transform);
  517. _newAccObj.SetActive(false);
  518. _newAccObj = _proxyRenderer.gameObject;
  519. }
  520. else
  521. {
  522. SkinnedMeshRenderer _accRenderer = _newAccObj.GetComponentInChildren<SkinnedMeshRenderer>();
  523. Transform[] _bones = new Transform[_accRenderer.bones.Length];
  524. for (int i = 0; i < _bones.Length; i++)
  525. {
  526. if (BoneDictionary.ContainsKey(_accRenderer.bones[i].name)) {
  527. _bones[i] = BoneDictionary[_accRenderer.bones[i].name];
  528. }
  529. else {
  530. _bones[i] = _accRenderer.bones[i];
  531. if (BoneDictionary.ContainsKey(_accRenderer.bones[i].parent.name)) {
  532. Vector3 _localPos = _accRenderer.bones[i].localPosition;
  533. Quaternion _localRot= _accRenderer.bones[i].localRotation;
  534. Vector3 _localScale = _accRenderer.bones[i].localScale;
  535. _accRenderer.bones[i].SetParent(BoneDictionary[_accRenderer.bones[i].parent.name],false);
  536. _accRenderer.bones[i].localPosition= _localPos;
  537. _accRenderer.bones[i].localRotation= _localRot;
  538. _accRenderer.bones[i].localScale= _localScale;
  539. }
  540. }
  541. }
  542. _accRenderer.bones = _bones;
  543. if (BoneDictionary.ContainsKey(_accRenderer.rootBone.name)) _accRenderer.rootBone = BoneDictionary[_accRenderer.rootBone.name];
  544. _newAccObj.transform.SetParent(transform);
  545. _newAccObj.transform.localPosition = Vector3.zero;
  546. _newAccObj.transform.localEulerAngles = Vector3.zero;
  547. _newAccObj.transform.localScale = Vector3.one;
  548. }
  549. }
  550. AccessoryObjs.Add(setting.DisplayName, _newAccObj);
  551. AccessoryIDs.Add(setting.DisplayName, _id);
  552. }
  553. }
  554. if (AccessoryObjs.ContainsKey(setting.DisplayName))
  555. {
  556. foreach (Renderer obj in AccessoryObjs[setting.DisplayName].GetComponentsInChildren<Renderer>(true))
  557. {
  558. if ((int)setting.Slot > 9)
  559. {
  560. if (Application.isEditor && !Application.isPlaying)
  561. {
  562. obj.sharedMaterial.SetColor("_Color1", Uint8Color.Get(MyData._CusColor1[(int)setting.Slot - 5]));
  563. obj.sharedMaterial.SetColor("_Color2", Uint8Color.Get(MyData._CusColor2[(int)setting.Slot - 5]));
  564. obj.sharedMaterial.SetColor("_Color3", Uint8Color.Get(MyData._CusColor3[(int)setting.Slot - 5]));
  565. }
  566. else
  567. {
  568. obj.material.SetColor("_Color1", Uint8Color.Get(MyData._CusColor1[(int)setting.Slot - 5]));
  569. obj.material.SetColor("_Color2", Uint8Color.Get(MyData._CusColor2[(int)setting.Slot - 5]));
  570. obj.material.SetColor("_Color3", Uint8Color.Get(MyData._CusColor3[(int)setting.Slot - 5]));
  571. }
  572. }
  573. else
  574. {
  575. if (Application.isEditor && !Application.isPlaying)
  576. {
  577. obj.sharedMaterial.SetColor(setting.MatSlotName, Uint8Color.Get(MyData._CharacterData.DataColor[(int)setting.ColorType]));
  578. }
  579. else
  580. {
  581. obj.material.SetColor(setting.MatSlotName, Uint8Color.Get(MyData._CharacterData.DataColor[(int)setting.ColorType]));
  582. }
  583. }
  584. }
  585. }
  586. }
  587. CheckHairVisibility();
  588. }
  589. private void ApplyMaterialData(Renderer _renderer, CharacterMaterialSetting _data, int _id)
  590. {
  591. if (_renderer == null) return;
  592. Material _mat = (Application.isEditor && !Application.isPlaying) ? _renderer.sharedMaterials[_id] : _renderer.materials[_id];
  593. if (_data.ColorType != CharacterDataSetting.CharacterColorNames.None)
  594. {
  595. _mat.SetColor(_data.SlotName, Uint8Color.Get(MyData._CharacterData.DataColor[(int)_data.ColorType]));
  596. }
  597. if (_data.TextureType != CharacterDataSetting.CharacterTextureNames.None)
  598. {
  599. _mat.SetTexture(_data.SlotName, CharacterManager.LoadTexture(_data.TextureBaseName + ((int)MyData._CharacterData.DataInt[(int)_data.TextureType]).ToString("00")));
  600. }
  601. if (_data.FloatType != CharacterDataSetting.CharacterBoneSliderNames.None)
  602. {
  603. if (_data.TextureBaseName == "offsetx")
  604. {
  605. _mat.SetTextureOffset(_data.SlotName, new Vector2(GetBoneValue(_data.FloatType, 0F, _data.SliderMin, _data.SliderMax), _mat.GetTextureOffset(_data.SlotName).y));
  606. }
  607. else if (_data.TextureBaseName == "offsety")
  608. {
  609. _mat.SetTextureOffset(_data.SlotName, new Vector2(_mat.GetTextureOffset(_data.SlotName).x, GetBoneValue(_data.FloatType, 0F, _data.SliderMin, _data.SliderMax)));
  610. }
  611. else if (_data.TextureBaseName == "tilingx")
  612. {
  613. _mat.SetTextureScale(_data.SlotName, new Vector2(GetBoneValue(_data.FloatType, 1F, _data.SliderMin, _data.SliderMax), _mat.GetTextureScale(_data.SlotName).y));
  614. }
  615. else if (_data.TextureBaseName == "tilingy")
  616. {
  617. _mat.SetTextureScale(_data.SlotName, new Vector2(_mat.GetTextureScale(_data.SlotName).x, GetBoneValue(_data.FloatType, 1F, _data.SliderMin, _data.SliderMax)));
  618. }
  619. else
  620. {
  621. _mat.SetFloat(_data.SlotName, MyData._CharacterData.DataFloat[(int)_data.FloatType] * 0.01F);
  622. }
  623. }
  624. }
  625. private void ApplyBoneData(Transform _bone, CharacterBoneDeformSetting _data)
  626. {
  627. if (_data.SetPos && _data.PositionSliders.Length >= 3)
  628. {
  629. _bone.localPosition = new Vector3(GetBoneValue(_data.PositionSliders[0].SliderType, _data.OriPos.x, _data.PositionSliders[0].MinOffset, _data.PositionSliders[0].MaxOffset),
  630. GetBoneValue(_data.PositionSliders[1].SliderType, _data.OriPos.y, _data.PositionSliders[1].MinOffset, _data.PositionSliders[1].MaxOffset),
  631. GetBoneValue(_data.PositionSliders[2].SliderType, _data.OriPos.z, _data.PositionSliders[2].MinOffset, _data.PositionSliders[2].MaxOffset)
  632. );
  633. }
  634. if (_data.SetRot && _data.RotationSliders.Length >= 3)
  635. {
  636. _bone.localEulerAngles = new Vector3(GetBoneValue(_data.RotationSliders[0].SliderType, _data.OriRot.x, _data.RotationSliders[0].MinOffset, _data.RotationSliders[0].MaxOffset),
  637. GetBoneValue(_data.RotationSliders[1].SliderType, _data.OriRot.y, _data.RotationSliders[1].MinOffset, _data.RotationSliders[1].MaxOffset),
  638. GetBoneValue(_data.RotationSliders[2].SliderType, _data.OriRot.z, _data.RotationSliders[2].MinOffset, _data.RotationSliders[2].MaxOffset)
  639. );
  640. }
  641. if (_data.SetScale && _data.ScaleSliders.Length >= 3)
  642. {
  643. _bone.localScale = new Vector3(GetBoneValue(_data.ScaleSliders[0].SliderType, _data.OriScale.x, _data.ScaleSliders[0].MinOffset, _data.ScaleSliders[0].MaxOffset),
  644. GetBoneValue(_data.ScaleSliders[1].SliderType, _data.OriScale.y, _data.ScaleSliders[1].MinOffset, _data.ScaleSliders[1].MaxOffset),
  645. GetBoneValue(_data.ScaleSliders[2].SliderType, _data.OriScale.z, _data.ScaleSliders[2].MinOffset, _data.ScaleSliders[2].MaxOffset)
  646. );
  647. }
  648. }
  649. private float GetBoneValue(CharacterDataSetting.CharacterBoneSliderNames _type, float _oriValue, float _min, float _max)
  650. {
  651. float _value = MyData._CharacterData.DataFloat[(int)_type] * 0.01F;
  652. if (_type != CharacterDataSetting.CharacterBoneSliderNames.None)
  653. {
  654. if (_value > 0.5F)
  655. {
  656. return Mathf.Lerp(_oriValue, _max + _max * SliderMutiplier, (_value - 0.5F) * 2F);
  657. }
  658. else if (_value < 0.5F)
  659. {
  660. return Mathf.Lerp(_oriValue, _min - _min * SliderMutiplier, (0.5F - _value) * 2F);
  661. }
  662. else
  663. {
  664. return _oriValue;
  665. }
  666. }
  667. else
  668. {
  669. return _oriValue;
  670. }
  671. }
  672. private Transform FindAllChild(Transform _mother, string _name)
  673. {
  674. Transform result = null;
  675. Transform[] allMyChild = _mother.GetComponentsInChildren<Transform>(true);
  676. foreach (Transform obj in allMyChild)
  677. {
  678. if (obj.name == _name)
  679. {
  680. result = obj.transform;
  681. }
  682. }
  683. return result;
  684. }
  685. private void CheckIntersection()
  686. {
  687. if ( BodyRenderer.sharedMesh.blendShapeCount > 0)
  688. {
  689. BodyRenderer.SetBlendShapeWeight(0, GetOutfitSetting(OutfitSlots.Gauntlet, OldOutfitID[(int)OutfitSlots.Gauntlet], MyData._CharacterData.Sex).PossibleIntersect ? 100F : 0F);
  690. }
  691. if (PantsRenderer.sharedMesh.blendShapeCount > 0)
  692. {
  693. PantsRenderer.SetBlendShapeWeight(0, GetOutfitSetting(OutfitSlots.Boot, OldOutfitID[(int)OutfitSlots.Boot], MyData._CharacterData.Sex).PossibleIntersect ? 100F : 0F);
  694. }
  695. }
  696. public void UpdateBreastSize()
  697. {
  698. if (MyData._Sex == Sex.Female && BodyRenderer!=null && BodyRenderer.sharedMesh.blendShapeCount > 0 && GetOutfitSetting(OutfitSlots.Armor, OldOutfitID[(int)OutfitSlots.Armor], MyData._CharacterData.Sex).BreastMorphID>-1)
  699. {
  700. BodyRenderer.SetBlendShapeWeight(GetOutfitSetting(OutfitSlots.Armor, OldOutfitID[(int)OutfitSlots.Armor], MyData._CharacterData.Sex).BreastMorphID, MyData._CharacterData.DataFloat[87]);
  701. }
  702. }
  703. private void CheckOverride()
  704. {
  705. for (int i = 0; i < OutfitSlotsCount; i++)
  706. {
  707. OutfitInfo _info = GetOutfitSetting((OutfitSlots)i, OldOutfitID[i], MyData._CharacterData.Sex);
  708. if (_info.OverrideMask1)
  709. {
  710. if (RendererMapping[_info.OverrideSlot].material != null && GetOutfitSetting(_info.OverrideSlot, OldOutfitID[(int)_info.OverrideSlot], MyData._CharacterData.Sex).CanBeOverride)
  711. {
  712. if (Application.isEditor && !Application.isPlaying)
  713. {
  714. RendererMapping[_info.OverrideSlot].sharedMaterial.SetTexture("_MaskMap1", _info.OverrideMask1);
  715. RendererMapping[_info.OverrideSlot].sharedMaterial.SetColor("_Color1", Uint8Color.Get(OldCusColor1[i]));
  716. }
  717. else
  718. {
  719. RendererMapping[_info.OverrideSlot].material.SetTexture("_MaskMap1", _info.OverrideMask1);
  720. RendererMapping[_info.OverrideSlot].material.SetColor("_Color1", Uint8Color.Get(OldCusColor1[i]));
  721. }
  722. }
  723. }
  724. }
  725. }
  726. private void ClearOverride()
  727. {
  728. for (int i = 0; i < OutfitSlotsCount; i++)
  729. {
  730. OutfitInfo _info = GetOutfitSetting((OutfitSlots)i, OldOutfitID[i], MyData._CharacterData.Sex);
  731. if (_info.OverrideMask1)
  732. {
  733. if (RendererMapping[_info.OverrideSlot].material!=null && GetOutfitSetting(_info.OverrideSlot, OldOutfitID[(int)_info.OverrideSlot], MyData._CharacterData.Sex).CanBeOverride)
  734. {
  735. if (Application.isEditor && !Application.isPlaying)
  736. {
  737. RendererMapping[_info.OverrideSlot].sharedMaterial.SetTexture("_MaskMap1", null);
  738. RendererMapping[_info.OverrideSlot].sharedMaterial.SetColor("_Color1", new Color(0F, 0F, 0F));
  739. }
  740. else
  741. {
  742. RendererMapping[_info.OverrideSlot].material.SetTexture("_MaskMap1", null);
  743. RendererMapping[_info.OverrideSlot].material.SetColor("_Color1", new Color(0F, 0F, 0F));
  744. }
  745. }
  746. }
  747. }
  748. }
  749. #endregion
  750. /// <summary>
  751. /// Initialize this character with Appearance data.
  752. /// </summary>
  753. /// <param name="_data"></param>
  754. public void Initialize(CharacterAppearance _data)
  755. {
  756. MyData = _data;
  757. if (Application.isEditor && !Application.isPlaying)
  758. {
  759. #if UNITY_EDITOR
  760. AssetDatabase.Refresh();
  761. InternalInit();
  762. CheckOutfits();
  763. CreateEditorMaterialCopy(HeadRenderer);
  764. CreateEditorMaterialCopy(EyesRenderer);
  765. UpdateMaterialData();
  766. CheckOverride();
  767. CheckIntersection();
  768. UpdateBreastSize();
  769. BoneTransform();
  770. #endif
  771. }
  772. else
  773. {
  774. UpdateMaterialData();
  775. }
  776. Inited = true;
  777. }
  778. /// <summary>
  779. /// Switch the outfit with slot type and mesh id.
  780. /// </summary>
  781. /// <param name="slot"></param>
  782. /// <param name="_id"></param>
  783. public void SwitchOutfit(OutfitSlots slot, int _id)
  784. {
  785. if (OldOutfitID[(int)slot] == _id) return;
  786. ClearOverride();
  787. OldOutfitID[(int)slot] = _id;
  788. switch (slot) {
  789. case OutfitSlots.Armor:
  790. LoadSkinnedMesh(BodyRenderer,GetOutfitSetting(OutfitSlots.Armor,_id,MyData._CharacterData.Sex).MeshPath, GetOutfitSetting(OutfitSlots.Armor, _id, MyData._CharacterData.Sex).MaterialPath, GetOutfitSetting(OutfitSlots.Armor, _id, MyData._CharacterData.Sex).BoneNames);
  791. if (Application.isEditor && !Application.isPlaying) CreateEditorMaterialCopy(BodyRenderer);
  792. break;
  793. case OutfitSlots.Pants:
  794. LoadSkinnedMesh(PantsRenderer, GetOutfitSetting(OutfitSlots.Pants, _id, MyData._CharacterData.Sex).MeshPath, GetOutfitSetting(OutfitSlots.Pants, _id, MyData._CharacterData.Sex).MaterialPath, GetOutfitSetting(OutfitSlots.Pants, _id, MyData._CharacterData.Sex).BoneNames);
  795. if (Application.isEditor && !Application.isPlaying) CreateEditorMaterialCopy(PantsRenderer);
  796. break;
  797. case OutfitSlots.Boot:
  798. LoadSkinnedMesh(FeetRenderer, GetOutfitSetting(OutfitSlots.Boot, _id, MyData._CharacterData.Sex).MeshPath, GetOutfitSetting(OutfitSlots.Boot, _id, MyData._CharacterData.Sex).MaterialPath, GetOutfitSetting(OutfitSlots.Boot, _id, MyData._CharacterData.Sex).BoneNames);
  799. if (Application.isEditor && !Application.isPlaying) CreateEditorMaterialCopy(FeetRenderer);
  800. break;
  801. case OutfitSlots.Gauntlet:
  802. LoadSkinnedMesh(HandsRenderer, GetOutfitSetting(OutfitSlots.Gauntlet, _id, MyData._CharacterData.Sex).MeshPath, GetOutfitSetting(OutfitSlots.Gauntlet, _id, MyData._CharacterData.Sex).MaterialPath, GetOutfitSetting(OutfitSlots.Gauntlet, _id, MyData._CharacterData.Sex).BoneNames);
  803. if (Application.isEditor && !Application.isPlaying) CreateEditorMaterialCopy(HandsRenderer);
  804. break;
  805. case OutfitSlots.Helmet:
  806. LoadSkinnedMesh(HelmetRenderer, GetOutfitSetting(OutfitSlots.Helmet, _id, MyData._CharacterData.Sex).MeshPath, GetOutfitSetting(OutfitSlots.Helmet, _id, MyData._CharacterData.Sex).MaterialPath, GetOutfitSetting(OutfitSlots.Helmet, _id, MyData._CharacterData.Sex).BoneNames);
  807. if (Application.isEditor && !Application.isPlaying) CreateEditorMaterialCopy(HelmetRenderer);
  808. ShowHair = !GetOutfitSetting(OutfitSlots.Helmet, _id, MyData._CharacterData.Sex).HideHair;
  809. ShowFace = !GetOutfitSetting(OutfitSlots.Helmet, _id, MyData._CharacterData.Sex).HideFace;
  810. CheckHairVisibility();
  811. break;
  812. }
  813. SetOutfitColor(slot);
  814. if (!Application.isEditor || Application.isPlaying)
  815. {
  816. UpdateMaterialData();
  817. CheckOverride();
  818. CheckIntersection();
  819. UpdateBreastSize();
  820. }
  821. }
  822. /// <summary>
  823. /// Force the character to blink at once.
  824. /// </summary>
  825. public void Blink()
  826. {
  827. if (BlinkCo != null) StopCoroutine(BlinkCo);
  828. BlinkCo = StartCoroutine(DoBlink());
  829. }
  830. /// <summary>
  831. /// Set the emotion type and how long it lasts
  832. /// </summary>
  833. /// <param name="_uid"></param>
  834. /// <param name="_length"></param>
  835. public void SetEmotion(string _uid, float _length)
  836. {
  837. ActiveEmotion = new KeyValuePair<string, float>(_uid, _length);
  838. }
  839. /// <summary>
  840. /// Stop the current emotion and reset to the default emotion.
  841. /// </summary>
  842. public void StopEmotion()
  843. {
  844. ActiveEmotion = new KeyValuePair<string, float>("null", 0F);
  845. }
  846. /// <summary>
  847. /// Update the materials, call this if you have changed the appearance data.
  848. /// </summary>
  849. public void UpdateMaterialData()
  850. {
  851. if (CharacterDataSetting.instance == null) return;
  852. foreach (CharacterMaterialSetting obj in MyData._CharacterData.Sex == 0 ? CharacterDataSetting.instance.MaleMaterialSettings : CharacterDataSetting.instance.FemaleMaterialSettings)
  853. {
  854. foreach (string _rendererName in obj.RendererName) {
  855. string[] _names = new string[1];
  856. if (_rendererName.Contains("$"))
  857. {
  858. _names = _rendererName.Split('$');
  859. }
  860. else
  861. {
  862. _names[0] = _rendererName;
  863. }
  864. int _id = 0;
  865. if (_names.Length > 1) _id = int.Parse(_names[1]);
  866. if (MyRenderer.ContainsKey(_names[0]))
  867. {
  868. ApplyMaterialData(MyRenderer[_names[0]], obj, _id);
  869. }
  870. else
  871. {
  872. MyRenderer.Add(_names[0], FindAllChild(transform, _names[0]).GetComponent<Renderer>());
  873. ApplyMaterialData(MyRenderer[_names[0]], obj, _id);
  874. }
  875. }
  876. }
  877. LoadAccessories();
  878. UpdateRace();
  879. UpdateBreastSize();
  880. }
  881. /// <summary>
  882. /// Create a copy of the materials of the specified renderer.
  883. /// </summary>
  884. /// <param name="_renderer"></param>
  885. public void CreateEditorMaterialCopy(Renderer _renderer)
  886. {
  887. #if UNITY_EDITOR
  888. if (!Application.isPlaying && _renderer!=null && _renderer.sharedMaterials.Length>0)
  889. {
  890. Material[] _mats = new Material[_renderer.sharedMaterials.Length];
  891. if (!AssetDatabase.IsValidFolder(EditorPath + "/" + _renderer.name)) AssetDatabase.CreateFolder(EditorPath, _renderer.name);
  892. for (int i = 0; i < _renderer.sharedMaterials.Length; i++)
  893. {
  894. AssetDatabase.CopyAsset(AssetDatabase.GetAssetPath(_renderer.sharedMaterials[i]), EditorPath + "/" + _renderer.name + "/" + _renderer.sharedMaterials[i].name + ".mat");
  895. _mats[i] = (Material)AssetDatabase.LoadAssetAtPath(EditorPath + "/" + _renderer.name + "/" + _renderer.sharedMaterials[i].name + ".mat", typeof(Material));
  896. }
  897. _renderer.sharedMaterials = _mats;
  898. _renderer.sharedMaterial = _mats[0];
  899. }
  900. #endif
  901. }
  902. }
  903. }