using System; using System.Collections.Generic; using System.Linq; using Assets.HeroEditor4D.Common.Scripts.Collections; using Assets.HeroEditor4D.Common.Scripts.Data; using Assets.HeroEditor4D.Common.Scripts.Enums; using UnityEngine; namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts { /// /// Character presentation in editor. Contains sprites, renderers, animation and so on. /// public partial class Character : MonoBehaviour { public SpriteCollection SpriteCollection; [Header("Body")] public List Ears; public Sprite Hair; public Sprite HairCropped; public Sprite Beard; public List Body; public Sprite Head; [Header("Expressions")] public string Expression = "Default"; public List Expressions; [Header("Equipment")] public Sprite Helmet; public Sprite PrimaryWeapon; public Sprite SecondaryWeapon; public Sprite Cape; public Sprite Quiver; public Sprite Backpack; public List Shield; public List Armor; public List CompositeWeapon; [Header("Accessories")] public Sprite Makeup; public Sprite Mask; public List Earrings; [Header("Body renderers")] public List BodyRenderers; public SpriteRenderer HeadRenderer; public List EarsRenderers; public SpriteRenderer HairRenderer; public SpriteRenderer BeardRenderer; public SpriteRenderer EyebrowsRenderer; public SpriteRenderer EyesRenderer; public SpriteRenderer MouthRenderer; [Header("Equipment renderers")] public SpriteRenderer HelmetRenderer; public SpriteRenderer PrimaryWeaponRenderer; public SpriteRenderer SecondaryWeaponRenderer; public List ArmorRenderers; public List VestRenderers; public List BracersRenderers; public List LeggingsRenderers; //public SpriteRenderer CapeRenderer; public SpriteRenderer QuiverRenderer; public SpriteRenderer BackpackRenderer; public List ShieldRenderers; public List BowRenderers; public List CrossbowRenderers; [Header("Accessories renderers")] public SpriteRenderer MakeupRenderer; public SpriteRenderer MaskRenderer; public List EarringsRenderers; [Header("Materials")] public Material DefaultMaterial; public Material EyesPaintMaterial; public Material EquipmentPaintMaterial; [Header("Animation")] public WeaponType WeaponType; [Header("Meta")] public bool HideEars; public bool CropHair; [Header("Anchors")] public Transform AnchorBody; public Transform AnchorSword; public Transform AnchorBow; public Transform AnchorFireMuzzle; [Header("Service")] public LayerManager LayerManager; [Header("Custom")] public List Underwear; public Color UnderwearColor; public bool ShowHelmet = true; /// /// Initializes character renderers with selected sprites. /// public void Initialize() { try // Disable try/catch for debugging. { TryInitialize(); } catch (Exception e) { Debug.LogWarningFormat("Unable to initialize character {0}: {1}", name, e.Message); } } /// /// Initializes character renderers with selected sprites. /// private void TryInitialize() { var expressionNames = Expressions.Select(i => i.Name).ToList(); if (!expressionNames.Contains("Default") || !expressionNames.Contains("Angry") || !expressionNames.Contains("Dead")) { throw new Exception("Character must have at least 3 basic expressions: Default, Angry and Dead."); } if (ShowHelmet) { MapSprites(EarsRenderers, HideEars ? null : Ears); SetSprite(HairRenderer, Hair == null ? null : CropHair ? HairCropped : Hair); SetSprite(HelmetRenderer, Helmet); } else { MapSprites(EarsRenderers, Ears); SetSprite(HairRenderer, Hair); SetSprite(HelmetRenderer, null); } SetExpression(Expression); SetSprite(BeardRenderer, Beard); MapSprites(BodyRenderers, Body); SetSprite(HeadRenderer, Head); MapSprites(ArmorRenderers, Armor); //CapeRenderer.sprite = Cape; SetSprite(QuiverRenderer, Quiver); SetSprite(BackpackRenderer, Backpack); MapSprites(ShieldRenderers, Shield); SetSprite(MakeupRenderer, Makeup); SetSprite(MaskRenderer, Mask); MapSprites(EarringsRenderers, Earrings); SetSprite(PrimaryWeaponRenderer, null); SetSprite(SecondaryWeaponRenderer, null); BowRenderers.ForEach(i => SetSprite(i, null)); CrossbowRenderers.ForEach(i => SetSprite(i, null)); switch (WeaponType) { case WeaponType.Melee1H: case WeaponType.Melee2H: case WeaponType.Firearm1H: case WeaponType.Firearm2H: case WeaponType.Throwable: SetSprite(PrimaryWeaponRenderer, PrimaryWeapon); break; case WeaponType.Paired: SetSprite(PrimaryWeaponRenderer, PrimaryWeapon); SetSprite(SecondaryWeaponRenderer, SecondaryWeapon); break; case WeaponType.Bow: MapSprites(BowRenderers, CompositeWeapon); break; case WeaponType.Crossbow: MapSprites(CrossbowRenderers, CompositeWeapon); break; default: throw new NotImplementedException(WeaponType.ToString()); } ApplyMaterials(); } private static void SetSprite(SpriteRenderer spriteRenderer, Sprite sprite) { if (spriteRenderer == null) return; spriteRenderer.sprite = sprite; spriteRenderer.enabled = sprite != null; } private void MapSprites(List spriteRenderers, List sprites) { spriteRenderers.ForEach(i => MapSprite(i, sprites)); } private void MapSprite(SpriteRenderer spriteRenderer, List sprites) { SetSprite(spriteRenderer, sprites == null ? null : spriteRenderer.GetComponent().FindSprite(sprites)); } private void ApplyMaterials() { var renderers = ArmorRenderers.ToList(); renderers.Add(HairRenderer); renderers.Add(PrimaryWeaponRenderer); renderers.Add(SecondaryWeaponRenderer); renderers.ForEach(i => i.sharedMaterial = i.color == Color.white ? DefaultMaterial : EquipmentPaintMaterial); } public void CopyFrom(Character character) { if (character == null) throw new ArgumentNullException(nameof(character), "Can't copy from empty character!"); Body = character.Body.ToList(); Ears = character.Ears.ToList(); Hair = character.Hair; Expression = character.Expression; Expressions = character.Expressions.ToList(); Beard = character.Beard; Helmet = character.Helmet; Armor = character.Armor.ToList(); PrimaryWeapon = character.PrimaryWeapon; SecondaryWeapon = character.SecondaryWeapon; Cape = character.Cape; Quiver = character.Quiver; Backpack = character.Backpack; Shield = character.Shield.ToList(); CompositeWeapon = character.CompositeWeapon.ToList(); Makeup = character.Makeup; Mask = character.Mask; Earrings = character.Earrings.ToList(); foreach (var target in GetComponentsInChildren(true).Where(i => i.sprite != null)) { foreach (var source in character.GetComponentsInChildren(true)) { if (target.name == source.name && target.transform.parent.name == source.transform.parent.name) { target.color = source.color; break; } } } WeaponType = character.WeaponType; HideEars = character.HideEars; CropHair = character.CropHair; Initialize(); SetExpression("Default"); } } }