Character4D.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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.Common;
  6. using Assets.HeroEditor4D.Common.Scripts.Data;
  7. using Assets.HeroEditor4D.Common.Scripts.Enums;
  8. using Assets.HeroEditor4D.InventorySystem.Scripts;
  9. using Assets.HeroEditor4D.InventorySystem.Scripts.Data;
  10. using Assets.HeroEditor4D.InventorySystem.Scripts.Enums;
  11. using UnityEngine;
  12. namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
  13. {
  14. /// <summary>
  15. /// Controls 4 characters (for each direction).
  16. /// </summary>
  17. public class Character4D : MonoBehaviour
  18. {
  19. [Header("Parts")]
  20. public Character Front;
  21. public Character Back;
  22. public Character Left;
  23. public Character Right;
  24. public Transform characterTransform (){
  25. if(Front.gameObject.activeSelf){
  26. return Front.transform;
  27. }else if (Back.gameObject.activeSelf){
  28. return Back.transform;
  29. }else if (Left.gameObject.activeSelf){
  30. return Left.transform;
  31. }else{
  32. return Right.transform;
  33. }
  34. }
  35. public List<Character> Parts;
  36. public List<GameObject> Shadows;
  37. [Header("Animation")]
  38. public Animator Animator;
  39. public AnimationManager AnimationManager;
  40. [Header("Other")]
  41. public LayerManager LayerManager;
  42. public Color BodyColor;
  43. public SpriteCollection SpriteCollection => Parts[0].SpriteCollection;
  44. private List<Character> PartsExceptBack => new List<Character> { Front, Left, Right };
  45. public List<Sprite> Body { set { Parts.ForEach(i => i.Body = value.ToList()); } }
  46. public List<Sprite> Head { set { Parts.ForEach(i => i.Head = i.HairRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
  47. public List<Sprite> Hair { set { Parts.ForEach(i => i.Hair = i.HairRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
  48. public List<Sprite> Beard { set { Parts.ForEach(i => { if (i.BeardRenderer) i.Beard = i.BeardRenderer.GetComponent<SpriteMapping>().FindSprite(value); }); } }
  49. public List<Sprite> Ears { set { Parts.ForEach(i => i.Ears = value.ToList()); } }
  50. public List<Sprite> Eyebrows { set { PartsExceptBack.ForEach(i => i.Expressions[0].Eyebrows = i.EyebrowsRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
  51. public List<Sprite> Eyes { set { PartsExceptBack.ForEach(i => i.Expressions[0].Eyes = i.EyesRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
  52. public List<Sprite> Mouth { set { PartsExceptBack.ForEach(i => i.Expressions[0].Mouth = i.MouthRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
  53. public List<Sprite> Helmet { set { Parts.ForEach(i => i.Helmet = i.HelmetRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
  54. public List<Sprite> Armor { set { Parts.ForEach(i => i.Armor = value.ToList()); } }
  55. public Sprite PrimaryWeapon { set { Parts.ForEach(i => i.PrimaryWeapon = value); } }
  56. public Sprite SecondaryWeapon { set { Parts.ForEach(i => i.SecondaryWeapon = value); } }
  57. public List<Sprite> Shield { set { Parts.ForEach(i => i.Shield = value.ToList()); } }
  58. public List<Sprite> CompositeWeapon { set { Parts.ForEach(i => i.CompositeWeapon = value.ToList()); } }
  59. public List<Sprite> Makeup { set { Parts.ForEach(i => { if (i.MakeupRenderer) i.Makeup = i.MakeupRenderer.GetComponent<SpriteMapping>().FindSprite(value); }); } }
  60. public List<Sprite> Mask { set { Parts.ForEach(i => { if (i.MaskRenderer) i.Mask = i.MaskRenderer.GetComponent<SpriteMapping>().FindSprite(value); }); } }
  61. public List<Sprite> Earrings { set { Parts.ForEach(i => i.Earrings = value.ToList()); } }
  62. public WeaponType WeaponType { get => Front.WeaponType; set { Parts.ForEach(i => i.WeaponType = value); } }
  63. public void OnValidate()
  64. {
  65. Parts = new List<Character> { Front, Back, Left, Right };
  66. Parts.ForEach(i => i.BodyRenderers.ForEach(j => j.color = BodyColor));
  67. Parts.ForEach(i => i.EarsRenderers.ForEach(j => j.color = BodyColor));
  68. }
  69. public void Start()
  70. {
  71. var stateHandler = Animator.GetBehaviours<StateHandler>().SingleOrDefault(i => i.Name == "Death");
  72. if (stateHandler != null)
  73. {
  74. stateHandler.StateExit.AddListener(() => SetExpression("Default"));
  75. }
  76. Animator.keepAnimatorStateOnDisable = true;
  77. //Animator.keepAnimatorControllerStateOnDisable = true;
  78. }
  79. public void Initialize()
  80. {
  81. Parts.ForEach(i => i.Initialize());
  82. }
  83. public void SetBody(ItemSprite item, BodyPart part)
  84. {
  85. Parts.ForEach(i => i.SetBody(item, part));
  86. }
  87. public void SetBody(ItemSprite item, BodyPart part, Color? color)
  88. {
  89. Parts.ForEach(i => i.SetBody(item, part, color));
  90. }
  91. public void SetExpression(string expression)
  92. {
  93. Parts.ForEach(i => i.SetExpression(expression));
  94. }
  95. public void Equip(ItemSprite item, EquipmentPart part)
  96. {
  97. Parts.ForEach(i => i.Equip(item, part));
  98. UpdateWeaponType(part);
  99. }
  100. public void Equip(ItemSprite item, EquipmentPart part, Color? color)
  101. {
  102. Parts.ForEach(i => i.Equip(item, part, color));
  103. UpdateWeaponType(part);
  104. }
  105. private void UpdateWeaponType(EquipmentPart part)
  106. {
  107. switch (part)
  108. {
  109. case EquipmentPart.MeleeWeapon1H: Animator.SetInteger("WeaponType", (int) WeaponType.Melee1H); break;
  110. case EquipmentPart.MeleeWeapon2H: Animator.SetInteger("WeaponType", (int) WeaponType.Melee2H); break;
  111. case EquipmentPart.Bow: Animator.SetInteger("WeaponType", (int) WeaponType.Bow); break;
  112. case EquipmentPart.Crossbow: Animator.SetInteger("WeaponType", (int) WeaponType.Crossbow); break;
  113. case EquipmentPart.Firearm1H: Animator.SetInteger("WeaponType", (int) WeaponType.Firearm1H); break;
  114. case EquipmentPart.Firearm2H: Animator.SetInteger("WeaponType", (int) WeaponType.Firearm2H); break;
  115. case EquipmentPart.SecondaryFirearm1H: Animator.SetInteger("WeaponType", (int) WeaponType.Paired); break;
  116. }
  117. }
  118. public void UnEquip(EquipmentPart part)
  119. {
  120. Parts.ForEach(i => i.UnEquip(part));
  121. }
  122. public void ResetEquipment()
  123. {
  124. Parts.ForEach(i => i.ResetEquipment());
  125. Animator.SetInteger("WeaponType", (int)WeaponType.Melee1H);
  126. }
  127. public Vector2 Direction { get; private set; }
  128. public Character Active { get; private set; }
  129. public void SetDirection(Vector2 direction)
  130. {
  131. if (Direction == direction) return;
  132. Direction = direction;
  133. if (Direction == Vector2.zero)
  134. {
  135. Parts.ForEach(i => i.SetActive(true));
  136. Shadows.ForEach(i => i.SetActive(true));
  137. Parts[0].transform.localPosition = Shadows[0].transform.localPosition = new Vector3(0, -1.25f);
  138. Parts[1].transform.localPosition = Shadows[1].transform.localPosition = new Vector3(0, 1.25f);
  139. Parts[2].transform.localPosition = Shadows[2].transform.localPosition = new Vector3(-1.5f, 0);
  140. Parts[3].transform.localPosition = Shadows[3].transform.localPosition = new Vector3(1.5f, 0);
  141. return;
  142. }
  143. Parts.ForEach(i => i.transform.localPosition = Vector3.zero);
  144. Shadows.ForEach(i => i.transform.localPosition = Vector3.zero);
  145. int index;
  146. if (direction == Vector2.left)
  147. {
  148. index = 2;
  149. }
  150. else if (direction == Vector2.right)
  151. {
  152. index = 3;
  153. }
  154. else if (direction == Vector2.up)
  155. {
  156. index = 1;
  157. }
  158. else if (direction == Vector2.down)
  159. {
  160. index = 0;
  161. }
  162. else
  163. {
  164. throw new NotSupportedException();
  165. }
  166. for (var i = 0; i < Parts.Count; i++)
  167. {
  168. Parts[i].SetActive(i == index);
  169. Shadows[i].SetActive(i == index);
  170. }
  171. Active = Parts[index];
  172. }
  173. public void CopyFrom(Character4D character)
  174. {
  175. for (var i = 0; i < Parts.Count; i++)
  176. {
  177. Parts[i].CopyFrom(character.Parts[i]);
  178. Parts[i].WeaponType = character.Parts[i].WeaponType;
  179. Parts[i].HideEars = character.Parts[i].HideEars;
  180. Parts[i].CropHair = character.Parts[i].CropHair;
  181. Parts[i].AnchorFireMuzzle.localPosition = character.Parts[i].AnchorFireMuzzle.localPosition;
  182. }
  183. Animator.SetInteger("WeaponType", (int) character.WeaponType);
  184. }
  185. public string ToJson()
  186. {
  187. return Front.ToJson();
  188. }
  189. public void FromJson(string json, bool silent)
  190. {
  191. Parts.ForEach(i => i.LoadFromJson(json, silent));
  192. Animator.SetInteger("WeaponType", (int) Parts[0].WeaponType);
  193. }
  194. #region Setup Examples
  195. public void Equip(Item item)
  196. {
  197. var itemParams = ItemCollection.Active.GetItemParams(item);
  198. switch (itemParams.Type)
  199. {
  200. case ItemType.Helmet: EquipHelmet(item); break;
  201. case ItemType.Armor: EquipArmor(item); break;
  202. case ItemType.Vest: EquipVest(item); break;
  203. case ItemType.Bracers: EquipBracers(item); break;
  204. case ItemType.Leggings: EquipLeggings(item); break;
  205. case ItemType.Shield: EquipShield(item); break;
  206. case ItemType.Weapon:
  207. {
  208. switch (itemParams.Class)
  209. {
  210. case ItemClass.Bow: EquipBow(item); break;
  211. case ItemClass.Firearm: EquipSecondaryFirearm(item); break;
  212. default:
  213. if (itemParams.Tags.Contains(ItemTag.TwoHanded))
  214. {
  215. EquipMeleeWeapon2H(item);
  216. }
  217. else
  218. {
  219. EquipMeleeWeapon1H(item);
  220. }
  221. break;
  222. }
  223. break;
  224. }
  225. }
  226. }
  227. public void EquipSecondaryMelee1H(Item item)
  228. {
  229. Equip(SpriteCollection.MeleeWeapon1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.SecondaryMelee1H);
  230. }
  231. public void EquipArmor(Item item)
  232. {
  233. if (item == null) UnEquip(EquipmentPart.Armor);
  234. else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Armor);
  235. }
  236. public void EquipHelmet(Item item)
  237. {
  238. if (item == null) UnEquip(EquipmentPart.Helmet);
  239. else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Helmet);
  240. }
  241. public void EquipVest(Item item)
  242. {
  243. if (item == null) UnEquip(EquipmentPart.Vest);
  244. else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Vest);
  245. }
  246. public void EquipBracers(Item item)
  247. {
  248. if (item == null) UnEquip(EquipmentPart.Bracers);
  249. else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Bracers);
  250. }
  251. public void EquipLeggings(Item item)
  252. {
  253. if (item == null) UnEquip(EquipmentPart.Leggings);
  254. else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Leggings);
  255. }
  256. public void EquipShield(Item item)
  257. {
  258. Equip(SpriteCollection.Shield.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Shield);
  259. }
  260. public void EquipMeleeWeapon1H(Item item)
  261. {
  262. Equip(SpriteCollection.MeleeWeapon1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.MeleeWeapon1H);
  263. }
  264. public void EquipMeleeWeapon2H(Item item)
  265. {
  266. Equip(SpriteCollection.MeleeWeapon2H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.MeleeWeapon2H);
  267. }
  268. public void EquipBow(Item item)
  269. {
  270. Equip(SpriteCollection.Bow.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Bow);
  271. }
  272. public void EquipCrossbow(Item item)
  273. {
  274. Equip(SpriteCollection.Crossbow.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Crossbow);
  275. }
  276. public void EquipSecondaryFirearm(Item item)
  277. {
  278. Equip(SpriteCollection.Firearm1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.SecondaryFirearm1H);
  279. }
  280. #endregion
  281. }
  282. }