This commit is contained in:
Nim XD
2024-08-27 21:01:33 +05:30
parent 99eaf514fd
commit 121a1b7c73
31803 changed files with 623461 additions and 623399 deletions

View File

@@ -1,16 +1,16 @@
using System.Collections.Generic;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
public class AnchorManager : MonoBehaviour
{
public Transform Body;
public Transform PrimaryWeapon;
public Transform Bow;
public Transform Shield;
public Transform Status;
public List<Transform> Custom;
}
using System.Collections.Generic;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
public class AnchorManager : MonoBehaviour
{
public Transform Body;
public Transform PrimaryWeapon;
public Transform Bow;
public Transform Shield;
public Transform Status;
public List<Transform> Custom;
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: 9ac5cde981f663e49855fc6a42c56c96
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 9ac5cde981f663e49855fc6a42c56c96
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,61 +1,61 @@
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Animation events. If you want to get animation callback, use it.
/// For example, if you want to know exact hit moment for attack animation, use custom event 'Hit' that is fired in most attack animations.
/// </summary>
public class AnimationEvents : MonoBehaviour
{
/// <summary>
/// Subscribe it to get animation callback.
/// </summary>
public event Action<string> OnEvent = s => { };
/// <summary>
/// Set trigger.
/// </summary>
public void SetTrigger(string triggerName)
{
GetComponent<Animator>().SetTrigger(triggerName);
}
/// <summary>
/// Set bool param, usage example: Idle=false
/// </summary>
public void SetBool(string value)
{
var parts = value.Split('=');
GetComponent<Animator>().SetBool(parts[0], bool.Parse(parts[1]));
}
/// <summary>
/// Set integer param, usage example: WeaponType=2
/// </summary>
public void SetInteger(string value)
{
var parts = value.Split('=');
GetComponent<Animator>().SetInteger(parts[0], int.Parse(parts[1]));
}
/// <summary>
/// Called from animation.
/// </summary>
public void CustomEvent(string eventName)
{
OnEvent(eventName);
}
/// <summary>
/// Set characters' expression. Called from animation.
/// </summary>
public void SetExpression(string expression)
{
GetComponent<Character4D>().Parts.ForEach(i => i.SetExpression(expression));
}
}
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Animation events. If you want to get animation callback, use it.
/// For example, if you want to know exact hit moment for attack animation, use custom event 'Hit' that is fired in most attack animations.
/// </summary>
public class AnimationEvents : MonoBehaviour
{
/// <summary>
/// Subscribe it to get animation callback.
/// </summary>
public event Action<string> OnEvent = s => { };
/// <summary>
/// Set trigger.
/// </summary>
public void SetTrigger(string triggerName)
{
GetComponent<Animator>().SetTrigger(triggerName);
}
/// <summary>
/// Set bool param, usage example: Idle=false
/// </summary>
public void SetBool(string value)
{
var parts = value.Split('=');
GetComponent<Animator>().SetBool(parts[0], bool.Parse(parts[1]));
}
/// <summary>
/// Set integer param, usage example: WeaponType=2
/// </summary>
public void SetInteger(string value)
{
var parts = value.Split('=');
GetComponent<Animator>().SetInteger(parts[0], int.Parse(parts[1]));
}
/// <summary>
/// Called from animation.
/// </summary>
public void CustomEvent(string eventName)
{
OnEvent(eventName);
}
/// <summary>
/// Set characters' expression. Called from animation.
/// </summary>
public void SetExpression(string expression)
{
GetComponent<Character4D>().Parts.ForEach(i => i.SetExpression(expression));
}
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: 07a219f3f28a3014ca16bf6b2f13111f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 07a219f3f28a3014ca16bf6b2f13111f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,191 +1,191 @@
using System;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Common.Springs;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Used to play animations.
/// </summary>
public class AnimationManager : MonoBehaviour
{
public Character4D Character;
public Animator Animator;
public bool IsAction
{
get => Animator.GetBool("Action");
set => Animator.SetBool("Action", value);
}
/// <summary>
/// Set animation parameter State that controls transition.
/// </summary>
public void SetState(CharacterState state)
{
Animator.SetInteger("State", (int) state);
}
/// <summary>
/// Play Attack animation according to selected weapon.
/// </summary>
public void Attack()
{
switch (Character.WeaponType)
{
case WeaponType.Melee1H:
case WeaponType.Melee2H:
Slash1H();
break;
case WeaponType.Bow:
ShotBow();
break;
default:
//throw new NotImplementedException("This feature may be implemented in next updates.");
Slash1H();
break;
}
}
/// <summary>
/// Play Slash1H animation.
/// </summary>
public void Slash1H()
{
Animator.SetTrigger("Slash1H");
IsAction = true;
}
/// <summary>
/// Play Slash2H animation.
/// </summary>
public void Slash2H()
{
Animator.SetTrigger("Slash2H");
IsAction = true;
}
public void Slash(bool twoHanded)
{
Animator.SetTrigger(twoHanded ? "Slash2H" : "Slash1H");
IsAction = true;
}
/// <summary>
/// Play Jab animation.
/// </summary>
public void Jab()
{
Animator.SetTrigger("Jab");
IsAction = true;
}
/// <summary>
/// Play Slash1H animation.
/// </summary>
public void HeavySlash1H()
{
Animator.SetTrigger("HeavySlash1H");
IsAction = true;
}
/// <summary>
/// Play PowerStab animation.
/// </summary>
public void FastStab()
{
Animator.SetTrigger("FastStab");
IsAction = true;
}
/// <summary>
/// Play Shot animation (bow).
/// </summary>
public void ShotBow()
{
Animator.SetTrigger("ShotBow");
IsAction = true;
}
/// <summary>
/// Play Death animation.
/// </summary>
public void Die()
{
SetState(CharacterState.Death);
}
/// <summary>
/// Play Hit animation. This will just scale character up and down.
/// Hit will not break currently playing animation, for example you can Hit character while it's playing Attack animation.
/// </summary>
public void Hit()
{
Animator.SetTrigger("Hit");
}
public void ShieldBlock()
{
SetState(CharacterState.ShieldBlock);
}
public void WeaponBlock()
{
SetState(CharacterState.WeaponBlock);
}
public void Evade()
{
Animator.SetTrigger("Evade");
}
public void SetTwoHanded(bool twoHanded)
{
Animator.SetBool("TwoHanded", twoHanded);
}
public void SetWeaponType(WeaponType weaponType)
{
Animator.SetInteger("WeaponType", (int) weaponType);
}
public void Fire()
{
Animator.SetTrigger("Fire");
IsAction = true;
}
public void SecondaryShot()
{
Animator.SetTrigger("SecondaryShot");
IsAction = true;
}
public void CrossbowShot()
{
Animator.SetTrigger("Fire");
IsAction = true;
if (Character.Parts[0].CompositeWeapon != null)
{
var loaded = Character.Front.CompositeWeapon.Single(i => i.name == "Side");
var empty = Character.Front.CompositeWeapon.Single(i => i.name == "SideEmpty");
foreach (var part in Character.Parts)
{
part.PrimaryWeaponRenderer.sprite = part.PrimaryWeaponRenderer.sprite == loaded ? empty : loaded;
}
}
}
/// <summary>
/// Alternative way to Hit character (with a script).
/// </summary>
public void Spring()
{
ScaleSpring.Begin(this, 1f, 1.1f, 40, 2);
}
}
using System;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Common.Springs;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Used to play animations.
/// </summary>
public class AnimationManager : MonoBehaviour
{
public Character4D Character;
public Animator Animator;
public bool IsAction
{
get => Animator.GetBool("Action");
set => Animator.SetBool("Action", value);
}
/// <summary>
/// Set animation parameter State that controls transition.
/// </summary>
public void SetState(CharacterState state)
{
Animator.SetInteger("State", (int) state);
}
/// <summary>
/// Play Attack animation according to selected weapon.
/// </summary>
public void Attack()
{
switch (Character.WeaponType)
{
case WeaponType.Melee1H:
case WeaponType.Melee2H:
Slash1H();
break;
case WeaponType.Bow:
ShotBow();
break;
default:
//throw new NotImplementedException("This feature may be implemented in next updates.");
Slash1H();
break;
}
}
/// <summary>
/// Play Slash1H animation.
/// </summary>
public void Slash1H()
{
Animator.SetTrigger("Slash1H");
IsAction = true;
}
/// <summary>
/// Play Slash2H animation.
/// </summary>
public void Slash2H()
{
Animator.SetTrigger("Slash2H");
IsAction = true;
}
public void Slash(bool twoHanded)
{
Animator.SetTrigger(twoHanded ? "Slash2H" : "Slash1H");
IsAction = true;
}
/// <summary>
/// Play Jab animation.
/// </summary>
public void Jab()
{
Animator.SetTrigger("Jab");
IsAction = true;
}
/// <summary>
/// Play Slash1H animation.
/// </summary>
public void HeavySlash1H()
{
Animator.SetTrigger("HeavySlash1H");
IsAction = true;
}
/// <summary>
/// Play PowerStab animation.
/// </summary>
public void FastStab()
{
Animator.SetTrigger("FastStab");
IsAction = true;
}
/// <summary>
/// Play Shot animation (bow).
/// </summary>
public void ShotBow()
{
Animator.SetTrigger("ShotBow");
IsAction = true;
}
/// <summary>
/// Play Death animation.
/// </summary>
public void Die()
{
SetState(CharacterState.Death);
}
/// <summary>
/// Play Hit animation. This will just scale character up and down.
/// Hit will not break currently playing animation, for example you can Hit character while it's playing Attack animation.
/// </summary>
public void Hit()
{
Animator.SetTrigger("Hit");
}
public void ShieldBlock()
{
SetState(CharacterState.ShieldBlock);
}
public void WeaponBlock()
{
SetState(CharacterState.WeaponBlock);
}
public void Evade()
{
Animator.SetTrigger("Evade");
}
public void SetTwoHanded(bool twoHanded)
{
Animator.SetBool("TwoHanded", twoHanded);
}
public void SetWeaponType(WeaponType weaponType)
{
Animator.SetInteger("WeaponType", (int) weaponType);
}
public void Fire()
{
Animator.SetTrigger("Fire");
IsAction = true;
}
public void SecondaryShot()
{
Animator.SetTrigger("SecondaryShot");
IsAction = true;
}
public void CrossbowShot()
{
Animator.SetTrigger("Fire");
IsAction = true;
if (Character.Parts[0].CompositeWeapon != null)
{
var loaded = Character.Front.CompositeWeapon.Single(i => i.name == "Side");
var empty = Character.Front.CompositeWeapon.Single(i => i.name == "SideEmpty");
foreach (var part in Character.Parts)
{
part.PrimaryWeaponRenderer.sprite = part.PrimaryWeaponRenderer.sprite == loaded ? empty : loaded;
}
}
}
/// <summary>
/// Alternative way to Hit character (with a script).
/// </summary>
public void Spring()
{
ScaleSpring.Begin(this, 1f, 1.1f, 40, 2);
}
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: a803be54150222e44893e7f7e2c14849
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: a803be54150222e44893e7f7e2c14849
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,104 +1,104 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Collections;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
public class AvatarSetup : MonoBehaviour
{
public List<SpriteCollection> SpriteCollections;
public SpriteRenderer Head;
public SpriteRenderer Hair;
public List<SpriteRenderer> Ears;
public SpriteRenderer Eyes;
public SpriteRenderer Eyebrows;
public SpriteRenderer Mouth;
public SpriteRenderer Beard;
public SpriteRenderer Helmet;
public void Initialize(CharacterAppearance appearance, string helmetId)
{
if (SpriteCollections.Count == 0) throw new Exception("Please set sprite collections for avatar setup.");
var ears = FindItemSprite(i => i.Ears, appearance.Ears).Sprites[1];
Head.sprite = FindItemSprite(i => i.Body, appearance.Body).Sprites.Single(i => i.name == "FrontHead");
Head.color = Ears[0].color = Ears[1].color = appearance.BodyColor;
ItemSprite hair = null;
if (appearance.Hair.IsEmpty())
{
Hair.enabled = false;
}
else
{
hair = FindItemSprite(i => i.Hair, appearance.Hair);
Hair.enabled = true;
Hair.sprite = hair.Sprites[1];
Hair.color = hair.Tags.Contains("NoPaint") ? (Color32) Color.white : appearance.HairColor;
}
Beard.sprite = appearance.Beard.IsEmpty() ? null : FindItemSprite(i => i.Beard, appearance.Beard).Sprite;
Beard.color = appearance.BeardColor;
Eyes.sprite = FindItemSprite(i => i.Eyes, appearance.Eyes).Sprite;
Eyes.color = appearance.EyesColor;
if (appearance.Eyebrows.IsEmpty())
{
Eyebrows.enabled = false;
}
else
{
Eyebrows.enabled = true;
Eyebrows.sprite = FindItemSprite(i => i.Eyebrows, appearance.Eyebrows).Sprite;
}
Mouth.sprite = FindItemSprite(i => i.Mouth, appearance.Mouth).Sprite;
Mouth.transform.localPosition = new Vector3(0, appearance.Type == 0 ? -0.1f : 0.25f);
if (helmetId == null)
{
var hideEars = hair != null && hair.Tags.Contains("HideEars");
Helmet.enabled = false;
Ears.ForEach(j => { j.sprite = ears; j.enabled = !hideEars; });
}
else
{
Helmet.enabled = true;
var helmet = FindItemSprite(i => i.Armor, helmetId);
var showEars = helmet.Tags.Contains("ShowEars");
Helmet.sprite = helmet.Sprites.Single(i => i.name == "FrontHead");
Ears.ForEach(j => { j.sprite = ears; j.enabled = showEars; });
if (!appearance.Hair.IsEmpty() && !helmet.Tags.Contains("FullHair"))
{
Hair.sprite = FindItemSprite(i => i.Hair, "Common.Basic.Hair.Default").Sprites[1];
Hair.enabled = Hair.sprite != null;
}
}
Ears[0].transform.localPosition = appearance.Type == 0 ? new Vector3(-1f, 0.5f) : new Vector3(-0.9f, 0.7f);
Ears[1].transform.localPosition = appearance.Type == 0 ? new Vector3(1f, 0.5f) : new Vector3(0.9f, 0.7f);
}
private ItemSprite FindItemSprite(Func<SpriteCollection, IEnumerable<ItemSprite>> selector, string id)
{
foreach (var collection in SpriteCollections)
{
var sprite = selector(collection).FirstOrDefault(i => i.Id == id);
if (sprite != null) return sprite;
}
throw new Exception($"Can't find {id}.");
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Collections;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
public class AvatarSetup : MonoBehaviour
{
public List<SpriteCollection> SpriteCollections;
public SpriteRenderer Head;
public SpriteRenderer Hair;
public List<SpriteRenderer> Ears;
public SpriteRenderer Eyes;
public SpriteRenderer Eyebrows;
public SpriteRenderer Mouth;
public SpriteRenderer Beard;
public SpriteRenderer Helmet;
public void Initialize(CharacterAppearance appearance, string helmetId)
{
if (SpriteCollections.Count == 0) throw new Exception("Please set sprite collections for avatar setup.");
var ears = FindItemSprite(i => i.Ears, appearance.Ears).Sprites[1];
Head.sprite = FindItemSprite(i => i.Body, appearance.Body).Sprites.Single(i => i.name == "FrontHead");
Head.color = Ears[0].color = Ears[1].color = appearance.BodyColor;
ItemSprite hair = null;
if (appearance.Hair.IsEmpty())
{
Hair.enabled = false;
}
else
{
hair = FindItemSprite(i => i.Hair, appearance.Hair);
Hair.enabled = true;
Hair.sprite = hair.Sprites[1];
Hair.color = hair.Tags.Contains("NoPaint") ? (Color32) Color.white : appearance.HairColor;
}
Beard.sprite = appearance.Beard.IsEmpty() ? null : FindItemSprite(i => i.Beard, appearance.Beard).Sprite;
Beard.color = appearance.BeardColor;
Eyes.sprite = FindItemSprite(i => i.Eyes, appearance.Eyes).Sprite;
Eyes.color = appearance.EyesColor;
if (appearance.Eyebrows.IsEmpty())
{
Eyebrows.enabled = false;
}
else
{
Eyebrows.enabled = true;
Eyebrows.sprite = FindItemSprite(i => i.Eyebrows, appearance.Eyebrows).Sprite;
}
Mouth.sprite = FindItemSprite(i => i.Mouth, appearance.Mouth).Sprite;
Mouth.transform.localPosition = new Vector3(0, appearance.Type == 0 ? -0.1f : 0.25f);
if (helmetId == null)
{
var hideEars = hair != null && hair.Tags.Contains("HideEars");
Helmet.enabled = false;
Ears.ForEach(j => { j.sprite = ears; j.enabled = !hideEars; });
}
else
{
Helmet.enabled = true;
var helmet = FindItemSprite(i => i.Armor, helmetId);
var showEars = helmet.Tags.Contains("ShowEars");
Helmet.sprite = helmet.Sprites.Single(i => i.name == "FrontHead");
Ears.ForEach(j => { j.sprite = ears; j.enabled = showEars; });
if (!appearance.Hair.IsEmpty() && !helmet.Tags.Contains("FullHair"))
{
Hair.sprite = FindItemSprite(i => i.Hair, "Common.Basic.Hair.Default").Sprites[1];
Hair.enabled = Hair.sprite != null;
}
}
Ears[0].transform.localPosition = appearance.Type == 0 ? new Vector3(-1f, 0.5f) : new Vector3(-0.9f, 0.7f);
Ears[1].transform.localPosition = appearance.Type == 0 ? new Vector3(1f, 0.5f) : new Vector3(0.9f, 0.7f);
}
private ItemSprite FindItemSprite(Func<SpriteCollection, IEnumerable<ItemSprite>> selector, string id)
{
foreach (var collection in SpriteCollections)
{
var sprite = selector(collection).FirstOrDefault(i => i.Id == id);
if (sprite != null) return sprite;
}
throw new Exception($"Can't find {id}.");
}
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: 165833838b760574cb5f7fd9d64038ad
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 165833838b760574cb5f7fd9d64038ad
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,258 +1,258 @@
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
{
/// <summary>
/// Character presentation in editor. Contains sprites, renderers, animation and so on.
/// </summary>
public partial class Character : MonoBehaviour
{
public SpriteCollection SpriteCollection;
[Header("Body")]
public List<Sprite> Ears;
public Sprite Hair;
public Sprite HairCropped;
public Sprite Beard;
public List<Sprite> Body;
public Sprite Head;
[Header("Expressions")]
public string Expression = "Default";
public List<Expression> Expressions;
[Header("Equipment")]
public Sprite Helmet;
public Sprite PrimaryWeapon;
public Sprite SecondaryWeapon;
public Sprite Cape;
public Sprite Quiver;
public Sprite Backpack;
public List<Sprite> Shield;
public List<Sprite> Armor;
public List<Sprite> CompositeWeapon;
[Header("Accessories")]
public Sprite Makeup;
public Sprite Mask;
public List<Sprite> Earrings;
[Header("Body renderers")]
public List<SpriteRenderer> BodyRenderers;
public SpriteRenderer HeadRenderer;
public List<SpriteRenderer> 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<SpriteRenderer> ArmorRenderers;
public List<SpriteRenderer> VestRenderers;
public List<SpriteRenderer> BracersRenderers;
public List<SpriteRenderer> LeggingsRenderers;
//public SpriteRenderer CapeRenderer;
public SpriteRenderer QuiverRenderer;
public SpriteRenderer BackpackRenderer;
public List<SpriteRenderer> ShieldRenderers;
public List<SpriteRenderer> BowRenderers;
public List<SpriteRenderer> CrossbowRenderers;
[Header("Accessories renderers")]
public SpriteRenderer MakeupRenderer;
public SpriteRenderer MaskRenderer;
public List<SpriteRenderer> 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<Sprite> Underwear;
public Color UnderwearColor;
public bool ShowHelmet = true;
/// <summary>
/// Initializes character renderers with selected sprites.
/// </summary>
public void Initialize()
{
try // Disable try/catch for debugging.
{
TryInitialize();
}
catch (Exception e)
{
Debug.LogWarningFormat("Unable to initialize character {0}: {1}", name, e.Message);
}
}
/// <summary>
/// Initializes character renderers with selected sprites.
/// </summary>
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<SpriteRenderer> spriteRenderers, List<Sprite> sprites)
{
spriteRenderers.ForEach(i => MapSprite(i, sprites));
}
private void MapSprite(SpriteRenderer spriteRenderer, List<Sprite> sprites)
{
SetSprite(spriteRenderer, sprites == null ? null : spriteRenderer.GetComponent<SpriteMapping>().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<SpriteRenderer>(true).Where(i => i.sprite != null))
{
foreach (var source in character.GetComponentsInChildren<SpriteRenderer>(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");
}
}
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
{
/// <summary>
/// Character presentation in editor. Contains sprites, renderers, animation and so on.
/// </summary>
public partial class Character : MonoBehaviour
{
public SpriteCollection SpriteCollection;
[Header("Body")]
public List<Sprite> Ears;
public Sprite Hair;
public Sprite HairCropped;
public Sprite Beard;
public List<Sprite> Body;
public Sprite Head;
[Header("Expressions")]
public string Expression = "Default";
public List<Expression> Expressions;
[Header("Equipment")]
public Sprite Helmet;
public Sprite PrimaryWeapon;
public Sprite SecondaryWeapon;
public Sprite Cape;
public Sprite Quiver;
public Sprite Backpack;
public List<Sprite> Shield;
public List<Sprite> Armor;
public List<Sprite> CompositeWeapon;
[Header("Accessories")]
public Sprite Makeup;
public Sprite Mask;
public List<Sprite> Earrings;
[Header("Body renderers")]
public List<SpriteRenderer> BodyRenderers;
public SpriteRenderer HeadRenderer;
public List<SpriteRenderer> 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<SpriteRenderer> ArmorRenderers;
public List<SpriteRenderer> VestRenderers;
public List<SpriteRenderer> BracersRenderers;
public List<SpriteRenderer> LeggingsRenderers;
//public SpriteRenderer CapeRenderer;
public SpriteRenderer QuiverRenderer;
public SpriteRenderer BackpackRenderer;
public List<SpriteRenderer> ShieldRenderers;
public List<SpriteRenderer> BowRenderers;
public List<SpriteRenderer> CrossbowRenderers;
[Header("Accessories renderers")]
public SpriteRenderer MakeupRenderer;
public SpriteRenderer MaskRenderer;
public List<SpriteRenderer> 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<Sprite> Underwear;
public Color UnderwearColor;
public bool ShowHelmet = true;
/// <summary>
/// Initializes character renderers with selected sprites.
/// </summary>
public void Initialize()
{
try // Disable try/catch for debugging.
{
TryInitialize();
}
catch (Exception e)
{
Debug.LogWarningFormat("Unable to initialize character {0}: {1}", name, e.Message);
}
}
/// <summary>
/// Initializes character renderers with selected sprites.
/// </summary>
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<SpriteRenderer> spriteRenderers, List<Sprite> sprites)
{
spriteRenderers.ForEach(i => MapSprite(i, sprites));
}
private void MapSprite(SpriteRenderer spriteRenderer, List<Sprite> sprites)
{
SetSprite(spriteRenderer, sprites == null ? null : spriteRenderer.GetComponent<SpriteMapping>().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<SpriteRenderer>(true).Where(i => i.sprite != null))
{
foreach (var source in character.GetComponentsInChildren<SpriteRenderer>(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");
}
}
}

View File

@@ -1,13 +1,13 @@
fileFormatVersion: 2
guid: aa07006f64294964b84f79497751e149
timeCreated: 1516790276
licenseType: Store
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: aa07006f64294964b84f79497751e149
timeCreated: 1516790276
licenseType: Store
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,331 +1,331 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Collections;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Data;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using Assets.HeroEditor4D.InventorySystem.Scripts;
using Assets.HeroEditor4D.InventorySystem.Scripts.Data;
using Assets.HeroEditor4D.InventorySystem.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Controls 4 characters (for each direction).
/// </summary>
public class Character4D : MonoBehaviour
{
[Header("Parts")]
public Character Front;
public Character Back;
public Character Left;
public Character Right;
public Transform characterTransform (){
if(Front.gameObject.activeSelf){
return Front.transform;
}else if (Back.gameObject.activeSelf){
return Back.transform;
}else if (Left.gameObject.activeSelf){
return Left.transform;
}else{
return Right.transform;
}
}
public List<Character> Parts;
public List<GameObject> Shadows;
[Header("Animation")]
public Animator Animator;
public AnimationManager AnimationManager;
[Header("Other")]
public LayerManager LayerManager;
public Color BodyColor;
public SpriteCollection SpriteCollection => Parts[0].SpriteCollection;
private List<Character> PartsExceptBack => new List<Character> { Front, Left, Right };
public List<Sprite> Body { set { Parts.ForEach(i => i.Body = value.ToList()); } }
public List<Sprite> Head { set { Parts.ForEach(i => i.Head = i.HairRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Hair { set { Parts.ForEach(i => i.Hair = i.HairRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Beard { set { Parts.ForEach(i => { if (i.BeardRenderer) i.Beard = i.BeardRenderer.GetComponent<SpriteMapping>().FindSprite(value); }); } }
public List<Sprite> Ears { set { Parts.ForEach(i => i.Ears = value.ToList()); } }
public List<Sprite> Eyebrows { set { PartsExceptBack.ForEach(i => i.Expressions[0].Eyebrows = i.EyebrowsRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Eyes { set { PartsExceptBack.ForEach(i => i.Expressions[0].Eyes = i.EyesRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Mouth { set { PartsExceptBack.ForEach(i => i.Expressions[0].Mouth = i.MouthRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Helmet { set { Parts.ForEach(i => i.Helmet = i.HelmetRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Armor { set { Parts.ForEach(i => i.Armor = value.ToList()); } }
public Sprite PrimaryWeapon { set { Parts.ForEach(i => i.PrimaryWeapon = value); } }
public Sprite SecondaryWeapon { set { Parts.ForEach(i => i.SecondaryWeapon = value); } }
public List<Sprite> Shield { set { Parts.ForEach(i => i.Shield = value.ToList()); } }
public List<Sprite> CompositeWeapon { set { Parts.ForEach(i => i.CompositeWeapon = value.ToList()); } }
public List<Sprite> Makeup { set { Parts.ForEach(i => { if (i.MakeupRenderer) i.Makeup = i.MakeupRenderer.GetComponent<SpriteMapping>().FindSprite(value); }); } }
public List<Sprite> Mask { set { Parts.ForEach(i => { if (i.MaskRenderer) i.Mask = i.MaskRenderer.GetComponent<SpriteMapping>().FindSprite(value); }); } }
public List<Sprite> Earrings { set { Parts.ForEach(i => i.Earrings = value.ToList()); } }
public WeaponType WeaponType { get => Front.WeaponType; set { Parts.ForEach(i => i.WeaponType = value); } }
public void OnValidate()
{
Parts = new List<Character> { Front, Back, Left, Right };
Parts.ForEach(i => i.BodyRenderers.ForEach(j => j.color = BodyColor));
Parts.ForEach(i => i.EarsRenderers.ForEach(j => j.color = BodyColor));
}
public void Start()
{
var stateHandler = Animator.GetBehaviours<StateHandler>().SingleOrDefault(i => i.Name == "Death");
if (stateHandler != null)
{
stateHandler.StateExit.AddListener(() => SetExpression("Default"));
}
Animator.keepAnimatorStateOnDisable = true;
//Animator.keepAnimatorControllerStateOnDisable = true;
}
public void Initialize()
{
Parts.ForEach(i => i.Initialize());
}
public void SetBody(ItemSprite item, BodyPart part)
{
Parts.ForEach(i => i.SetBody(item, part));
}
public void SetBody(ItemSprite item, BodyPart part, Color? color)
{
Parts.ForEach(i => i.SetBody(item, part, color));
}
public void SetExpression(string expression)
{
Parts.ForEach(i => i.SetExpression(expression));
}
public void Equip(ItemSprite item, EquipmentPart part)
{
Parts.ForEach(i => i.Equip(item, part));
UpdateWeaponType(part);
}
public void Equip(ItemSprite item, EquipmentPart part, Color? color)
{
Parts.ForEach(i => i.Equip(item, part, color));
UpdateWeaponType(part);
}
private void UpdateWeaponType(EquipmentPart part)
{
switch (part)
{
case EquipmentPart.MeleeWeapon1H: Animator.SetInteger("WeaponType", (int) WeaponType.Melee1H); break;
case EquipmentPart.MeleeWeapon2H: Animator.SetInteger("WeaponType", (int) WeaponType.Melee2H); break;
case EquipmentPart.Bow: Animator.SetInteger("WeaponType", (int) WeaponType.Bow); break;
case EquipmentPart.Crossbow: Animator.SetInteger("WeaponType", (int) WeaponType.Crossbow); break;
case EquipmentPart.Firearm1H: Animator.SetInteger("WeaponType", (int) WeaponType.Firearm1H); break;
case EquipmentPart.Firearm2H: Animator.SetInteger("WeaponType", (int) WeaponType.Firearm2H); break;
case EquipmentPart.SecondaryFirearm1H: Animator.SetInteger("WeaponType", (int) WeaponType.Paired); break;
}
}
public void UnEquip(EquipmentPart part)
{
Parts.ForEach(i => i.UnEquip(part));
}
public void ResetEquipment()
{
Parts.ForEach(i => i.ResetEquipment());
Animator.SetInteger("WeaponType", (int)WeaponType.Melee1H);
}
public Vector2 Direction { get; private set; }
public Character Active { get; private set; }
public void SetDirection(Vector2 direction)
{
if (Direction == direction) return;
Direction = direction;
if (Direction == Vector2.zero)
{
Parts.ForEach(i => i.SetActive(true));
Shadows.ForEach(i => i.SetActive(true));
Parts[0].transform.localPosition = Shadows[0].transform.localPosition = new Vector3(0, -1.25f);
Parts[1].transform.localPosition = Shadows[1].transform.localPosition = new Vector3(0, 1.25f);
Parts[2].transform.localPosition = Shadows[2].transform.localPosition = new Vector3(-1.5f, 0);
Parts[3].transform.localPosition = Shadows[3].transform.localPosition = new Vector3(1.5f, 0);
return;
}
Parts.ForEach(i => i.transform.localPosition = Vector3.zero);
Shadows.ForEach(i => i.transform.localPosition = Vector3.zero);
int index;
if (direction == Vector2.left)
{
index = 2;
}
else if (direction == Vector2.right)
{
index = 3;
}
else if (direction == Vector2.up)
{
index = 1;
}
else if (direction == Vector2.down)
{
index = 0;
}
else
{
throw new NotSupportedException();
}
for (var i = 0; i < Parts.Count; i++)
{
Parts[i].SetActive(i == index);
Shadows[i].SetActive(i == index);
}
Active = Parts[index];
}
public void CopyFrom(Character4D character)
{
for (var i = 0; i < Parts.Count; i++)
{
Parts[i].CopyFrom(character.Parts[i]);
Parts[i].WeaponType = character.Parts[i].WeaponType;
Parts[i].HideEars = character.Parts[i].HideEars;
Parts[i].CropHair = character.Parts[i].CropHair;
Parts[i].AnchorFireMuzzle.localPosition = character.Parts[i].AnchorFireMuzzle.localPosition;
}
Animator.SetInteger("WeaponType", (int) character.WeaponType);
}
public string ToJson()
{
return Front.ToJson();
}
public void FromJson(string json, bool silent)
{
Parts.ForEach(i => i.LoadFromJson(json, silent));
Animator.SetInteger("WeaponType", (int) Parts[0].WeaponType);
}
#region Setup Examples
public void Equip(Item item)
{
var itemParams = ItemCollection.Active.GetItemParams(item);
switch (itemParams.Type)
{
case ItemType.Helmet: EquipHelmet(item); break;
case ItemType.Armor: EquipArmor(item); break;
case ItemType.Vest: EquipVest(item); break;
case ItemType.Bracers: EquipBracers(item); break;
case ItemType.Leggings: EquipLeggings(item); break;
case ItemType.Shield: EquipShield(item); break;
case ItemType.Weapon:
{
switch (itemParams.Class)
{
case ItemClass.Bow: EquipBow(item); break;
case ItemClass.Firearm: EquipSecondaryFirearm(item); break;
default:
if (itemParams.Tags.Contains(ItemTag.TwoHanded))
{
EquipMeleeWeapon2H(item);
}
else
{
EquipMeleeWeapon1H(item);
}
break;
}
break;
}
}
}
public void EquipSecondaryMelee1H(Item item)
{
Equip(SpriteCollection.MeleeWeapon1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.SecondaryMelee1H);
}
public void EquipArmor(Item item)
{
if (item == null) UnEquip(EquipmentPart.Armor);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Armor);
}
public void EquipHelmet(Item item)
{
if (item == null) UnEquip(EquipmentPart.Helmet);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Helmet);
}
public void EquipVest(Item item)
{
if (item == null) UnEquip(EquipmentPart.Vest);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Vest);
}
public void EquipBracers(Item item)
{
if (item == null) UnEquip(EquipmentPart.Bracers);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Bracers);
}
public void EquipLeggings(Item item)
{
if (item == null) UnEquip(EquipmentPart.Leggings);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Leggings);
}
public void EquipShield(Item item)
{
Equip(SpriteCollection.Shield.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Shield);
}
public void EquipMeleeWeapon1H(Item item)
{
Equip(SpriteCollection.MeleeWeapon1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.MeleeWeapon1H);
}
public void EquipMeleeWeapon2H(Item item)
{
Equip(SpriteCollection.MeleeWeapon2H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.MeleeWeapon2H);
}
public void EquipBow(Item item)
{
Equip(SpriteCollection.Bow.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Bow);
}
public void EquipCrossbow(Item item)
{
Equip(SpriteCollection.Crossbow.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Crossbow);
}
public void EquipSecondaryFirearm(Item item)
{
Equip(SpriteCollection.Firearm1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.SecondaryFirearm1H);
}
#endregion
}
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Collections;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Data;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using Assets.HeroEditor4D.InventorySystem.Scripts;
using Assets.HeroEditor4D.InventorySystem.Scripts.Data;
using Assets.HeroEditor4D.InventorySystem.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Controls 4 characters (for each direction).
/// </summary>
public class Character4D : MonoBehaviour
{
[Header("Parts")]
public Character Front;
public Character Back;
public Character Left;
public Character Right;
public Transform characterTransform (){
if(Front.gameObject.activeSelf){
return Front.transform;
}else if (Back.gameObject.activeSelf){
return Back.transform;
}else if (Left.gameObject.activeSelf){
return Left.transform;
}else{
return Right.transform;
}
}
public List<Character> Parts;
public List<GameObject> Shadows;
[Header("Animation")]
public Animator Animator;
public AnimationManager AnimationManager;
[Header("Other")]
public LayerManager LayerManager;
public Color BodyColor;
public SpriteCollection SpriteCollection => Parts[0].SpriteCollection;
private List<Character> PartsExceptBack => new List<Character> { Front, Left, Right };
public List<Sprite> Body { set { Parts.ForEach(i => i.Body = value.ToList()); } }
public List<Sprite> Head { set { Parts.ForEach(i => i.Head = i.HairRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Hair { set { Parts.ForEach(i => i.Hair = i.HairRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Beard { set { Parts.ForEach(i => { if (i.BeardRenderer) i.Beard = i.BeardRenderer.GetComponent<SpriteMapping>().FindSprite(value); }); } }
public List<Sprite> Ears { set { Parts.ForEach(i => i.Ears = value.ToList()); } }
public List<Sprite> Eyebrows { set { PartsExceptBack.ForEach(i => i.Expressions[0].Eyebrows = i.EyebrowsRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Eyes { set { PartsExceptBack.ForEach(i => i.Expressions[0].Eyes = i.EyesRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Mouth { set { PartsExceptBack.ForEach(i => i.Expressions[0].Mouth = i.MouthRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Helmet { set { Parts.ForEach(i => i.Helmet = i.HelmetRenderer.GetComponent<SpriteMapping>().FindSprite(value)); } }
public List<Sprite> Armor { set { Parts.ForEach(i => i.Armor = value.ToList()); } }
public Sprite PrimaryWeapon { set { Parts.ForEach(i => i.PrimaryWeapon = value); } }
public Sprite SecondaryWeapon { set { Parts.ForEach(i => i.SecondaryWeapon = value); } }
public List<Sprite> Shield { set { Parts.ForEach(i => i.Shield = value.ToList()); } }
public List<Sprite> CompositeWeapon { set { Parts.ForEach(i => i.CompositeWeapon = value.ToList()); } }
public List<Sprite> Makeup { set { Parts.ForEach(i => { if (i.MakeupRenderer) i.Makeup = i.MakeupRenderer.GetComponent<SpriteMapping>().FindSprite(value); }); } }
public List<Sprite> Mask { set { Parts.ForEach(i => { if (i.MaskRenderer) i.Mask = i.MaskRenderer.GetComponent<SpriteMapping>().FindSprite(value); }); } }
public List<Sprite> Earrings { set { Parts.ForEach(i => i.Earrings = value.ToList()); } }
public WeaponType WeaponType { get => Front.WeaponType; set { Parts.ForEach(i => i.WeaponType = value); } }
public void OnValidate()
{
Parts = new List<Character> { Front, Back, Left, Right };
Parts.ForEach(i => i.BodyRenderers.ForEach(j => j.color = BodyColor));
Parts.ForEach(i => i.EarsRenderers.ForEach(j => j.color = BodyColor));
}
public void Start()
{
var stateHandler = Animator.GetBehaviours<StateHandler>().SingleOrDefault(i => i.Name == "Death");
if (stateHandler != null)
{
stateHandler.StateExit.AddListener(() => SetExpression("Default"));
}
Animator.keepAnimatorStateOnDisable = true;
//Animator.keepAnimatorControllerStateOnDisable = true;
}
public void Initialize()
{
Parts.ForEach(i => i.Initialize());
}
public void SetBody(ItemSprite item, BodyPart part)
{
Parts.ForEach(i => i.SetBody(item, part));
}
public void SetBody(ItemSprite item, BodyPart part, Color? color)
{
Parts.ForEach(i => i.SetBody(item, part, color));
}
public void SetExpression(string expression)
{
Parts.ForEach(i => i.SetExpression(expression));
}
public void Equip(ItemSprite item, EquipmentPart part)
{
Parts.ForEach(i => i.Equip(item, part));
UpdateWeaponType(part);
}
public void Equip(ItemSprite item, EquipmentPart part, Color? color)
{
Parts.ForEach(i => i.Equip(item, part, color));
UpdateWeaponType(part);
}
private void UpdateWeaponType(EquipmentPart part)
{
switch (part)
{
case EquipmentPart.MeleeWeapon1H: Animator.SetInteger("WeaponType", (int) WeaponType.Melee1H); break;
case EquipmentPart.MeleeWeapon2H: Animator.SetInteger("WeaponType", (int) WeaponType.Melee2H); break;
case EquipmentPart.Bow: Animator.SetInteger("WeaponType", (int) WeaponType.Bow); break;
case EquipmentPart.Crossbow: Animator.SetInteger("WeaponType", (int) WeaponType.Crossbow); break;
case EquipmentPart.Firearm1H: Animator.SetInteger("WeaponType", (int) WeaponType.Firearm1H); break;
case EquipmentPart.Firearm2H: Animator.SetInteger("WeaponType", (int) WeaponType.Firearm2H); break;
case EquipmentPart.SecondaryFirearm1H: Animator.SetInteger("WeaponType", (int) WeaponType.Paired); break;
}
}
public void UnEquip(EquipmentPart part)
{
Parts.ForEach(i => i.UnEquip(part));
}
public void ResetEquipment()
{
Parts.ForEach(i => i.ResetEquipment());
Animator.SetInteger("WeaponType", (int)WeaponType.Melee1H);
}
public Vector2 Direction { get; private set; }
public Character Active { get; private set; }
public void SetDirection(Vector2 direction)
{
if (Direction == direction) return;
Direction = direction;
if (Direction == Vector2.zero)
{
Parts.ForEach(i => i.SetActive(true));
Shadows.ForEach(i => i.SetActive(true));
Parts[0].transform.localPosition = Shadows[0].transform.localPosition = new Vector3(0, -1.25f);
Parts[1].transform.localPosition = Shadows[1].transform.localPosition = new Vector3(0, 1.25f);
Parts[2].transform.localPosition = Shadows[2].transform.localPosition = new Vector3(-1.5f, 0);
Parts[3].transform.localPosition = Shadows[3].transform.localPosition = new Vector3(1.5f, 0);
return;
}
Parts.ForEach(i => i.transform.localPosition = Vector3.zero);
Shadows.ForEach(i => i.transform.localPosition = Vector3.zero);
int index;
if (direction == Vector2.left)
{
index = 2;
}
else if (direction == Vector2.right)
{
index = 3;
}
else if (direction == Vector2.up)
{
index = 1;
}
else if (direction == Vector2.down)
{
index = 0;
}
else
{
throw new NotSupportedException();
}
for (var i = 0; i < Parts.Count; i++)
{
Parts[i].SetActive(i == index);
Shadows[i].SetActive(i == index);
}
Active = Parts[index];
}
public void CopyFrom(Character4D character)
{
for (var i = 0; i < Parts.Count; i++)
{
Parts[i].CopyFrom(character.Parts[i]);
Parts[i].WeaponType = character.Parts[i].WeaponType;
Parts[i].HideEars = character.Parts[i].HideEars;
Parts[i].CropHair = character.Parts[i].CropHair;
Parts[i].AnchorFireMuzzle.localPosition = character.Parts[i].AnchorFireMuzzle.localPosition;
}
Animator.SetInteger("WeaponType", (int) character.WeaponType);
}
public string ToJson()
{
return Front.ToJson();
}
public void FromJson(string json, bool silent)
{
Parts.ForEach(i => i.LoadFromJson(json, silent));
Animator.SetInteger("WeaponType", (int) Parts[0].WeaponType);
}
#region Setup Examples
public void Equip(Item item)
{
var itemParams = ItemCollection.Active.GetItemParams(item);
switch (itemParams.Type)
{
case ItemType.Helmet: EquipHelmet(item); break;
case ItemType.Armor: EquipArmor(item); break;
case ItemType.Vest: EquipVest(item); break;
case ItemType.Bracers: EquipBracers(item); break;
case ItemType.Leggings: EquipLeggings(item); break;
case ItemType.Shield: EquipShield(item); break;
case ItemType.Weapon:
{
switch (itemParams.Class)
{
case ItemClass.Bow: EquipBow(item); break;
case ItemClass.Firearm: EquipSecondaryFirearm(item); break;
default:
if (itemParams.Tags.Contains(ItemTag.TwoHanded))
{
EquipMeleeWeapon2H(item);
}
else
{
EquipMeleeWeapon1H(item);
}
break;
}
break;
}
}
}
public void EquipSecondaryMelee1H(Item item)
{
Equip(SpriteCollection.MeleeWeapon1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.SecondaryMelee1H);
}
public void EquipArmor(Item item)
{
if (item == null) UnEquip(EquipmentPart.Armor);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Armor);
}
public void EquipHelmet(Item item)
{
if (item == null) UnEquip(EquipmentPart.Helmet);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Helmet);
}
public void EquipVest(Item item)
{
if (item == null) UnEquip(EquipmentPart.Vest);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Vest);
}
public void EquipBracers(Item item)
{
if (item == null) UnEquip(EquipmentPart.Bracers);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Bracers);
}
public void EquipLeggings(Item item)
{
if (item == null) UnEquip(EquipmentPart.Leggings);
else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Leggings);
}
public void EquipShield(Item item)
{
Equip(SpriteCollection.Shield.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Shield);
}
public void EquipMeleeWeapon1H(Item item)
{
Equip(SpriteCollection.MeleeWeapon1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.MeleeWeapon1H);
}
public void EquipMeleeWeapon2H(Item item)
{
Equip(SpriteCollection.MeleeWeapon2H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.MeleeWeapon2H);
}
public void EquipBow(Item item)
{
Equip(SpriteCollection.Bow.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Bow);
}
public void EquipCrossbow(Item item)
{
Equip(SpriteCollection.Crossbow.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Crossbow);
}
public void EquipSecondaryFirearm(Item item)
{
Equip(SpriteCollection.Firearm1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.SecondaryFirearm1H);
}
#endregion
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: c59db8c0956305f4da157acaa6dddae5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: c59db8c0956305f4da157acaa6dddae5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,101 +1,101 @@
using System;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
[Serializable]
public class CharacterAppearance
{
public string Hair = "Common.Basic.Hair.BuzzCut";
public string Beard = null;
public string Ears = "Common.Basic.Ears.Human";
public string Eyebrows = "Common.Basic.Eyebrows.Default";
public string Eyes = "Common.Basic.Eyes.Boy";
public string Mouth = "Common.Basic.Mouth.Default";
public string Body = "Common.Basic.Body.HumanPants";
public string Underwear = "Common.Underwear.Armor.MaleUnderwear";
public Color32 HairColor = new Color32(150, 50, 0, 255);
public Color32 BeardColor = new Color32(150, 50, 0, 255);
public Color32 EyesColor = new Color32(0, 200, 255, 255);
public Color32 BodyColor = new Color32(255, 200, 120, 255);
public Color32 UnderwearColor = new Color32(120, 100, 80, 255);
public bool ShowHelmet = true;
public int Type;
public void Setup(Character4D character)
{
character.Parts.ForEach(i => Setup(i));
}
public void Setup(Character character, bool initialize = true)
{
var hair = Hair.IsEmpty() ? null : character.SpriteCollection.Hair.Single(i => i.Id == Hair);
character.Hair = hair == null ? null : character.HairRenderer.GetComponent<SpriteMapping>().FindSprite(hair.Sprites);
character.HairRenderer.color = hair != null && hair.Tags.Contains("NoPaint") ? (Color32) Color.white : HairColor;
if (character.BeardRenderer)
{
var beard = Beard.IsEmpty() ? null : character.SpriteCollection.Beard.Single(i => i.Id == Beard);
character.Beard = beard == null ? null : character.BeardRenderer.GetComponent<SpriteMapping>().FindSprite(beard.Sprites);
character.BeardRenderer.color = BeardColor;
}
character.Ears = Ears.IsEmpty() ? null : character.SpriteCollection.Ears.FindSprites(Ears);
character.EarsRenderers.ForEach(i => i.color = BodyColor);
if (character.Expressions.Count > 0)
{
character.Expressions[0] = new Expression { Name = "Default" };
if (character.name != "Back")
{
character.Expressions[0].Eyebrows = Eyebrows.IsEmpty() ? null : character.EyebrowsRenderer.GetComponent<SpriteMapping>().FindSprite(character.SpriteCollection.Eyebrows.FindSprites(Eyebrows));
character.Expressions[0].Eyes = character.EyesRenderer.GetComponent<SpriteMapping>().FindSprite(character.SpriteCollection.Eyes.FindSprites(Eyes));
character.Expressions[0].Mouth = character.MouthRenderer.GetComponent<SpriteMapping>().FindSprite(character.SpriteCollection.Mouth.FindSprites(Mouth));
}
foreach (var expression in character.Expressions)
{
if (expression.Name != "Dead") expression.EyesColor = EyesColor;
}
}
if (character.EyesRenderer != null)
{
character.EyesRenderer.color = EyesColor;
}
var body = character.SpriteCollection.Body.Single(i => i.Id == Body);
character.Body = body.Sprites.ToList();
character.BodyRenderers.ForEach(i => i.color = BodyColor);
character.Head = character.HeadRenderer.GetComponent<SpriteMapping>().FindSprite(body.Sprites);
character.HeadRenderer.color = BodyColor;
if (body.Tags.Contains("NoMouth"))
{
character.Expressions.ForEach(i => i.Mouth = null);
}
if (initialize) character.Initialize();
}
public string ToJson()
{
return JsonUtility.ToJson(this);
}
public static CharacterAppearance FromJson(string json)
{
return JsonUtility.FromJson<CharacterAppearance>(json);
}
}
using System;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
[Serializable]
public class CharacterAppearance
{
public string Hair = "Common.Basic.Hair.BuzzCut";
public string Beard = null;
public string Ears = "Common.Basic.Ears.Human";
public string Eyebrows = "Common.Basic.Eyebrows.Default";
public string Eyes = "Common.Basic.Eyes.Boy";
public string Mouth = "Common.Basic.Mouth.Default";
public string Body = "Common.Basic.Body.HumanPants";
public string Underwear = "Common.Underwear.Armor.MaleUnderwear";
public Color32 HairColor = new Color32(150, 50, 0, 255);
public Color32 BeardColor = new Color32(150, 50, 0, 255);
public Color32 EyesColor = new Color32(0, 200, 255, 255);
public Color32 BodyColor = new Color32(255, 200, 120, 255);
public Color32 UnderwearColor = new Color32(120, 100, 80, 255);
public bool ShowHelmet = true;
public int Type;
public void Setup(Character4D character)
{
character.Parts.ForEach(i => Setup(i));
}
public void Setup(Character character, bool initialize = true)
{
var hair = Hair.IsEmpty() ? null : character.SpriteCollection.Hair.Single(i => i.Id == Hair);
character.Hair = hair == null ? null : character.HairRenderer.GetComponent<SpriteMapping>().FindSprite(hair.Sprites);
character.HairRenderer.color = hair != null && hair.Tags.Contains("NoPaint") ? (Color32) Color.white : HairColor;
if (character.BeardRenderer)
{
var beard = Beard.IsEmpty() ? null : character.SpriteCollection.Beard.Single(i => i.Id == Beard);
character.Beard = beard == null ? null : character.BeardRenderer.GetComponent<SpriteMapping>().FindSprite(beard.Sprites);
character.BeardRenderer.color = BeardColor;
}
character.Ears = Ears.IsEmpty() ? null : character.SpriteCollection.Ears.FindSprites(Ears);
character.EarsRenderers.ForEach(i => i.color = BodyColor);
if (character.Expressions.Count > 0)
{
character.Expressions[0] = new Expression { Name = "Default" };
if (character.name != "Back")
{
character.Expressions[0].Eyebrows = Eyebrows.IsEmpty() ? null : character.EyebrowsRenderer.GetComponent<SpriteMapping>().FindSprite(character.SpriteCollection.Eyebrows.FindSprites(Eyebrows));
character.Expressions[0].Eyes = character.EyesRenderer.GetComponent<SpriteMapping>().FindSprite(character.SpriteCollection.Eyes.FindSprites(Eyes));
character.Expressions[0].Mouth = character.MouthRenderer.GetComponent<SpriteMapping>().FindSprite(character.SpriteCollection.Mouth.FindSprites(Mouth));
}
foreach (var expression in character.Expressions)
{
if (expression.Name != "Dead") expression.EyesColor = EyesColor;
}
}
if (character.EyesRenderer != null)
{
character.EyesRenderer.color = EyesColor;
}
var body = character.SpriteCollection.Body.Single(i => i.Id == Body);
character.Body = body.Sprites.ToList();
character.BodyRenderers.ForEach(i => i.color = BodyColor);
character.Head = character.HeadRenderer.GetComponent<SpriteMapping>().FindSprite(body.Sprites);
character.HeadRenderer.color = BodyColor;
if (body.Tags.Contains("NoMouth"))
{
character.Expressions.ForEach(i => i.Mouth = null);
}
if (initialize) character.Initialize();
}
public string ToJson()
{
return JsonUtility.ToJson(this);
}
public static CharacterAppearance FromJson(string json)
{
return JsonUtility.FromJson<CharacterAppearance>(json);
}
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: 458fca9eac3f0cb4db340a06f5f54a46
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 458fca9eac3f0cb4db340a06f5f54a46
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,50 +1,50 @@
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// You can extend 'Character' class here.
/// </summary>
public static class CharacterExtensions
{
public static Color RandomColor => new Color(Random.Range(0, 1f), Random.Range(0, 1f), Random.Range(0, 1f), 1f);
public static void Randomize(this Character4D character)
{
character.ResetEquipment();
character.SetBody(character.Front.SpriteCollection.Eyes.Random(), BodyPart.Eyes);
if (character.Front.SpriteCollection.Hair.Count > 0) character.SetBody(character.Front.SpriteCollection.Hair.Random(), BodyPart.Hair, RandomColor);
if (character.Front.SpriteCollection.Eyebrows.Count > 0) character.SetBody(character.Front.SpriteCollection.Eyebrows.Random(), BodyPart.Eyebrows);
if (character.Front.SpriteCollection.Eyes.Count > 0) character.SetBody(character.Front.SpriteCollection.Eyes.Random(), BodyPart.Eyes, RandomColor);
if (character.Front.SpriteCollection.Ears.Count > 0) character.SetBody(character.Front.SpriteCollection.Ears.Random(), BodyPart.Ears);
if (character.Front.SpriteCollection.Mouth.Count > 0) character.SetBody(character.Front.SpriteCollection.Mouth.Random(), BodyPart.Mouth);
character.Equip(character.Front.SpriteCollection.Armor.Random(), EquipmentPart.Helmet);
character.Equip(character.Front.SpriteCollection.Armor.Random(), EquipmentPart.Armor);
switch (Random.Range(0, 5))
{
case 0:
character.Equip(character.Front.SpriteCollection.MeleeWeapon1H.Random(), EquipmentPart.MeleeWeapon1H);
character.UnEquip(EquipmentPart.Shield);
break;
case 1:
character.Equip(character.Front.SpriteCollection.MeleeWeapon1H.Random(), EquipmentPart.MeleeWeapon1H);
character.Equip(character.Front.SpriteCollection.Shield.Random(), EquipmentPart.Shield);
break;
case 2:
character.Equip(character.Front.SpriteCollection.MeleeWeapon2H.Random(), EquipmentPart.MeleeWeapon2H);
break;
case 3:
character.Equip(character.Front.SpriteCollection.Bow.Random(), EquipmentPart.Bow);
break;
case 4:
character.Equip(character.Front.SpriteCollection.Firearm1H.Random(), EquipmentPart.SecondaryFirearm1H);
break;
}
}
}
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// You can extend 'Character' class here.
/// </summary>
public static class CharacterExtensions
{
public static Color RandomColor => new Color(Random.Range(0, 1f), Random.Range(0, 1f), Random.Range(0, 1f), 1f);
public static void Randomize(this Character4D character)
{
character.ResetEquipment();
character.SetBody(character.Front.SpriteCollection.Eyes.Random(), BodyPart.Eyes);
if (character.Front.SpriteCollection.Hair.Count > 0) character.SetBody(character.Front.SpriteCollection.Hair.Random(), BodyPart.Hair, RandomColor);
if (character.Front.SpriteCollection.Eyebrows.Count > 0) character.SetBody(character.Front.SpriteCollection.Eyebrows.Random(), BodyPart.Eyebrows);
if (character.Front.SpriteCollection.Eyes.Count > 0) character.SetBody(character.Front.SpriteCollection.Eyes.Random(), BodyPart.Eyes, RandomColor);
if (character.Front.SpriteCollection.Ears.Count > 0) character.SetBody(character.Front.SpriteCollection.Ears.Random(), BodyPart.Ears);
if (character.Front.SpriteCollection.Mouth.Count > 0) character.SetBody(character.Front.SpriteCollection.Mouth.Random(), BodyPart.Mouth);
character.Equip(character.Front.SpriteCollection.Armor.Random(), EquipmentPart.Helmet);
character.Equip(character.Front.SpriteCollection.Armor.Random(), EquipmentPart.Armor);
switch (Random.Range(0, 5))
{
case 0:
character.Equip(character.Front.SpriteCollection.MeleeWeapon1H.Random(), EquipmentPart.MeleeWeapon1H);
character.UnEquip(EquipmentPart.Shield);
break;
case 1:
character.Equip(character.Front.SpriteCollection.MeleeWeapon1H.Random(), EquipmentPart.MeleeWeapon1H);
character.Equip(character.Front.SpriteCollection.Shield.Random(), EquipmentPart.Shield);
break;
case 2:
character.Equip(character.Front.SpriteCollection.MeleeWeapon2H.Random(), EquipmentPart.MeleeWeapon2H);
break;
case 3:
character.Equip(character.Front.SpriteCollection.Bow.Random(), EquipmentPart.Bow);
break;
case 4:
character.Equip(character.Front.SpriteCollection.Firearm1H.Random(), EquipmentPart.SecondaryFirearm1H);
break;
}
}
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: f3a7bd578cef65e4fac05a9cba79c9b1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: f3a7bd578cef65e4fac05a9cba79c9b1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,306 +1,306 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Data;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using Newtonsoft.Json;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
public partial class Character
{
public string ToJson()
{
if (SpriteCollection == null) throw new Exception("SpriteCollection is null!");
var description = new Dictionary<string, string>
{
{ "Body", SpriteToString(SpriteCollection.Body, BodyRenderers[0]) },
{ "Ears", SpriteToString(SpriteCollection.Ears, EarsRenderers[0]) },
{ "Hair", SpriteToString(SpriteCollection.Hair, HairRenderer) },
{ "Beard", SpriteToString(SpriteCollection.Beard, BeardRenderer) },
{ "Helmet", SpriteToString(SpriteCollection.Armor, HelmetRenderer) },
{ "Armor", SpritesToString(SpriteCollection.Armor, ArmorRenderers) },
//{ "Cape", SpriteToString(SpriteCollection.Cape, CapeRenderer) },
{ "Backpack", SpriteToString(SpriteCollection.Backpack, BackpackRenderer) },
{ "Shield", SpriteToString(SpriteCollection.Shield, ShieldRenderers[0]) },
{ "WeaponType", WeaponType.ToString() },
{ "Expression", Expression },
{ "HideEars", HideEars.ToString() },
{ "CropHair", CropHair.ToString() },
{ "Makeup", SpriteToString(SpriteCollection.Makeup, MakeupRenderer) },
{ "Mask", SpriteToString(SpriteCollection.Mask, MaskRenderer) },
{ "Earrings", SpriteToString(SpriteCollection.Earrings, EarringsRenderers[0]) }
};
switch (WeaponType)
{
case WeaponType.Melee1H:
case WeaponType.Melee2H:
case WeaponType.Firearm1H:
case WeaponType.Firearm2H:
description.Add("PrimaryWeapon", SpriteToString(GetWeaponCollection(WeaponType), PrimaryWeaponRenderer));
break;
case WeaponType.Paired:
description.Add("SecondaryWeapon", SpriteToString(SpriteCollection.Firearm1H, SecondaryWeaponRenderer)); // TODO:
break;
case WeaponType.Bow:
description.Add("Bow", SpriteToString(SpriteCollection.Bow, BowRenderers[0]));
break;
case WeaponType.Crossbow:
description.Add("Crossbow", SpriteToString(SpriteCollection.Crossbow, CrossbowRenderers[0]));
break;
default:
throw new NotImplementedException();
}
foreach (var expression in Expressions)
{
description.Add($"Expression.{expression.Name}.Eyebrows", SpriteToString(SpriteCollection.Eyebrows, expression.Eyebrows, EyebrowsRenderer.color));
description.Add($"Expression.{expression.Name}.Eyes", SpriteToString(SpriteCollection.Eyes, expression.Eyes, EyesRenderer.color));
description.Add($"Expression.{expression.Name}.EyesColor", "#" + ColorUtility.ToHtmlStringRGBA(expression.EyesColor));
description.Add($"Expression.{expression.Name}.Mouth", SpriteToString(SpriteCollection.Mouth, expression.Mouth, MouthRenderer.color));
}
return JsonConvert.SerializeObject(description);
}
public void LoadFromJson(string json, bool silent)
{
var description = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
if (SpriteCollection == null) throw new Exception("SpriteCollection is null!");
RestoreFromString(ref Body, BodyRenderers, SpriteCollection.Body, description["Body"], silent);
RestoreFromString(ref Head, HeadRenderer, SpriteCollection.Body, description["Body"], silent);
RestoreFromString(ref Ears, EarsRenderers, SpriteCollection.Ears, description["Ears"], silent);
RestoreFromString(ref Hair, HairRenderer, SpriteCollection.Hair, description["Hair"], silent);
RestoreFromString(ref Beard, BeardRenderer, SpriteCollection.Beard, description["Beard"], silent);
RestoreFromString(ref Helmet, HelmetRenderer, SpriteCollection.Armor, description["Helmet"], silent);
RestoreFromString(ref Armor, ArmorRenderers, SpriteCollection.Armor, description["Armor"], silent);
//RestoreFromString(ref Cape, CapeRenderer, SpriteCollection.Cape, description["Cape"], silent);
//RestoreFromString(ref Quiver, QuiverRenderer, SpriteCollection.Bow.Union(SpriteCollection.Crossbow), description["Quiver"], silent);
RestoreFromString(ref Backpack, BackpackRenderer, SpriteCollection.Backpack, description["Backpack"], silent);
RestoreFromString(ref Shield, ShieldRenderers, SpriteCollection.Shield, description["Shield"], silent);
Expression = description["Expression"];
Expressions = new List<Expression>();
HideEars = description.ContainsKey("HideEars") && bool.Parse(description["HideEars"]);
CropHair = description.ContainsKey("HideHair") && bool.Parse(description["CropHair"]);
RestoreFromString(ref Makeup, MakeupRenderer, SpriteCollection.Makeup, description["Makeup"], silent);
RestoreFromString(ref Mask, MaskRenderer, SpriteCollection.Mask, description["Mask"], silent);
RestoreFromString(ref Earrings, EarringsRenderers, SpriteCollection.Earrings, description["Earrings"], silent);
foreach (var key in description.Keys)
{
if (key.Contains("Expression."))
{
var parts = key.Split('.');
var expressionName = parts[1];
var expressionPart = parts[2];
var expression = Expressions.SingleOrDefault(i => i.Name == expressionName);
if (expression == null)
{
expression = new Expression { Name = expressionName };
Expressions.Add(expression);
}
switch (expressionPart)
{
case "Eyebrows":
RestoreFromString(ref expression.Eyebrows, EyebrowsRenderer, SpriteCollection.Eyebrows, description[key]);
break;
case "Eyes":
RestoreFromString(ref expression.Eyes, EyesRenderer, SpriteCollection.Eyes, description[key]);
break;
case "EyesColor":
ColorUtility.TryParseHtmlString(description[key], out var color);
expression.EyesColor = color;
break;
case "Mouth":
RestoreFromString(ref expression.Mouth, MouthRenderer, SpriteCollection.Mouth, description[key]);
break;
default:
throw new NotSupportedException(expressionPart);
}
}
}
SetExpression("Default");
WeaponType = (WeaponType) Enum.Parse(typeof(WeaponType), description["WeaponType"], silent);
if (description.ContainsKey("PrimaryWeapon"))
{
var weapon = RestoreFromString(ref PrimaryWeapon, PrimaryWeaponRenderer, GetWeaponCollection(WeaponType), description["PrimaryWeapon"], silent);
if (weapon != null && (WeaponType == WeaponType.Firearm1H || WeaponType == WeaponType.Firearm2H))
{
SetFirearmMuzzle(weapon);
}
}
if (description.ContainsKey("SecondaryWeapon"))
{
RestoreFromString(ref SecondaryWeapon, SecondaryWeaponRenderer, SpriteCollection.Firearm1H, description["SecondaryWeapon"], silent);
}
if (description.ContainsKey("Bow"))
{
RestoreFromString(ref CompositeWeapon, BowRenderers, SpriteCollection.Bow, description["Bow"], silent);
}
else if (description.ContainsKey("Crossbow"))
{
RestoreFromString(ref CompositeWeapon, CrossbowRenderers, SpriteCollection.Crossbow, description["Crossbow"], silent);
}
Initialize();
}
private IEnumerable<ItemSprite> GetWeaponCollection(WeaponType weaponType)
{
switch (weaponType)
{
case WeaponType.Melee1H: return SpriteCollection.MeleeWeapon1H;
case WeaponType.Paired: return SpriteCollection.MeleeWeapon1H;
case WeaponType.Melee2H: return SpriteCollection.MeleeWeapon2H;
case WeaponType.Bow: return SpriteCollection.Bow;
case WeaponType.Crossbow: return SpriteCollection.Crossbow;
case WeaponType.Firearm1H: return SpriteCollection.Firearm1H;
case WeaponType.Firearm2H: return SpriteCollection.Firearm2H;
case WeaponType.Throwable: return SpriteCollection.Throwable;
default:
throw new NotSupportedException(weaponType.ToString());
}
}
private static string SpriteToString(IEnumerable<ItemSprite> collection, SpriteRenderer renderer)
{
if (renderer == null) return null;
return SpriteToString(collection, renderer.sprite, renderer.color);
}
private static string SpritesToString(IEnumerable<ItemSprite> collection, List<SpriteRenderer> renderers)
{
var values = renderers.Select(i => SpriteToString(collection, i));
return string.Join(",", values);
}
private static string SpriteToString(IEnumerable<ItemSprite> collection, Sprite sprite, Color color)
{
if (sprite == null) return null;
var entry = collection.SingleOrDefault(i => i.Sprite == sprite || i.Sprites.Any(j => j == sprite));
if (entry == null)
{
throw new Exception($"Can't find {sprite.name} in SpriteCollection.");
}
var result = color == Color.white ? entry.Id : entry.Id + "#" + ColorUtility.ToHtmlStringRGBA(color);
return result;
}
private ItemSprite RestoreFromString(ref Sprite sprite, SpriteRenderer renderer, IEnumerable<ItemSprite> collection, string serialized, bool silent = false)
{
if (renderer == null) return null;
if (string.IsNullOrEmpty(serialized))
{
sprite = renderer.sprite = null;
return null;
}
var parts = serialized.Split('#');
var id = parts[0];
var color = Color.white;
if (parts.Length > 1)
{
ColorUtility.TryParseHtmlString("#" + parts[1], out color);
}
var entries = collection.Where(i => i.Id == id).ToList();
switch (entries.Count)
{
case 1:
sprite = renderer.sprite = entries[0].Sprites.Count == 1 ? entries[0].Sprites[0] : renderer.GetComponent<SpriteMapping>().FindSprite(entries[0].Sprites);
renderer.color = color;
return entries[0];
case 0:
if (silent) Debug.LogWarning("entries.Count = " + entries.Count); else throw new Exception($"Entry with id {id} not found in SpriteCollection."); return null;
default:
if (silent) Debug.LogWarning("entries.Count = " + entries.Count); else throw new Exception($"Multiple entries with id {id} found in SpriteCollection."); return null;
}
}
private static void RestoreFromString(ref List<Sprite> sprites, List<SpriteRenderer> renderers, List<ItemSprite> collection, string serialized, bool silent = false)
{
if (string.IsNullOrEmpty(serialized))
{
sprites = new List<Sprite>();
foreach (var renderer in renderers)
{
renderer.sprite = null;
}
return;
}
sprites = new List<Sprite>();
var values = serialized.Split(',');
for (var i = 0; i < values.Length; i++)
{
if (values[i] == "") continue;
var match = Regex.Match(values[i], @"(?<Id>[\w\. \[\]]+)(?<Color>#\w+)*");
var id = match.Groups["Id"].Value;
var color = Color.white;
if (match.Groups["Color"].Success)
{
ColorUtility.TryParseHtmlString(match.Groups["Color"].Value, out color);
}
var entries = collection.Where(i => i.Id == id).ToList();
switch (entries.Count)
{
case 1:
if (values.Length == 1)
{
sprites = entries[0].Sprites.ToList();
renderers.ForEach(j => j.color = color);
}
else
{
var sprite = renderers[i].GetComponent<SpriteMapping>().FindSprite(entries[0].Sprites);
if (!sprites.Contains(sprite))
{
sprites.Add(sprite);
}
renderers[i].color = color;
}
break;
case 0:
if (silent) Debug.LogWarning("entries.Count = " + entries.Count); else throw new Exception($"Entry with id {id} not found in SpriteCollection."); break;
default:
if (silent) Debug.LogWarning("entries.Count = " + entries.Count); else throw new Exception($"Multiple entries with id {id} found in SpriteCollection."); break;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Data;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using Newtonsoft.Json;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
public partial class Character
{
public string ToJson()
{
if (SpriteCollection == null) throw new Exception("SpriteCollection is null!");
var description = new Dictionary<string, string>
{
{ "Body", SpriteToString(SpriteCollection.Body, BodyRenderers[0]) },
{ "Ears", SpriteToString(SpriteCollection.Ears, EarsRenderers[0]) },
{ "Hair", SpriteToString(SpriteCollection.Hair, HairRenderer) },
{ "Beard", SpriteToString(SpriteCollection.Beard, BeardRenderer) },
{ "Helmet", SpriteToString(SpriteCollection.Armor, HelmetRenderer) },
{ "Armor", SpritesToString(SpriteCollection.Armor, ArmorRenderers) },
//{ "Cape", SpriteToString(SpriteCollection.Cape, CapeRenderer) },
{ "Backpack", SpriteToString(SpriteCollection.Backpack, BackpackRenderer) },
{ "Shield", SpriteToString(SpriteCollection.Shield, ShieldRenderers[0]) },
{ "WeaponType", WeaponType.ToString() },
{ "Expression", Expression },
{ "HideEars", HideEars.ToString() },
{ "CropHair", CropHair.ToString() },
{ "Makeup", SpriteToString(SpriteCollection.Makeup, MakeupRenderer) },
{ "Mask", SpriteToString(SpriteCollection.Mask, MaskRenderer) },
{ "Earrings", SpriteToString(SpriteCollection.Earrings, EarringsRenderers[0]) }
};
switch (WeaponType)
{
case WeaponType.Melee1H:
case WeaponType.Melee2H:
case WeaponType.Firearm1H:
case WeaponType.Firearm2H:
description.Add("PrimaryWeapon", SpriteToString(GetWeaponCollection(WeaponType), PrimaryWeaponRenderer));
break;
case WeaponType.Paired:
description.Add("SecondaryWeapon", SpriteToString(SpriteCollection.Firearm1H, SecondaryWeaponRenderer)); // TODO:
break;
case WeaponType.Bow:
description.Add("Bow", SpriteToString(SpriteCollection.Bow, BowRenderers[0]));
break;
case WeaponType.Crossbow:
description.Add("Crossbow", SpriteToString(SpriteCollection.Crossbow, CrossbowRenderers[0]));
break;
default:
throw new NotImplementedException();
}
foreach (var expression in Expressions)
{
description.Add($"Expression.{expression.Name}.Eyebrows", SpriteToString(SpriteCollection.Eyebrows, expression.Eyebrows, EyebrowsRenderer.color));
description.Add($"Expression.{expression.Name}.Eyes", SpriteToString(SpriteCollection.Eyes, expression.Eyes, EyesRenderer.color));
description.Add($"Expression.{expression.Name}.EyesColor", "#" + ColorUtility.ToHtmlStringRGBA(expression.EyesColor));
description.Add($"Expression.{expression.Name}.Mouth", SpriteToString(SpriteCollection.Mouth, expression.Mouth, MouthRenderer.color));
}
return JsonConvert.SerializeObject(description);
}
public void LoadFromJson(string json, bool silent)
{
var description = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
if (SpriteCollection == null) throw new Exception("SpriteCollection is null!");
RestoreFromString(ref Body, BodyRenderers, SpriteCollection.Body, description["Body"], silent);
RestoreFromString(ref Head, HeadRenderer, SpriteCollection.Body, description["Body"], silent);
RestoreFromString(ref Ears, EarsRenderers, SpriteCollection.Ears, description["Ears"], silent);
RestoreFromString(ref Hair, HairRenderer, SpriteCollection.Hair, description["Hair"], silent);
RestoreFromString(ref Beard, BeardRenderer, SpriteCollection.Beard, description["Beard"], silent);
RestoreFromString(ref Helmet, HelmetRenderer, SpriteCollection.Armor, description["Helmet"], silent);
RestoreFromString(ref Armor, ArmorRenderers, SpriteCollection.Armor, description["Armor"], silent);
//RestoreFromString(ref Cape, CapeRenderer, SpriteCollection.Cape, description["Cape"], silent);
//RestoreFromString(ref Quiver, QuiverRenderer, SpriteCollection.Bow.Union(SpriteCollection.Crossbow), description["Quiver"], silent);
RestoreFromString(ref Backpack, BackpackRenderer, SpriteCollection.Backpack, description["Backpack"], silent);
RestoreFromString(ref Shield, ShieldRenderers, SpriteCollection.Shield, description["Shield"], silent);
Expression = description["Expression"];
Expressions = new List<Expression>();
HideEars = description.ContainsKey("HideEars") && bool.Parse(description["HideEars"]);
CropHair = description.ContainsKey("HideHair") && bool.Parse(description["CropHair"]);
RestoreFromString(ref Makeup, MakeupRenderer, SpriteCollection.Makeup, description["Makeup"], silent);
RestoreFromString(ref Mask, MaskRenderer, SpriteCollection.Mask, description["Mask"], silent);
RestoreFromString(ref Earrings, EarringsRenderers, SpriteCollection.Earrings, description["Earrings"], silent);
foreach (var key in description.Keys)
{
if (key.Contains("Expression."))
{
var parts = key.Split('.');
var expressionName = parts[1];
var expressionPart = parts[2];
var expression = Expressions.SingleOrDefault(i => i.Name == expressionName);
if (expression == null)
{
expression = new Expression { Name = expressionName };
Expressions.Add(expression);
}
switch (expressionPart)
{
case "Eyebrows":
RestoreFromString(ref expression.Eyebrows, EyebrowsRenderer, SpriteCollection.Eyebrows, description[key]);
break;
case "Eyes":
RestoreFromString(ref expression.Eyes, EyesRenderer, SpriteCollection.Eyes, description[key]);
break;
case "EyesColor":
ColorUtility.TryParseHtmlString(description[key], out var color);
expression.EyesColor = color;
break;
case "Mouth":
RestoreFromString(ref expression.Mouth, MouthRenderer, SpriteCollection.Mouth, description[key]);
break;
default:
throw new NotSupportedException(expressionPart);
}
}
}
SetExpression("Default");
WeaponType = (WeaponType) Enum.Parse(typeof(WeaponType), description["WeaponType"], silent);
if (description.ContainsKey("PrimaryWeapon"))
{
var weapon = RestoreFromString(ref PrimaryWeapon, PrimaryWeaponRenderer, GetWeaponCollection(WeaponType), description["PrimaryWeapon"], silent);
if (weapon != null && (WeaponType == WeaponType.Firearm1H || WeaponType == WeaponType.Firearm2H))
{
SetFirearmMuzzle(weapon);
}
}
if (description.ContainsKey("SecondaryWeapon"))
{
RestoreFromString(ref SecondaryWeapon, SecondaryWeaponRenderer, SpriteCollection.Firearm1H, description["SecondaryWeapon"], silent);
}
if (description.ContainsKey("Bow"))
{
RestoreFromString(ref CompositeWeapon, BowRenderers, SpriteCollection.Bow, description["Bow"], silent);
}
else if (description.ContainsKey("Crossbow"))
{
RestoreFromString(ref CompositeWeapon, CrossbowRenderers, SpriteCollection.Crossbow, description["Crossbow"], silent);
}
Initialize();
}
private IEnumerable<ItemSprite> GetWeaponCollection(WeaponType weaponType)
{
switch (weaponType)
{
case WeaponType.Melee1H: return SpriteCollection.MeleeWeapon1H;
case WeaponType.Paired: return SpriteCollection.MeleeWeapon1H;
case WeaponType.Melee2H: return SpriteCollection.MeleeWeapon2H;
case WeaponType.Bow: return SpriteCollection.Bow;
case WeaponType.Crossbow: return SpriteCollection.Crossbow;
case WeaponType.Firearm1H: return SpriteCollection.Firearm1H;
case WeaponType.Firearm2H: return SpriteCollection.Firearm2H;
case WeaponType.Throwable: return SpriteCollection.Throwable;
default:
throw new NotSupportedException(weaponType.ToString());
}
}
private static string SpriteToString(IEnumerable<ItemSprite> collection, SpriteRenderer renderer)
{
if (renderer == null) return null;
return SpriteToString(collection, renderer.sprite, renderer.color);
}
private static string SpritesToString(IEnumerable<ItemSprite> collection, List<SpriteRenderer> renderers)
{
var values = renderers.Select(i => SpriteToString(collection, i));
return string.Join(",", values);
}
private static string SpriteToString(IEnumerable<ItemSprite> collection, Sprite sprite, Color color)
{
if (sprite == null) return null;
var entry = collection.SingleOrDefault(i => i.Sprite == sprite || i.Sprites.Any(j => j == sprite));
if (entry == null)
{
throw new Exception($"Can't find {sprite.name} in SpriteCollection.");
}
var result = color == Color.white ? entry.Id : entry.Id + "#" + ColorUtility.ToHtmlStringRGBA(color);
return result;
}
private ItemSprite RestoreFromString(ref Sprite sprite, SpriteRenderer renderer, IEnumerable<ItemSprite> collection, string serialized, bool silent = false)
{
if (renderer == null) return null;
if (string.IsNullOrEmpty(serialized))
{
sprite = renderer.sprite = null;
return null;
}
var parts = serialized.Split('#');
var id = parts[0];
var color = Color.white;
if (parts.Length > 1)
{
ColorUtility.TryParseHtmlString("#" + parts[1], out color);
}
var entries = collection.Where(i => i.Id == id).ToList();
switch (entries.Count)
{
case 1:
sprite = renderer.sprite = entries[0].Sprites.Count == 1 ? entries[0].Sprites[0] : renderer.GetComponent<SpriteMapping>().FindSprite(entries[0].Sprites);
renderer.color = color;
return entries[0];
case 0:
if (silent) Debug.LogWarning("entries.Count = " + entries.Count); else throw new Exception($"Entry with id {id} not found in SpriteCollection."); return null;
default:
if (silent) Debug.LogWarning("entries.Count = " + entries.Count); else throw new Exception($"Multiple entries with id {id} found in SpriteCollection."); return null;
}
}
private static void RestoreFromString(ref List<Sprite> sprites, List<SpriteRenderer> renderers, List<ItemSprite> collection, string serialized, bool silent = false)
{
if (string.IsNullOrEmpty(serialized))
{
sprites = new List<Sprite>();
foreach (var renderer in renderers)
{
renderer.sprite = null;
}
return;
}
sprites = new List<Sprite>();
var values = serialized.Split(',');
for (var i = 0; i < values.Length; i++)
{
if (values[i] == "") continue;
var match = Regex.Match(values[i], @"(?<Id>[\w\. \[\]]+)(?<Color>#\w+)*");
var id = match.Groups["Id"].Value;
var color = Color.white;
if (match.Groups["Color"].Success)
{
ColorUtility.TryParseHtmlString(match.Groups["Color"].Value, out color);
}
var entries = collection.Where(i => i.Id == id).ToList();
switch (entries.Count)
{
case 1:
if (values.Length == 1)
{
sprites = entries[0].Sprites.ToList();
renderers.ForEach(j => j.color = color);
}
else
{
var sprite = renderers[i].GetComponent<SpriteMapping>().FindSprite(entries[0].Sprites);
if (!sprites.Contains(sprite))
{
sprites.Add(sprite);
}
renderers[i].color = color;
}
break;
case 0:
if (silent) Debug.LogWarning("entries.Count = " + entries.Count); else throw new Exception($"Entry with id {id} not found in SpriteCollection."); break;
default:
if (silent) Debug.LogWarning("entries.Count = " + entries.Count); else throw new Exception($"Multiple entries with id {id} found in SpriteCollection."); break;
}
}
}
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: 9bae9ad6db67fa44fa0e3759c238f695
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 9bae9ad6db67fa44fa0e3759c238f695
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,285 +1,285 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Data;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
public partial class Character
{
/// <summary>
/// Set character's body parts.
/// </summary>
public void SetBody(ItemSprite item, BodyPart part, Color? color)
{
switch (part)
{
case BodyPart.Body:
Body = item?.Sprites.ToList();
BodyRenderers.ForEach(i => i.color = color ?? i.color);
Head = HeadRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
HeadRenderer.color = color ?? HeadRenderer.color;
break;
case BodyPart.Head:
Head = HeadRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
HeadRenderer.color = color ?? HeadRenderer.color;
break;
case BodyPart.Hair:
Hair = HairRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
HairRenderer.color = color ?? HairRenderer.color;
HideEars = item != null && item.Tags.Contains("HideEars");
if (item != null && item.Tags.Contains("NoPaint")) { HairRenderer.color = Color.white; HairRenderer.material = new Material(Shader.Find("Sprites/Default")); }
break;
case BodyPart.Ears:
Ears = item?.Sprites.ToList();
EarsRenderers.ForEach(i => i.color = color ?? i.color);
break;
case BodyPart.Eyebrows:
if (EyebrowsRenderer) Expressions[0].Eyebrows = EyebrowsRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
break;
case BodyPart.Eyes:
if (EyesRenderer)
{
Expressions[0].Eyes = EyesRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
Expressions.Where(i => i.Name != "Dead").ToList().ForEach(i => i.EyesColor = color ?? EyesRenderer.color);
EyesRenderer.color = color ?? EyesRenderer.color;
}
break;
case BodyPart.Mouth:
if (MouthRenderer) Expressions[0].Mouth = MouthRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
break;
case BodyPart.Beard:
if (BeardRenderer)
{
Beard = BeardRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
BeardRenderer.color = color ?? BeardRenderer.color;
}
break;
case BodyPart.Makeup:
if (MakeupRenderer)
{
Makeup = MakeupRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
MakeupRenderer.color = color ?? MakeupRenderer.color;
}
break;
default: throw new NotImplementedException($"Unsupported part: {part}.");
}
Initialize();
}
public void SetBody(ItemSprite item, BodyPart part)
{
SetBody(item, part, null);
}
/// <summary>
/// Set character's expression.
/// </summary>
public void SetExpression(string expression)
{
if (Expressions.Count < 3) throw new Exception("Character must have at least 3 basic expressions: Default, Angry and Dead.");
if (EyesRenderer == null) return;
var e = Expressions.Single(i => i.Name == expression);
Expression = expression;
EyebrowsRenderer.sprite = e.Eyebrows;
EyesRenderer.sprite = e.Eyes;
EyesRenderer.color = e.EyesColor;
MouthRenderer.sprite = e.Mouth;
}
/// <summary>
/// Equip something from SpriteCollection.
/// </summary>
public void Equip(ItemSprite item, EquipmentPart part, Color? color)
{
switch (part)
{
case EquipmentPart.MeleeWeapon1H:
CompositeWeapon = null;
break;
case EquipmentPart.MeleeWeapon2H:
case EquipmentPart.SecondaryMelee1H:
case EquipmentPart.Firearm1H:
case EquipmentPart.Firearm2H:
case EquipmentPart.SecondaryFirearm1H:
CompositeWeapon = null;
Shield = null;
break;
case EquipmentPart.Bow:
case EquipmentPart.Crossbow:
PrimaryWeapon = SecondaryWeapon = null;
Shield = null;
break;
}
Cape = Quiver = Backpack = null;
switch (part)
{
case EquipmentPart.Helmet:
HideEars = item != null && !item.Tags.Contains("ShowEars");
CropHair = item != null && !item.Tags.Contains("FullHair");
Helmet = HelmetRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
HelmetRenderer.color = color ?? HelmetRenderer.color;
break;
case EquipmentPart.Armor:
Armor = item?.Sprites.ToList().ToList();
ArmorRenderers.ForEach(i => i.color = color ?? i.color);
break;
case EquipmentPart.Vest:
SetArmorParts(VestRenderers, item?.Sprites, color);
break;
case EquipmentPart.Bracers:
SetArmorParts(BracersRenderers, item?.Sprites, color);
break;
case EquipmentPart.Leggings:
SetArmorParts(LeggingsRenderers, item?.Sprites, color);
break;
case EquipmentPart.MeleeWeapon1H:
PrimaryWeapon = item?.Sprite;
PrimaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? PrimaryWeaponRenderer.color : Color.white);
if (WeaponType != WeaponType.Paired) WeaponType = WeaponType.Melee1H;
break;
case EquipmentPart.MeleeWeapon2H:
PrimaryWeapon = item?.Sprite;
PrimaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? PrimaryWeaponRenderer.color : Color.white);
WeaponType = WeaponType.Melee2H;
break;
case EquipmentPart.SecondaryMelee1H:
SecondaryWeapon = item?.Sprite;
SecondaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? SecondaryWeaponRenderer.color : Color.white);
WeaponType = WeaponType.Paired;
break;
case EquipmentPart.Bow:
CompositeWeapon = item?.Sprites.ToList();
WeaponType = WeaponType.Bow;
break;
case EquipmentPart.Crossbow:
CompositeWeapon = item?.Sprites.ToList();
WeaponType = WeaponType.Crossbow;
break;
case EquipmentPart.Firearm1H:
PrimaryWeapon = item?.Sprites.Single(i => i.name == "Side");
WeaponType = WeaponType.Firearm1H;
break;
case EquipmentPart.Firearm2H:
PrimaryWeapon = item?.Sprites.Single(i => i.name == "Side");
WeaponType = WeaponType.Firearm2H;
break;
case EquipmentPart.SecondaryFirearm1H:
SecondaryWeapon = item?.Sprites.Single(i => i.name == "Side");
WeaponType = WeaponType.Paired;
break;
case EquipmentPart.Shield:
Shield = item?.Sprites.ToList();
WeaponType = WeaponType.Melee1H;
break;
//case EquipmentPart.Cape:
// Cape = item?.Sprite;
// CapeRenderer.color = color ?? CapeRenderer.color;
// break;
case EquipmentPart.Quiver:
Quiver = item?.Sprite;
QuiverRenderer.color = color ?? QuiverRenderer.color;
break;
case EquipmentPart.Backpack:
Backpack = item?.Sprite;
BackpackRenderer.color = color ?? BackpackRenderer.color;
break;
case EquipmentPart.Earrings:
Earrings = item?.Sprites.ToList();
EarringsRenderers[0].color = EarringsRenderers[1].color = color ?? EarringsRenderers[0].color;
break;
case EquipmentPart.Mask:
Mask = MaskRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
MaskRenderer.color = color ?? MaskRenderer.color;
break;
default: throw new NotImplementedException($"Unsupported part: {part}.");
}
Initialize();
if (part == EquipmentPart.Firearm1H || part == EquipmentPart.Firearm2H)
{
SetFirearmMuzzle(item);
}
}
public void Equip(ItemSprite item, EquipmentPart part)
{
Equip(item, part, null);
}
/// <summary>
/// Remove equipment partially.
/// </summary>
public void UnEquip(EquipmentPart part)
{
Equip(null, part);
}
/// <summary>
/// Remove all equipment.
/// </summary>
public void ResetEquipment()
{
Armor = new List<Sprite>();
CompositeWeapon = new List<Sprite>();
Shield = new List<Sprite>();
Helmet = PrimaryWeapon = SecondaryWeapon = Mask = Cape = Quiver = Backpack = null;
Earrings = new List<Sprite>();
HideEars = CropHair = false;
Initialize();
}
private void SetArmorParts(List<SpriteRenderer> renderers, List<Sprite> armor, Color? color)
{
if (Armor == null)
{
Armor = new List<Sprite>();
}
else
{
Armor.RemoveAll(i => i == null);
}
foreach (var r in renderers)
{
var mapping = r.GetComponent<SpriteMapping>();
var sprite = armor?.SingleOrDefault(j => mapping.SpriteName == j.name || mapping.SpriteNameFallback.Contains(j.name));
Armor.RemoveAll(i => i.name == mapping.SpriteName || mapping.SpriteNameFallback.Contains(i.name));
if (sprite != null)
{
Armor.Add(sprite);
}
if (color != null) r.color = color.Value;
}
}
private void SetFirearmMuzzle(ItemSprite item)
{
if (item == null || PrimaryWeaponRenderer.sprite == null)
{
AnchorFireMuzzle.localPosition = Vector3.zero;
return;
}
var mx = 0.5f;
var my = int.Parse(item.MetaDict["Muzzle"]) / 100f;
var bounds = PrimaryWeaponRenderer.sprite.bounds;
var p = new Vector2(bounds.min.x + mx * (bounds.max.x - bounds.min.x), bounds.min.y + my * (bounds.max.y - bounds.min.y));
if (PrimaryWeaponRenderer.flipX) p.x *= -1;
AnchorFireMuzzle.localPosition = p;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Data;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
public partial class Character
{
/// <summary>
/// Set character's body parts.
/// </summary>
public void SetBody(ItemSprite item, BodyPart part, Color? color)
{
switch (part)
{
case BodyPart.Body:
Body = item?.Sprites.ToList();
BodyRenderers.ForEach(i => i.color = color ?? i.color);
Head = HeadRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
HeadRenderer.color = color ?? HeadRenderer.color;
break;
case BodyPart.Head:
Head = HeadRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
HeadRenderer.color = color ?? HeadRenderer.color;
break;
case BodyPart.Hair:
Hair = HairRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
HairRenderer.color = color ?? HairRenderer.color;
HideEars = item != null && item.Tags.Contains("HideEars");
if (item != null && item.Tags.Contains("NoPaint")) { HairRenderer.color = Color.white; HairRenderer.material = new Material(Shader.Find("Sprites/Default")); }
break;
case BodyPart.Ears:
Ears = item?.Sprites.ToList();
EarsRenderers.ForEach(i => i.color = color ?? i.color);
break;
case BodyPart.Eyebrows:
if (EyebrowsRenderer) Expressions[0].Eyebrows = EyebrowsRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
break;
case BodyPart.Eyes:
if (EyesRenderer)
{
Expressions[0].Eyes = EyesRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
Expressions.Where(i => i.Name != "Dead").ToList().ForEach(i => i.EyesColor = color ?? EyesRenderer.color);
EyesRenderer.color = color ?? EyesRenderer.color;
}
break;
case BodyPart.Mouth:
if (MouthRenderer) Expressions[0].Mouth = MouthRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
break;
case BodyPart.Beard:
if (BeardRenderer)
{
Beard = BeardRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
BeardRenderer.color = color ?? BeardRenderer.color;
}
break;
case BodyPart.Makeup:
if (MakeupRenderer)
{
Makeup = MakeupRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
MakeupRenderer.color = color ?? MakeupRenderer.color;
}
break;
default: throw new NotImplementedException($"Unsupported part: {part}.");
}
Initialize();
}
public void SetBody(ItemSprite item, BodyPart part)
{
SetBody(item, part, null);
}
/// <summary>
/// Set character's expression.
/// </summary>
public void SetExpression(string expression)
{
if (Expressions.Count < 3) throw new Exception("Character must have at least 3 basic expressions: Default, Angry and Dead.");
if (EyesRenderer == null) return;
var e = Expressions.Single(i => i.Name == expression);
Expression = expression;
EyebrowsRenderer.sprite = e.Eyebrows;
EyesRenderer.sprite = e.Eyes;
EyesRenderer.color = e.EyesColor;
MouthRenderer.sprite = e.Mouth;
}
/// <summary>
/// Equip something from SpriteCollection.
/// </summary>
public void Equip(ItemSprite item, EquipmentPart part, Color? color)
{
switch (part)
{
case EquipmentPart.MeleeWeapon1H:
CompositeWeapon = null;
break;
case EquipmentPart.MeleeWeapon2H:
case EquipmentPart.SecondaryMelee1H:
case EquipmentPart.Firearm1H:
case EquipmentPart.Firearm2H:
case EquipmentPart.SecondaryFirearm1H:
CompositeWeapon = null;
Shield = null;
break;
case EquipmentPart.Bow:
case EquipmentPart.Crossbow:
PrimaryWeapon = SecondaryWeapon = null;
Shield = null;
break;
}
Cape = Quiver = Backpack = null;
switch (part)
{
case EquipmentPart.Helmet:
HideEars = item != null && !item.Tags.Contains("ShowEars");
CropHair = item != null && !item.Tags.Contains("FullHair");
Helmet = HelmetRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
HelmetRenderer.color = color ?? HelmetRenderer.color;
break;
case EquipmentPart.Armor:
Armor = item?.Sprites.ToList().ToList();
ArmorRenderers.ForEach(i => i.color = color ?? i.color);
break;
case EquipmentPart.Vest:
SetArmorParts(VestRenderers, item?.Sprites, color);
break;
case EquipmentPart.Bracers:
SetArmorParts(BracersRenderers, item?.Sprites, color);
break;
case EquipmentPart.Leggings:
SetArmorParts(LeggingsRenderers, item?.Sprites, color);
break;
case EquipmentPart.MeleeWeapon1H:
PrimaryWeapon = item?.Sprite;
PrimaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? PrimaryWeaponRenderer.color : Color.white);
if (WeaponType != WeaponType.Paired) WeaponType = WeaponType.Melee1H;
break;
case EquipmentPart.MeleeWeapon2H:
PrimaryWeapon = item?.Sprite;
PrimaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? PrimaryWeaponRenderer.color : Color.white);
WeaponType = WeaponType.Melee2H;
break;
case EquipmentPart.SecondaryMelee1H:
SecondaryWeapon = item?.Sprite;
SecondaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? SecondaryWeaponRenderer.color : Color.white);
WeaponType = WeaponType.Paired;
break;
case EquipmentPart.Bow:
CompositeWeapon = item?.Sprites.ToList();
WeaponType = WeaponType.Bow;
break;
case EquipmentPart.Crossbow:
CompositeWeapon = item?.Sprites.ToList();
WeaponType = WeaponType.Crossbow;
break;
case EquipmentPart.Firearm1H:
PrimaryWeapon = item?.Sprites.Single(i => i.name == "Side");
WeaponType = WeaponType.Firearm1H;
break;
case EquipmentPart.Firearm2H:
PrimaryWeapon = item?.Sprites.Single(i => i.name == "Side");
WeaponType = WeaponType.Firearm2H;
break;
case EquipmentPart.SecondaryFirearm1H:
SecondaryWeapon = item?.Sprites.Single(i => i.name == "Side");
WeaponType = WeaponType.Paired;
break;
case EquipmentPart.Shield:
Shield = item?.Sprites.ToList();
WeaponType = WeaponType.Melee1H;
break;
//case EquipmentPart.Cape:
// Cape = item?.Sprite;
// CapeRenderer.color = color ?? CapeRenderer.color;
// break;
case EquipmentPart.Quiver:
Quiver = item?.Sprite;
QuiverRenderer.color = color ?? QuiverRenderer.color;
break;
case EquipmentPart.Backpack:
Backpack = item?.Sprite;
BackpackRenderer.color = color ?? BackpackRenderer.color;
break;
case EquipmentPart.Earrings:
Earrings = item?.Sprites.ToList();
EarringsRenderers[0].color = EarringsRenderers[1].color = color ?? EarringsRenderers[0].color;
break;
case EquipmentPart.Mask:
Mask = MaskRenderer.GetComponent<SpriteMapping>().FindSprite(item?.Sprites);
MaskRenderer.color = color ?? MaskRenderer.color;
break;
default: throw new NotImplementedException($"Unsupported part: {part}.");
}
Initialize();
if (part == EquipmentPart.Firearm1H || part == EquipmentPart.Firearm2H)
{
SetFirearmMuzzle(item);
}
}
public void Equip(ItemSprite item, EquipmentPart part)
{
Equip(item, part, null);
}
/// <summary>
/// Remove equipment partially.
/// </summary>
public void UnEquip(EquipmentPart part)
{
Equip(null, part);
}
/// <summary>
/// Remove all equipment.
/// </summary>
public void ResetEquipment()
{
Armor = new List<Sprite>();
CompositeWeapon = new List<Sprite>();
Shield = new List<Sprite>();
Helmet = PrimaryWeapon = SecondaryWeapon = Mask = Cape = Quiver = Backpack = null;
Earrings = new List<Sprite>();
HideEars = CropHair = false;
Initialize();
}
private void SetArmorParts(List<SpriteRenderer> renderers, List<Sprite> armor, Color? color)
{
if (Armor == null)
{
Armor = new List<Sprite>();
}
else
{
Armor.RemoveAll(i => i == null);
}
foreach (var r in renderers)
{
var mapping = r.GetComponent<SpriteMapping>();
var sprite = armor?.SingleOrDefault(j => mapping.SpriteName == j.name || mapping.SpriteNameFallback.Contains(j.name));
Armor.RemoveAll(i => i.name == mapping.SpriteName || mapping.SpriteNameFallback.Contains(i.name));
if (sprite != null)
{
Armor.Add(sprite);
}
if (color != null) r.color = color.Value;
}
}
private void SetFirearmMuzzle(ItemSprite item)
{
if (item == null || PrimaryWeaponRenderer.sprite == null)
{
AnchorFireMuzzle.localPosition = Vector3.zero;
return;
}
var mx = 0.5f;
var my = int.Parse(item.MetaDict["Muzzle"]) / 100f;
var bounds = PrimaryWeaponRenderer.sprite.bounds;
var p = new Vector2(bounds.min.x + mx * (bounds.max.x - bounds.min.x), bounds.min.y + my * (bounds.max.y - bounds.min.y));
if (PrimaryWeaponRenderer.flipX) p.x *= -1;
AnchorFireMuzzle.localPosition = p;
}
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: 51fddb24ca53b2c49a5f0d46aa5359e7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 51fddb24ca53b2c49a5f0d46aa5359e7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,83 +1,83 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Used to order sprite layers (character parts).
/// </summary>
public class LayerManager : MonoBehaviour
{
/// <summary>
/// SortingGroup can be used when you have multiple characters on scene.
/// </summary>
public SortingGroup SortingGroup;
/// <summary>
/// The full list of character sprites.
/// </summary>
public List<SpriteRenderer> Sprites;
public LayerManager CopyTo;
public void SetSortingGroupOrder(int index)
{
SortingGroup.sortingOrder = index;
}
/// <summary>
/// Get character sprites and order by Sorting Order.
/// </summary>
public void GetSpritesBySortingOrder()
{
Sprites = GetComponentsInChildren<SpriteRenderer>(true).OrderBy(i => i.sortingOrder).ToList();
}
/// <summary>
/// Set Sorting Order for character sprites.
/// </summary>
public void SetSpritesBySortingOrder()
{
for (var i = 0; i < Sprites.Count; i++)
{
Sprites[i].sortingOrder = 5 * i;
}
#if UNITY_EDITOR
EditorUtility.SetDirty(this);
#endif
}
public void CopyOrder()
{
if (CopyTo == null) throw new ArgumentNullException(nameof(CopyTo));
foreach (var sprite in CopyTo.Sprites)
{
sprite.sortingOrder = Sprites.Single(i => i.name == sprite.name && GetSpriteRendererPath(i) == GetSpriteRendererPath(sprite)).sortingOrder;
}
Debug.Log("Copied!");
}
private static string GetSpriteRendererPath(SpriteRenderer spriteRenderer)
{
var path = spriteRenderer.name;
var t = spriteRenderer.transform;
while (t.parent != null && t.parent.GetComponent<Character4D>() == null)
{
path = t.parent.name + "/" + path;
t = t.parent;
}
return path;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Used to order sprite layers (character parts).
/// </summary>
public class LayerManager : MonoBehaviour
{
/// <summary>
/// SortingGroup can be used when you have multiple characters on scene.
/// </summary>
public SortingGroup SortingGroup;
/// <summary>
/// The full list of character sprites.
/// </summary>
public List<SpriteRenderer> Sprites;
public LayerManager CopyTo;
public void SetSortingGroupOrder(int index)
{
SortingGroup.sortingOrder = index;
}
/// <summary>
/// Get character sprites and order by Sorting Order.
/// </summary>
public void GetSpritesBySortingOrder()
{
Sprites = GetComponentsInChildren<SpriteRenderer>(true).OrderBy(i => i.sortingOrder).ToList();
}
/// <summary>
/// Set Sorting Order for character sprites.
/// </summary>
public void SetSpritesBySortingOrder()
{
for (var i = 0; i < Sprites.Count; i++)
{
Sprites[i].sortingOrder = 5 * i;
}
#if UNITY_EDITOR
EditorUtility.SetDirty(this);
#endif
}
public void CopyOrder()
{
if (CopyTo == null) throw new ArgumentNullException(nameof(CopyTo));
foreach (var sprite in CopyTo.Sprites)
{
sprite.sortingOrder = Sprites.Single(i => i.name == sprite.name && GetSpriteRendererPath(i) == GetSpriteRendererPath(sprite)).sortingOrder;
}
Debug.Log("Copied!");
}
private static string GetSpriteRendererPath(SpriteRenderer spriteRenderer)
{
var path = spriteRenderer.name;
var t = spriteRenderer.transform;
while (t.parent != null && t.parent.GetComponent<Character4D>() == null)
{
path = t.parent.name + "/" + path;
t = t.parent;
}
return path;
}
}
}

View File

@@ -1,13 +1,13 @@
fileFormatVersion: 2
guid: e6dbda98e8614ec8a935809c1a0ace8a
timeCreated: 1493205594
licenseType: Store
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: e6dbda98e8614ec8a935809c1a0ace8a
timeCreated: 1493205594
licenseType: Store
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,39 +1,39 @@
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// General melee weapon behaviour.
/// First thing you need to check is hit event. Use animation events or check user input.
/// Second thing is to resolve impacts to other objects (enemies, environment). Use collisions or raycasts.
/// </summary>
public class MeleeWeapon : MonoBehaviour
{
public AnimationEvents AnimationEvents;
public Transform Edge;
/// <summary>
/// Listen animation events to determine hit moments.
/// </summary>
public void Start()
{
AnimationEvents.OnEvent += OnAnimationEvent;
}
public void OnDestroy()
{
AnimationEvents.OnEvent -= OnAnimationEvent;
}
private void OnAnimationEvent(string eventName)
{
switch (eventName)
{
case "Hit":
// Place hit behaviour here. For example, you could check/raycast collisions here.
break;
default: return;
}
}
}
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// General melee weapon behaviour.
/// First thing you need to check is hit event. Use animation events or check user input.
/// Second thing is to resolve impacts to other objects (enemies, environment). Use collisions or raycasts.
/// </summary>
public class MeleeWeapon : MonoBehaviour
{
public AnimationEvents AnimationEvents;
public Transform Edge;
/// <summary>
/// Listen animation events to determine hit moments.
/// </summary>
public void Start()
{
AnimationEvents.OnEvent += OnAnimationEvent;
}
public void OnDestroy()
{
AnimationEvents.OnEvent -= OnAnimationEvent;
}
private void OnAnimationEvent(string eventName)
{
switch (eventName)
{
case "Hit":
// Place hit behaviour here. For example, you could check/raycast collisions here.
break;
default: return;
}
}
}
}

View File

@@ -1,13 +1,13 @@
fileFormatVersion: 2
guid: 80cd3cad3afd43079abde900b17b49f6
timeCreated: 1516905601
licenseType: Store
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 80cd3cad3afd43079abde900b17b49f6
timeCreated: 1516905601
licenseType: Store
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,25 +1,25 @@
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Used to associate SpriteRenderer with SpriteCollection.
/// </summary>
public class SpriteMapping : MonoBehaviour
{
public string SpriteName;
public List<string> SpriteNameFallback;
/// <summary>
/// Find sprite by SpriteName, then by SpriteNameIfNotFound. Return null if nothing found.
/// </summary>
public Sprite FindSprite(List<Sprite> sprites)
{
if (sprites == null || sprites.Count == 0) return null;
return sprites.SingleOrDefault(i => i != null && i.name == SpriteName) ?? sprites.SingleOrDefault(i => i != null && SpriteNameFallback.Contains(i.name));
}
}
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts
{
/// <summary>
/// Used to associate SpriteRenderer with SpriteCollection.
/// </summary>
public class SpriteMapping : MonoBehaviour
{
public string SpriteName;
public List<string> SpriteNameFallback;
/// <summary>
/// Find sprite by SpriteName, then by SpriteNameIfNotFound. Return null if nothing found.
/// </summary>
public Sprite FindSprite(List<Sprite> sprites)
{
if (sprites == null || sprites.Count == 0) return null;
return sprites.SingleOrDefault(i => i != null && i.name == SpriteName) ?? sprites.SingleOrDefault(i => i != null && SpriteNameFallback.Contains(i.name));
}
}
}

View File

@@ -1,11 +1,11 @@
fileFormatVersion: 2
guid: 56a85167256b1274eb498375253efd9c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 56a85167256b1274eb498375253efd9c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: