CharacterSetup.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Assets.HeroEditor4D.Common.Scripts.Data;
  5. using Assets.HeroEditor4D.Common.Scripts.Enums;
  6. using UnityEngine;
  7. namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
  8. {
  9. public partial class Character
  10. {
  11. /// <summary>
  12. /// Set character's body parts.
  13. /// </summary>
  14. public void SetBody(ItemSprite item, BodyPart part, Color? color)
  15. {
  16. switch (part)
  17. {
  18. case BodyPart.Body:
  19. Body = item?.Sprites.ToList();
  20. BodyRenderers.ForEach(i => i.color = color ?? i.color);
  21. Head = HeadRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  22. HeadRenderer.color = color ?? HeadRenderer.color;
  23. break;
  24. case BodyPart.Head:
  25. Head = HeadRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  26. HeadRenderer.color = color ?? HeadRenderer.color;
  27. break;
  28. case BodyPart.Hair:
  29. Hair = HairRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  30. HairRenderer.color = color ?? HairRenderer.color;
  31. HideEars = item != null && item.Tags.Contains("HideEars");
  32. if (item != null && item.Tags.Contains("NoPaint")) { HairRenderer.color = Color.white; HairRenderer.material = new Material(Shader.Find("Sprites/Default")); }
  33. break;
  34. case BodyPart.Ears:
  35. Ears = item?.Sprites.ToList();
  36. EarsRenderers.ForEach(i => i.color = color ?? i.color);
  37. break;
  38. case BodyPart.Eyebrows:
  39. if (EyebrowsRenderer) Expressions[0].Eyebrows = EyebrowsRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  40. break;
  41. case BodyPart.Eyes:
  42. if (EyesRenderer)
  43. {
  44. Expressions[0].Eyes = EyesRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  45. Expressions.Where(i => i.Name != "Dead").ToList().ForEach(i => i.EyesColor = color ?? EyesRenderer.color);
  46. EyesRenderer.color = color ?? EyesRenderer.color;
  47. }
  48. break;
  49. case BodyPart.Mouth:
  50. if (MouthRenderer) Expressions[0].Mouth = MouthRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  51. break;
  52. case BodyPart.Beard:
  53. if (BeardRenderer)
  54. {
  55. Beard = BeardRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  56. BeardRenderer.color = color ?? BeardRenderer.color;
  57. }
  58. break;
  59. case BodyPart.Makeup:
  60. if (MakeupRenderer)
  61. {
  62. Makeup = MakeupRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  63. MakeupRenderer.color = color ?? MakeupRenderer.color;
  64. }
  65. break;
  66. default: throw new NotImplementedException($"Unsupported part: {part}.");
  67. }
  68. Initialize();
  69. }
  70. public void SetBody(ItemSprite item, BodyPart part)
  71. {
  72. SetBody(item, part, null);
  73. }
  74. /// <summary>
  75. /// Set character's expression.
  76. /// </summary>
  77. public void SetExpression(string expression)
  78. {
  79. if (Expressions.Count < 3) throw new Exception("Character must have at least 3 basic expressions: Default, Angry and Dead.");
  80. if (EyesRenderer == null) return;
  81. var e = Expressions.Single(i => i.Name == expression);
  82. Expression = expression;
  83. EyebrowsRenderer.sprite = e.Eyebrows;
  84. EyesRenderer.sprite = e.Eyes;
  85. EyesRenderer.color = e.EyesColor;
  86. MouthRenderer.sprite = e.Mouth;
  87. }
  88. /// <summary>
  89. /// Equip something from SpriteCollection.
  90. /// </summary>
  91. public void Equip(ItemSprite item, EquipmentPart part, Color? color)
  92. {
  93. switch (part)
  94. {
  95. case EquipmentPart.MeleeWeapon1H:
  96. CompositeWeapon = null;
  97. break;
  98. case EquipmentPart.MeleeWeapon2H:
  99. case EquipmentPart.SecondaryMelee1H:
  100. case EquipmentPart.Firearm1H:
  101. case EquipmentPart.Firearm2H:
  102. case EquipmentPart.SecondaryFirearm1H:
  103. CompositeWeapon = null;
  104. Shield = null;
  105. break;
  106. case EquipmentPart.Bow:
  107. case EquipmentPart.Crossbow:
  108. PrimaryWeapon = SecondaryWeapon = null;
  109. Shield = null;
  110. break;
  111. }
  112. Cape = Quiver = Backpack = null;
  113. switch (part)
  114. {
  115. case EquipmentPart.Helmet:
  116. HideEars = item != null && !item.Tags.Contains("ShowEars");
  117. CropHair = item != null && !item.Tags.Contains("FullHair");
  118. Helmet = HelmetRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  119. HelmetRenderer.color = color ?? HelmetRenderer.color;
  120. break;
  121. case EquipmentPart.Armor:
  122. Armor = item?.Sprites.ToList().ToList();
  123. ArmorRenderers.ForEach(i => i.color = color ?? i.color);
  124. break;
  125. case EquipmentPart.Vest:
  126. SetArmorParts(VestRenderers, item?.Sprites, color);
  127. break;
  128. case EquipmentPart.Bracers:
  129. SetArmorParts(BracersRenderers, item?.Sprites, color);
  130. break;
  131. case EquipmentPart.Leggings:
  132. SetArmorParts(LeggingsRenderers, item?.Sprites, color);
  133. break;
  134. case EquipmentPart.MeleeWeapon1H:
  135. PrimaryWeapon = item?.Sprite;
  136. PrimaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? PrimaryWeaponRenderer.color : Color.white);
  137. if (WeaponType != WeaponType.Paired) WeaponType = WeaponType.Melee1H;
  138. break;
  139. case EquipmentPart.MeleeWeapon2H:
  140. PrimaryWeapon = item?.Sprite;
  141. PrimaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? PrimaryWeaponRenderer.color : Color.white);
  142. WeaponType = WeaponType.Melee2H;
  143. break;
  144. case EquipmentPart.SecondaryMelee1H:
  145. SecondaryWeapon = item?.Sprite;
  146. SecondaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? SecondaryWeaponRenderer.color : Color.white);
  147. WeaponType = WeaponType.Paired;
  148. break;
  149. case EquipmentPart.Bow:
  150. CompositeWeapon = item?.Sprites.ToList();
  151. WeaponType = WeaponType.Bow;
  152. break;
  153. case EquipmentPart.Crossbow:
  154. CompositeWeapon = item?.Sprites.ToList();
  155. WeaponType = WeaponType.Crossbow;
  156. break;
  157. case EquipmentPart.Firearm1H:
  158. PrimaryWeapon = item?.Sprites.Single(i => i.name == "Side");
  159. WeaponType = WeaponType.Firearm1H;
  160. break;
  161. case EquipmentPart.Firearm2H:
  162. PrimaryWeapon = item?.Sprites.Single(i => i.name == "Side");
  163. WeaponType = WeaponType.Firearm2H;
  164. break;
  165. case EquipmentPart.SecondaryFirearm1H:
  166. SecondaryWeapon = item?.Sprites.Single(i => i.name == "Side");
  167. WeaponType = WeaponType.Paired;
  168. break;
  169. case EquipmentPart.Shield:
  170. Shield = item?.Sprites.ToList();
  171. WeaponType = WeaponType.Melee1H;
  172. break;
  173. //case EquipmentPart.Cape:
  174. // Cape = item?.Sprite;
  175. // CapeRenderer.color = color ?? CapeRenderer.color;
  176. // break;
  177. case EquipmentPart.Quiver:
  178. Quiver = item?.Sprite;
  179. QuiverRenderer.color = color ?? QuiverRenderer.color;
  180. break;
  181. case EquipmentPart.Backpack:
  182. Backpack = item?.Sprite;
  183. BackpackRenderer.color = color ?? BackpackRenderer.color;
  184. break;
  185. case EquipmentPart.Earrings:
  186. Earrings = item?.Sprites.ToList();
  187. EarringsRenderers[0].color = EarringsRenderers[1].color = color ?? EarringsRenderers[0].color;
  188. break;
  189. case EquipmentPart.Mask:
  190. Mask = MaskRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
  191. MaskRenderer.color = color ?? MaskRenderer.color;
  192. break;
  193. default: throw new NotImplementedException($"Unsupported part: {part}.");
  194. }
  195. Initialize();
  196. if (part == EquipmentPart.Firearm1H || part == EquipmentPart.Firearm2H)
  197. {
  198. SetFirearmMuzzle(item);
  199. }
  200. }
  201. public void Equip(ItemSprite item, EquipmentPart part)
  202. {
  203. Equip(item, part, null);
  204. }
  205. /// <summary>
  206. /// Remove equipment partially.
  207. /// </summary>
  208. public void UnEquip(EquipmentPart part)
  209. {
  210. Equip(null, part);
  211. }
  212. /// <summary>
  213. /// Remove all equipment.
  214. /// </summary>
  215. public void ResetEquipment()
  216. {
  217. Armor = new List<Sprite>();
  218. CompositeWeapon = new List<Sprite>();
  219. Shield = new List<Sprite>();
  220. Helmet = PrimaryWeapon = SecondaryWeapon = Mask = Cape = Quiver = Backpack = null;
  221. Earrings = new List<Sprite>();
  222. HideEars = CropHair = false;
  223. Initialize();
  224. }
  225. private void SetArmorParts(List<SpriteRenderer> renderers, List<Sprite> armor, Color? color)
  226. {
  227. if (Armor == null)
  228. {
  229. Armor = new List<Sprite>();
  230. }
  231. else
  232. {
  233. Armor.RemoveAll(i => i == null);
  234. }
  235. foreach (var r in renderers)
  236. {
  237. var mapping = r.GetComponent<SpriteMapping>();
  238. var sprite = armor?.SingleOrDefault(j => mapping.SpriteName == j.name || mapping.SpriteNameFallback.Contains(j.name));
  239. Armor.RemoveAll(i => i.name == mapping.SpriteName || mapping.SpriteNameFallback.Contains(i.name));
  240. if (sprite != null)
  241. {
  242. Armor.Add(sprite);
  243. }
  244. if (color != null) r.color = color.Value;
  245. }
  246. }
  247. private void SetFirearmMuzzle(ItemSprite item)
  248. {
  249. if (item == null || PrimaryWeaponRenderer.sprite == null)
  250. {
  251. AnchorFireMuzzle.localPosition = Vector3.zero;
  252. return;
  253. }
  254. var mx = 0.5f;
  255. var my = int.Parse(item.MetaDict["Muzzle"]) / 100f;
  256. var bounds = PrimaryWeaponRenderer.sprite.bounds;
  257. var p = new Vector2(bounds.min.x + mx * (bounds.max.x - bounds.min.x), bounds.min.y + my * (bounds.max.y - bounds.min.y));
  258. if (PrimaryWeaponRenderer.flipX) p.x *= -1;
  259. AnchorFireMuzzle.localPosition = p;
  260. }
  261. }
  262. }