Character.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Assets.HeroEditor4D.Common.Scripts.Collections;
  5. using Assets.HeroEditor4D.Common.Scripts.Data;
  6. using Assets.HeroEditor4D.Common.Scripts.Enums;
  7. using UnityEngine;
  8. namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
  9. {
  10. /// <summary>
  11. /// Character presentation in editor. Contains sprites, renderers, animation and so on.
  12. /// </summary>
  13. public partial class Character : MonoBehaviour
  14. {
  15. public SpriteCollection SpriteCollection;
  16. [Header("Body")]
  17. public List<Sprite> Ears;
  18. public Sprite Hair;
  19. public Sprite HairCropped;
  20. public Sprite Beard;
  21. public List<Sprite> Body;
  22. public Sprite Head;
  23. [Header("Expressions")]
  24. public string Expression = "Default";
  25. public List<Expression> Expressions;
  26. [Header("Equipment")]
  27. public Sprite Helmet;
  28. public Sprite PrimaryWeapon;
  29. public Sprite SecondaryWeapon;
  30. public Sprite Cape;
  31. public Sprite Quiver;
  32. public Sprite Backpack;
  33. public List<Sprite> Shield;
  34. public List<Sprite> Armor;
  35. public List<Sprite> CompositeWeapon;
  36. [Header("Accessories")]
  37. public Sprite Makeup;
  38. public Sprite Mask;
  39. public List<Sprite> Earrings;
  40. [Header("Body renderers")]
  41. public List<SpriteRenderer> BodyRenderers;
  42. public SpriteRenderer HeadRenderer;
  43. public List<SpriteRenderer> EarsRenderers;
  44. public SpriteRenderer HairRenderer;
  45. public SpriteRenderer BeardRenderer;
  46. public SpriteRenderer EyebrowsRenderer;
  47. public SpriteRenderer EyesRenderer;
  48. public SpriteRenderer MouthRenderer;
  49. [Header("Equipment renderers")]
  50. public SpriteRenderer HelmetRenderer;
  51. public SpriteRenderer PrimaryWeaponRenderer;
  52. public SpriteRenderer SecondaryWeaponRenderer;
  53. public List<SpriteRenderer> ArmorRenderers;
  54. public List<SpriteRenderer> VestRenderers;
  55. public List<SpriteRenderer> BracersRenderers;
  56. public List<SpriteRenderer> LeggingsRenderers;
  57. //public SpriteRenderer CapeRenderer;
  58. public SpriteRenderer QuiverRenderer;
  59. public SpriteRenderer BackpackRenderer;
  60. public List<SpriteRenderer> ShieldRenderers;
  61. public List<SpriteRenderer> BowRenderers;
  62. public List<SpriteRenderer> CrossbowRenderers;
  63. [Header("Accessories renderers")]
  64. public SpriteRenderer MakeupRenderer;
  65. public SpriteRenderer MaskRenderer;
  66. public List<SpriteRenderer> EarringsRenderers;
  67. [Header("Materials")]
  68. public Material DefaultMaterial;
  69. public Material EyesPaintMaterial;
  70. public Material EquipmentPaintMaterial;
  71. [Header("Animation")]
  72. public WeaponType WeaponType;
  73. [Header("Meta")]
  74. public bool HideEars;
  75. public bool CropHair;
  76. [Header("Anchors")]
  77. public Transform AnchorBody;
  78. public Transform AnchorSword;
  79. public Transform AnchorBow;
  80. public Transform AnchorFireMuzzle;
  81. [Header("Service")]
  82. public LayerManager LayerManager;
  83. [Header("Custom")]
  84. public List<Sprite> Underwear;
  85. public Color UnderwearColor;
  86. public bool ShowHelmet = true;
  87. /// <summary>
  88. /// Initializes character renderers with selected sprites.
  89. /// </summary>
  90. public void Initialize()
  91. {
  92. try // Disable try/catch for debugging.
  93. {
  94. TryInitialize();
  95. }
  96. catch (Exception e)
  97. {
  98. Debug.LogWarningFormat("Unable to initialize character {0}: {1}", name, e.Message);
  99. }
  100. }
  101. /// <summary>
  102. /// Initializes character renderers with selected sprites.
  103. /// </summary>
  104. private void TryInitialize()
  105. {
  106. var expressionNames = Expressions.Select(i => i.Name).ToList();
  107. if (!expressionNames.Contains("Default") || !expressionNames.Contains("Angry") || !expressionNames.Contains("Dead"))
  108. {
  109. throw new Exception("Character must have at least 3 basic expressions: Default, Angry and Dead.");
  110. }
  111. if (ShowHelmet)
  112. {
  113. MapSprites(EarsRenderers, HideEars ? null : Ears);
  114. SetSprite(HairRenderer, Hair == null ? null : CropHair ? HairCropped : Hair);
  115. SetSprite(HelmetRenderer, Helmet);
  116. }
  117. else
  118. {
  119. MapSprites(EarsRenderers, Ears);
  120. SetSprite(HairRenderer, Hair);
  121. SetSprite(HelmetRenderer, null);
  122. }
  123. SetExpression(Expression);
  124. SetSprite(BeardRenderer, Beard);
  125. MapSprites(BodyRenderers, Body);
  126. SetSprite(HeadRenderer, Head);
  127. MapSprites(ArmorRenderers, Armor);
  128. //CapeRenderer.sprite = Cape;
  129. SetSprite(QuiverRenderer, Quiver);
  130. SetSprite(BackpackRenderer, Backpack);
  131. MapSprites(ShieldRenderers, Shield);
  132. SetSprite(MakeupRenderer, Makeup);
  133. SetSprite(MaskRenderer, Mask);
  134. MapSprites(EarringsRenderers, Earrings);
  135. SetSprite(PrimaryWeaponRenderer, null);
  136. SetSprite(SecondaryWeaponRenderer, null);
  137. BowRenderers.ForEach(i => SetSprite(i, null));
  138. CrossbowRenderers.ForEach(i => SetSprite(i, null));
  139. switch (WeaponType)
  140. {
  141. case WeaponType.Melee1H:
  142. case WeaponType.Melee2H:
  143. case WeaponType.Firearm1H:
  144. case WeaponType.Firearm2H:
  145. case WeaponType.Throwable:
  146. SetSprite(PrimaryWeaponRenderer, PrimaryWeapon);
  147. break;
  148. case WeaponType.Paired:
  149. SetSprite(PrimaryWeaponRenderer, PrimaryWeapon);
  150. SetSprite(SecondaryWeaponRenderer, SecondaryWeapon);
  151. break;
  152. case WeaponType.Bow:
  153. MapSprites(BowRenderers, CompositeWeapon);
  154. break;
  155. case WeaponType.Crossbow:
  156. MapSprites(CrossbowRenderers, CompositeWeapon);
  157. break;
  158. default:
  159. throw new NotImplementedException(WeaponType.ToString());
  160. }
  161. ApplyMaterials();
  162. }
  163. private static void SetSprite(SpriteRenderer spriteRenderer, Sprite sprite)
  164. {
  165. if (spriteRenderer == null) return;
  166. spriteRenderer.sprite = sprite;
  167. spriteRenderer.enabled = sprite != null;
  168. }
  169. private void MapSprites(List<SpriteRenderer> spriteRenderers, List<Sprite> sprites)
  170. {
  171. spriteRenderers.ForEach(i => MapSprite(i, sprites));
  172. }
  173. private void MapSprite(SpriteRenderer spriteRenderer, List<Sprite> sprites)
  174. {
  175. SetSprite(spriteRenderer, sprites == null ? null : spriteRenderer.GetComponent<SpriteMapping>().FindSprite(sprites));
  176. }
  177. private void ApplyMaterials()
  178. {
  179. var renderers = ArmorRenderers.ToList();
  180. renderers.Add(HairRenderer);
  181. renderers.Add(PrimaryWeaponRenderer);
  182. renderers.Add(SecondaryWeaponRenderer);
  183. renderers.ForEach(i => i.sharedMaterial = i.color == Color.white ? DefaultMaterial : EquipmentPaintMaterial);
  184. }
  185. public void CopyFrom(Character character)
  186. {
  187. if (character == null) throw new ArgumentNullException(nameof(character), "Can't copy from empty character!");
  188. Body = character.Body.ToList();
  189. Ears = character.Ears.ToList();
  190. Hair = character.Hair;
  191. Expression = character.Expression;
  192. Expressions = character.Expressions.ToList();
  193. Beard = character.Beard;
  194. Helmet = character.Helmet;
  195. Armor = character.Armor.ToList();
  196. PrimaryWeapon = character.PrimaryWeapon;
  197. SecondaryWeapon = character.SecondaryWeapon;
  198. Cape = character.Cape;
  199. Quiver = character.Quiver;
  200. Backpack = character.Backpack;
  201. Shield = character.Shield.ToList();
  202. CompositeWeapon = character.CompositeWeapon.ToList();
  203. Makeup = character.Makeup;
  204. Mask = character.Mask;
  205. Earrings = character.Earrings.ToList();
  206. foreach (var target in GetComponentsInChildren<SpriteRenderer>(true).Where(i => i.sprite != null))
  207. {
  208. foreach (var source in character.GetComponentsInChildren<SpriteRenderer>(true))
  209. {
  210. if (target.name == source.name && target.transform.parent.name == source.transform.parent.name)
  211. {
  212. target.color = source.color;
  213. break;
  214. }
  215. }
  216. }
  217. WeaponType = character.WeaponType;
  218. HideEars = character.HideEars;
  219. CropHair = character.CropHair;
  220. Initialize();
  221. SetExpression("Default");
  222. }
  223. }
  224. }