AvatarSetup.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 UnityEngine;
  8. namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
  9. {
  10. public class AvatarSetup : MonoBehaviour
  11. {
  12. public List<SpriteCollection> SpriteCollections;
  13. public SpriteRenderer Head;
  14. public SpriteRenderer Hair;
  15. public List<SpriteRenderer> Ears;
  16. public SpriteRenderer Eyes;
  17. public SpriteRenderer Eyebrows;
  18. public SpriteRenderer Mouth;
  19. public SpriteRenderer Beard;
  20. public SpriteRenderer Helmet;
  21. public void Initialize(CharacterAppearance appearance, string helmetId)
  22. {
  23. if (SpriteCollections.Count == 0) throw new Exception("Please set sprite collections for avatar setup.");
  24. var ears = FindItemSprite(i => i.Ears, appearance.Ears).Sprites[1];
  25. Head.sprite = FindItemSprite(i => i.Body, appearance.Body).Sprites.Single(i => i.name == "FrontHead");
  26. Head.color = Ears[0].color = Ears[1].color = appearance.BodyColor;
  27. ItemSprite hair = null;
  28. if (appearance.Hair.IsEmpty())
  29. {
  30. Hair.enabled = false;
  31. }
  32. else
  33. {
  34. hair = FindItemSprite(i => i.Hair, appearance.Hair);
  35. Hair.enabled = true;
  36. Hair.sprite = hair.Sprites[1];
  37. Hair.color = hair.Tags.Contains("NoPaint") ? (Color32) Color.white : appearance.HairColor;
  38. }
  39. Beard.sprite = appearance.Beard.IsEmpty() ? null : FindItemSprite(i => i.Beard, appearance.Beard).Sprite;
  40. Beard.color = appearance.BeardColor;
  41. Eyes.sprite = FindItemSprite(i => i.Eyes, appearance.Eyes).Sprite;
  42. Eyes.color = appearance.EyesColor;
  43. if (appearance.Eyebrows.IsEmpty())
  44. {
  45. Eyebrows.enabled = false;
  46. }
  47. else
  48. {
  49. Eyebrows.enabled = true;
  50. Eyebrows.sprite = FindItemSprite(i => i.Eyebrows, appearance.Eyebrows).Sprite;
  51. }
  52. Mouth.sprite = FindItemSprite(i => i.Mouth, appearance.Mouth).Sprite;
  53. Mouth.transform.localPosition = new Vector3(0, appearance.Type == 0 ? -0.1f : 0.25f);
  54. if (helmetId == null)
  55. {
  56. var hideEars = hair != null && hair.Tags.Contains("HideEars");
  57. Helmet.enabled = false;
  58. Ears.ForEach(j => { j.sprite = ears; j.enabled = !hideEars; });
  59. }
  60. else
  61. {
  62. Helmet.enabled = true;
  63. var helmet = FindItemSprite(i => i.Armor, helmetId);
  64. var showEars = helmet.Tags.Contains("ShowEars");
  65. Helmet.sprite = helmet.Sprites.Single(i => i.name == "FrontHead");
  66. Ears.ForEach(j => { j.sprite = ears; j.enabled = showEars; });
  67. if (!appearance.Hair.IsEmpty() && !helmet.Tags.Contains("FullHair"))
  68. {
  69. Hair.sprite = FindItemSprite(i => i.Hair, "Common.Basic.Hair.Default").Sprites[1];
  70. Hair.enabled = Hair.sprite != null;
  71. }
  72. }
  73. Ears[0].transform.localPosition = appearance.Type == 0 ? new Vector3(-1f, 0.5f) : new Vector3(-0.9f, 0.7f);
  74. Ears[1].transform.localPosition = appearance.Type == 0 ? new Vector3(1f, 0.5f) : new Vector3(0.9f, 0.7f);
  75. }
  76. private ItemSprite FindItemSprite(Func<SpriteCollection, IEnumerable<ItemSprite>> selector, string id)
  77. {
  78. foreach (var collection in SpriteCollections)
  79. {
  80. var sprite = selector(collection).FirstOrDefault(i => i.Id == id);
  81. if (sprite != null) return sprite;
  82. }
  83. throw new Exception($"Can't find {id}.");
  84. }
  85. }
  86. }