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,10 +1,10 @@
fileFormatVersion: 2
guid: 38443edf6eb74cad8079906805f111b4
folderAsset: yes
timeCreated: 1516790276
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 38443edf6eb74cad8079906805f111b4
folderAsset: yes
timeCreated: 1516790276
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

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:

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: 736275f8da0f95345b8c0c59f18e59d4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 736275f8da0f95345b8c0c59f18e59d4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,36 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Collections
{
/// <summary>
/// Global object that automatically grabs all required images.
/// </summary>
[CreateAssetMenu(fileName = "FirearmCollection", menuName = "HeroEditor4D/FirearmCollection")]
public class FirearmCollection : ScriptableObject
{
public string Id;
public List<FirearmParams> FirearmParams;
public static Dictionary<string, FirearmCollection> Instances = new Dictionary<string, FirearmCollection>();
public void OnEnable()
{
if (!Instances.ContainsKey(Id))
{
Instances.Add(Id, this);
}
}
}
[Serializable]
public class FirearmParams
{
public string Name;
public ParticleSystem FireMuzzlePrefab;
public AudioClip ShotSound;
public AudioClip ReloadSound;
}
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Collections
{
/// <summary>
/// Global object that automatically grabs all required images.
/// </summary>
[CreateAssetMenu(fileName = "FirearmCollection", menuName = "HeroEditor4D/FirearmCollection")]
public class FirearmCollection : ScriptableObject
{
public string Id;
public List<FirearmParams> FirearmParams;
public static Dictionary<string, FirearmCollection> Instances = new Dictionary<string, FirearmCollection>();
public void OnEnable()
{
if (!Instances.ContainsKey(Id))
{
Instances.Add(Id, this);
}
}
}
[Serializable]
public class FirearmParams
{
public string Name;
public ParticleSystem FireMuzzlePrefab;
public AudioClip ShotSound;
public AudioClip ReloadSound;
}
}

View File

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

View File

@@ -1,74 +1,74 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEditor;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Collections
{
/// <summary>
/// Global object that automatically grabs all required images.
/// </summary>
[CreateAssetMenu(fileName = "IconCollection", menuName = "HeroEditor4D/IconCollection")]
public class IconCollection : ScriptableObject
{
public string Id;
public List<UnityEngine.Object> IconFolders;
public List<ItemIcon> Icons;
public Sprite GetIcon(string id)
{
var icon = id == null ? null : Icons.SingleOrDefault(i => i.Id == id);
if (icon == null && id != null) Debug.LogWarning("Icon not found: " + id);
return icon?.Sprite;
}
#if UNITY_EDITOR
public void Refresh()
{
Icons.Clear();
foreach (var folder in IconFolders)
{
if (folder == null) continue;
var root = AssetDatabase.GetAssetPath(folder);
var files = Directory.GetFiles(root, "*.png", SearchOption.AllDirectories).ToList();
foreach (var path in files.Select(i => i.Replace("\\", "/")))
{
var match = Regex.Match(path, @"Assets\/HeroEditor4D\/(?<Edition>\w+)\/(.+?\/)*Icons\/\w+\/(?<Type>\w+)\/(?<Collection>.+?)\/(.+\/)*(?<Name>.+?)\.png");
if (!match.Success) throw new Exception($"Incorrect path: {path}");
var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(path);
var edition = match.Groups["Edition"].Value;
var collection = match.Groups["Collection"].Value;
var type = match.Groups["Type"].Value;
var iconName = match.Groups["Name"].Value;
var icon = new ItemIcon(edition, collection, type, iconName, path, sprite);
if (Icons.Any(i => i.Path == icon.Path))
{
Debug.LogErrorFormat($"Duplicated icon: {icon.Path}");
}
else
{
Icons.Add(icon);
}
}
}
Icons = Icons.OrderBy(i => i.Name).ToList();
EditorUtility.SetDirty(this);
}
#endif
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEditor;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Collections
{
/// <summary>
/// Global object that automatically grabs all required images.
/// </summary>
[CreateAssetMenu(fileName = "IconCollection", menuName = "HeroEditor4D/IconCollection")]
public class IconCollection : ScriptableObject
{
public string Id;
public List<UnityEngine.Object> IconFolders;
public List<ItemIcon> Icons;
public Sprite GetIcon(string id)
{
var icon = id == null ? null : Icons.SingleOrDefault(i => i.Id == id);
if (icon == null && id != null) Debug.LogWarning("Icon not found: " + id);
return icon?.Sprite;
}
#if UNITY_EDITOR
public void Refresh()
{
Icons.Clear();
foreach (var folder in IconFolders)
{
if (folder == null) continue;
var root = AssetDatabase.GetAssetPath(folder);
var files = Directory.GetFiles(root, "*.png", SearchOption.AllDirectories).ToList();
foreach (var path in files.Select(i => i.Replace("\\", "/")))
{
var match = Regex.Match(path, @"Assets\/HeroEditor4D\/(?<Edition>\w+)\/(.+?\/)*Icons\/\w+\/(?<Type>\w+)\/(?<Collection>.+?)\/(.+\/)*(?<Name>.+?)\.png");
if (!match.Success) throw new Exception($"Incorrect path: {path}");
var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(path);
var edition = match.Groups["Edition"].Value;
var collection = match.Groups["Collection"].Value;
var type = match.Groups["Type"].Value;
var iconName = match.Groups["Name"].Value;
var icon = new ItemIcon(edition, collection, type, iconName, path, sprite);
if (Icons.Any(i => i.Path == icon.Path))
{
Debug.LogErrorFormat($"Duplicated icon: {icon.Path}");
}
else
{
Icons.Add(icon);
}
}
}
Icons = Icons.OrderBy(i => i.Name).ToList();
EditorUtility.SetDirty(this);
}
#endif
}
}

View File

@@ -1,12 +1,12 @@
fileFormatVersion: 2
guid: 650133c44dc1224489eed33fcd27316e
timeCreated: 1508495273
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 650133c44dc1224489eed33fcd27316e
timeCreated: 1508495273
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,61 +1,61 @@
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Collections
{
/// <summary>
/// Collects sprites from specified path.
/// </summary>
[CreateAssetMenu(fileName = "SpriteCollection", menuName = "HeroEditor4D/SpriteCollection")]
public class SpriteCollection : ScriptableObject
{
public string Id;
[Header("Where to find sprites?")]
public List<Object> SpriteFolders;
public List<string> CollectionFilter;
public List<string> CollectionFilterIgnore;
[Header("Body Parts")]
public List<ItemSprite> Body;
public List<ItemSprite> Ears;
public List<ItemSprite> Hair;
public List<ItemSprite> Beard;
public List<ItemSprite> Eyebrows;
public List<ItemSprite> Eyes;
public List<ItemSprite> Mouth;
[Header("Equipment")]
public List<ItemSprite> Armor;
public List<ItemSprite> Cape;
public List<ItemSprite> Backpack;
public List<ItemSprite> MeleeWeapon1H;
public List<ItemSprite> MeleeWeapon2H;
public List<ItemSprite> Bow;
public List<ItemSprite> Crossbow;
public List<ItemSprite> Firearm1H;
public List<ItemSprite> Firearm2H;
public List<ItemSprite> Shield;
public List<ItemSprite> Throwable;
public List<ItemSprite> Supplies;
[Header("Accessories")]
public List<ItemSprite> Makeup;
public List<ItemSprite> Mask;
public List<ItemSprite> Earrings;
[Header("Service")]
public bool IncludePsd;
public bool DebugLogging;
public List<ItemSprite> GetAllSprites()
{
return Body.Union(Ears).Union(Hair).Union(Beard).Union(Eyebrows).Union(Eyes).Union(Mouth)
.Union(Armor).Union(Cape).Union(Backpack).Union(MeleeWeapon1H).Union(MeleeWeapon2H)
.Union(Bow).Union(Crossbow).Union(Firearm1H).Union(Firearm2H).Union(Shield).Union(Throwable).Union(Supplies)
.Union(Makeup).Union(Mask).Union(Earrings).ToList();
}
}
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Collections
{
/// <summary>
/// Collects sprites from specified path.
/// </summary>
[CreateAssetMenu(fileName = "SpriteCollection", menuName = "HeroEditor4D/SpriteCollection")]
public class SpriteCollection : ScriptableObject
{
public string Id;
[Header("Where to find sprites?")]
public List<Object> SpriteFolders;
public List<string> CollectionFilter;
public List<string> CollectionFilterIgnore;
[Header("Body Parts")]
public List<ItemSprite> Body;
public List<ItemSprite> Ears;
public List<ItemSprite> Hair;
public List<ItemSprite> Beard;
public List<ItemSprite> Eyebrows;
public List<ItemSprite> Eyes;
public List<ItemSprite> Mouth;
[Header("Equipment")]
public List<ItemSprite> Armor;
public List<ItemSprite> Cape;
public List<ItemSprite> Backpack;
public List<ItemSprite> MeleeWeapon1H;
public List<ItemSprite> MeleeWeapon2H;
public List<ItemSprite> Bow;
public List<ItemSprite> Crossbow;
public List<ItemSprite> Firearm1H;
public List<ItemSprite> Firearm2H;
public List<ItemSprite> Shield;
public List<ItemSprite> Throwable;
public List<ItemSprite> Supplies;
[Header("Accessories")]
public List<ItemSprite> Makeup;
public List<ItemSprite> Mask;
public List<ItemSprite> Earrings;
[Header("Service")]
public bool IncludePsd;
public bool DebugLogging;
public List<ItemSprite> GetAllSprites()
{
return Body.Union(Ears).Union(Hair).Union(Beard).Union(Eyebrows).Union(Eyes).Union(Mouth)
.Union(Armor).Union(Cape).Union(Backpack).Union(MeleeWeapon1H).Union(MeleeWeapon2H)
.Union(Bow).Union(Crossbow).Union(Firearm1H).Union(Firearm2H).Union(Shield).Union(Throwable).Union(Supplies)
.Union(Makeup).Union(Mask).Union(Earrings).ToList();
}
}
}

View File

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

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: fdcbdaf9a417c0140b2195e499e849c5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: fdcbdaf9a417c0140b2195e499e849c5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,64 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
public static class Extensions
{
public static void SetActive(this Component target, bool active)
{
target.gameObject.SetActive(active);
}
public static bool IsEmpty(this string target)
{
return string.IsNullOrEmpty(target);
}
public static void Clear(this Transform transform)
{
foreach (Transform child in transform)
{
Object.Destroy(child.gameObject);
}
}
public static T ToEnum<T>(this string value) where T : Enum
{
if (string.IsNullOrEmpty(value)) return (T) Enum.GetValues(typeof(T)).GetValue(0);
return (T) Enum.Parse(typeof(T), value);
}
public static T Random<T>(this T[] source)
{
return source[UnityEngine.Random.Range(0, source.Length)];
}
public static T Random<T>(this List<T> source)
{
return source[UnityEngine.Random.Range(0, source.Count)];
}
public static T Random<T>(this List<T> source, int seed)
{
UnityEngine.Random.InitState(seed);
return source[UnityEngine.Random.Range(0, source.Count)];
}
public static Sprite FindSprite(this IEnumerable<ItemSprite> list, string id)
{
return list.Single(i => i.Id == id).Sprite;
}
public static List<Sprite> FindSprites(this IEnumerable<ItemSprite> list, string id)
{
return list.Single(i => i.Id == id).Sprites.ToList();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
public static class Extensions
{
public static void SetActive(this Component target, bool active)
{
target.gameObject.SetActive(active);
}
public static bool IsEmpty(this string target)
{
return string.IsNullOrEmpty(target);
}
public static void Clear(this Transform transform)
{
foreach (Transform child in transform)
{
Object.Destroy(child.gameObject);
}
}
public static T ToEnum<T>(this string value) where T : Enum
{
if (string.IsNullOrEmpty(value)) return (T) Enum.GetValues(typeof(T)).GetValue(0);
return (T) Enum.Parse(typeof(T), value);
}
public static T Random<T>(this T[] source)
{
return source[UnityEngine.Random.Range(0, source.Length)];
}
public static T Random<T>(this List<T> source)
{
return source[UnityEngine.Random.Range(0, source.Count)];
}
public static T Random<T>(this List<T> source, int seed)
{
UnityEngine.Random.InitState(seed);
return source[UnityEngine.Random.Range(0, source.Count)];
}
public static Sprite FindSprite(this IEnumerable<ItemSprite> list, string id)
{
return list.Single(i => i.Id == id).Sprite;
}
public static List<Sprite> FindSprites(this IEnumerable<ItemSprite> list, string id)
{
return list.Single(i => i.Id == id).Sprites.ToList();
}
}
}

View File

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

View File

@@ -1,28 +1,28 @@
using System.Security.Cryptography;
using System.Text;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
/// <summary>
/// Md5 helper.
/// </summary>
public static class Md5
{
/// <summary>
/// Compute Md5-hash from string.
/// </summary>
public static string ComputeHash(string input)
{
var inputBytes = Encoding.UTF8.GetBytes(input);
var hash = MD5.Create().ComputeHash(inputBytes);
var stringBuilder = new StringBuilder();
for (var i = 0; i < hash.Length; i++)
{
stringBuilder.Append(hash[i].ToString("X2"));
}
return stringBuilder.ToString();
}
}
using System.Security.Cryptography;
using System.Text;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
/// <summary>
/// Md5 helper.
/// </summary>
public static class Md5
{
/// <summary>
/// Compute Md5-hash from string.
/// </summary>
public static string ComputeHash(string input)
{
var inputBytes = Encoding.UTF8.GetBytes(input);
var hash = MD5.Create().ComputeHash(inputBytes);
var stringBuilder = new StringBuilder();
for (var i = 0; i < hash.Length; i++)
{
stringBuilder.Append(hash[i].ToString("X2"));
}
return stringBuilder.ToString();
}
}
}

View File

@@ -1,31 +1,31 @@
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
/// <summary>
/// Take a screenshot in play mode [S].
/// </summary>
public class Screenshot : MonoBehaviour
{
public int SuperSize = 1;
public string Directory = "Screenshots";
public string GetPath()
{
return $"{Directory}/Screenshot_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.png";
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.S))
{
var fileName = GetPath();
System.IO.Directory.CreateDirectory(Directory);
ScreenCapture.CaptureScreenshot(fileName, SuperSize);
Debug.Log($"Screenshot saved: {fileName}");
}
}
}
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
/// <summary>
/// Take a screenshot in play mode [S].
/// </summary>
public class Screenshot : MonoBehaviour
{
public int SuperSize = 1;
public string Directory = "Screenshots";
public string GetPath()
{
return $"{Directory}/Screenshot_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.png";
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.S))
{
var fileName = GetPath();
System.IO.Directory.CreateDirectory(Directory);
ScreenCapture.CaptureScreenshot(fileName, SuperSize);
Debug.Log($"Screenshot saved: {fileName}");
}
}
}
}

View File

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

View File

@@ -1,60 +1,60 @@
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
/// <summary>
/// Take a screenshot in play mode [S].
/// </summary>
[RequireComponent(typeof(Camera))]
public class ScreenshotTransparent : MonoBehaviour
{
public int Width = 1920;
public int Height = 1280;
public string Directory = "Screenshots";
public string GetPath()
{
return $"{Directory}/ScreenshotTransparent_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.png";
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.S))
{
Capture(GetPath());
}
}
public void Capture(string path)
{
var texture = Capture();
var bytes = texture.EncodeToPNG();
var directoryInfo = new System.IO.FileInfo(path).Directory;
if (directoryInfo == null) return;
directoryInfo.Create();
System.IO.File.WriteAllBytes(path, bytes);
Debug.Log($"Screenshot saved: {path}");
}
public Texture2D Capture()
{
var cam = GetComponent<Camera>();
var renderTexture = new RenderTexture(Width, Height, 24);
var texture2D = new Texture2D(Width, Height, TextureFormat.ARGB32, false);
cam.targetTexture = renderTexture;
cam.Render();
RenderTexture.active = renderTexture;
texture2D.ReadPixels(new Rect(0, 0, Width, Height), 0, 0);
texture2D.Apply();
cam.targetTexture = null;
RenderTexture.active = null;
Destroy(renderTexture);
return texture2D;
}
}
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
/// <summary>
/// Take a screenshot in play mode [S].
/// </summary>
[RequireComponent(typeof(Camera))]
public class ScreenshotTransparent : MonoBehaviour
{
public int Width = 1920;
public int Height = 1280;
public string Directory = "Screenshots";
public string GetPath()
{
return $"{Directory}/ScreenshotTransparent_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.png";
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.S))
{
Capture(GetPath());
}
}
public void Capture(string path)
{
var texture = Capture();
var bytes = texture.EncodeToPNG();
var directoryInfo = new System.IO.FileInfo(path).Directory;
if (directoryInfo == null) return;
directoryInfo.Create();
System.IO.File.WriteAllBytes(path, bytes);
Debug.Log($"Screenshot saved: {path}");
}
public Texture2D Capture()
{
var cam = GetComponent<Camera>();
var renderTexture = new RenderTexture(Width, Height, 24);
var texture2D = new Texture2D(Width, Height, TextureFormat.ARGB32, false);
cam.targetTexture = renderTexture;
cam.Render();
RenderTexture.active = renderTexture;
texture2D.ReadPixels(new Rect(0, 0, Width, Height), 0, 0);
texture2D.Apply();
cam.targetTexture = null;
RenderTexture.active = null;
Destroy(renderTexture);
return texture2D;
}
}
}

View File

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

View File

@@ -1,46 +1,46 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
/// <summary>
/// This is a replacement for Newtonsoft serializer to avoid the DLL use. You can use Newtonsoft if you want.
/// </summary>
internal static class Serializer
{
internal static string Serialize(Dictionary<string, string> dict)
{
return "{" + string.Join(",", dict.Select(i => $"\"{i.Key}\":\"{i.Value}\"")) + "}";
}
internal static Dictionary<string, string> DeserializeDict(string json)
{
var dict = new Dictionary<string, string>();
foreach (Match match in Regex.Matches(json, "\"(.*?)\":(?:\"(.*?)\")?"))
{
dict.Add(match.Groups[1].Value, match.Groups.Count == 2 ? null : match.Groups[2].Value);
}
return dict;
}
internal static string Serialize(List<string> list)
{
return "{" + string.Join(",", list.Select(i => $"\"{i}\"")) + "}";
}
internal static List<string> DeserializeList(string json)
{
var list = new List<string>();
foreach (Match match in Regex.Matches(json, "\"(.*?)\""))
{
list.Add(match.Groups[1].Value);
}
return list;
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
/// <summary>
/// This is a replacement for Newtonsoft serializer to avoid the DLL use. You can use Newtonsoft if you want.
/// </summary>
internal static class Serializer
{
internal static string Serialize(Dictionary<string, string> dict)
{
return "{" + string.Join(",", dict.Select(i => $"\"{i.Key}\":\"{i.Value}\"")) + "}";
}
internal static Dictionary<string, string> DeserializeDict(string json)
{
var dict = new Dictionary<string, string>();
foreach (Match match in Regex.Matches(json, "\"(.*?)\":(?:\"(.*?)\")?"))
{
dict.Add(match.Groups[1].Value, match.Groups.Count == 2 ? null : match.Groups[2].Value);
}
return dict;
}
internal static string Serialize(List<string> list)
{
return "{" + string.Join(",", list.Select(i => $"\"{i}\"")) + "}";
}
internal static List<string> DeserializeList(string json)
{
var list = new List<string>();
foreach (Match match in Regex.Matches(json, "\"(.*?)\""))
{
list.Add(match.Groups[1].Value);
}
return list;
}
}
}

View File

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

View File

@@ -1,56 +1,56 @@
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
public class SoloState : StateMachineBehaviour
{
public string Name;
public bool Continuous;
public bool Active;
public Func<bool> Continue;
private float _enterTime;
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
_enterTime = Time.time;
animator.SetBool("Action", true);
Active = true;
}
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (stateInfo.normalizedTime >= 1 && !Continuous)
{
Exit(animator, stateInfo);
}
}
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
Exit(animator, stateInfo);
}
private void Exit(Animator animator, AnimatorStateInfo stateInfo)
{
if (!Active || Time.time - _enterTime < stateInfo.length) return;
Active = false;
if (Continue == null)
{
animator.SetBool("Action", false);
}
else
{
if (!Continue())
{
animator.SetBool("Action", false);
}
Continue = null;
}
}
}
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
public class SoloState : StateMachineBehaviour
{
public string Name;
public bool Continuous;
public bool Active;
public Func<bool> Continue;
private float _enterTime;
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
_enterTime = Time.time;
animator.SetBool("Action", true);
Active = true;
}
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (stateInfo.normalizedTime >= 1 && !Continuous)
{
Exit(animator, stateInfo);
}
}
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
Exit(animator, stateInfo);
}
private void Exit(Animator animator, AnimatorStateInfo stateInfo)
{
if (!Active || Time.time - _enterTime < stateInfo.length) return;
Active = false;
if (Continue == null)
{
animator.SetBool("Action", false);
}
else
{
if (!Continue())
{
animator.SetBool("Action", false);
}
Continue = null;
}
}
}
}

View File

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

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: 92394ed27be2b3f4db397f8bdf0d7e1b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 92394ed27be2b3f4db397f8bdf0d7e1b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,47 +1,47 @@
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common.Springs
{
public class PositionSpring : SpringBase
{
public Vector3 From;
public Vector3 To;
public float Dumping;
private float _amplitude = 1;
private Vector3 _pos;
public void Awake()
{
_pos = transform.localPosition;
}
protected override void OnUpdate()
{
_amplitude = Mathf.Max(0, _amplitude - Dumping * UnityEngine.Time.deltaTime);
transform.localPosition = _pos + (From + (To - From) * Sin()) * _amplitude;
if (_amplitude <= 0)
{
enabled = false;
}
}
public override void OnEnable()
{
base.OnEnable();
Reset();
}
public void OnDisable()
{
transform.localPosition = _pos;
}
public void Reset()
{
_amplitude = 1;
}
}
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common.Springs
{
public class PositionSpring : SpringBase
{
public Vector3 From;
public Vector3 To;
public float Dumping;
private float _amplitude = 1;
private Vector3 _pos;
public void Awake()
{
_pos = transform.localPosition;
}
protected override void OnUpdate()
{
_amplitude = Mathf.Max(0, _amplitude - Dumping * UnityEngine.Time.deltaTime);
transform.localPosition = _pos + (From + (To - From) * Sin()) * _amplitude;
if (_amplitude <= 0)
{
enabled = false;
}
}
public override void OnEnable()
{
base.OnEnable();
Reset();
}
public void OnDisable()
{
transform.localPosition = _pos;
}
public void Reset()
{
_amplitude = 1;
}
}
}

View File

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

View File

@@ -1,54 +1,54 @@
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common.Springs
{
public class ScaleSpring : SpringBase
{
public float From;
public float To;
public float Dumping;
private Vector3 _scale;
private float _amplitude = 1;
public static void Begin(Component target, float from, float to, float speed, float dumping)
{
var component = target.GetComponent<ScaleSpring>() ?? target.gameObject.AddComponent<ScaleSpring>();
component.From = from;
component.To = to;
component.Speed = speed;
component.Dumping = dumping;
component.enabled = true;
}
protected override void OnUpdate()
{
_amplitude = Mathf.Max(0, _amplitude - Dumping * UnityEngine.Time.deltaTime);
transform.localScale = _scale * (From + (To - From) * Sin() * _amplitude);
if (_amplitude <= 0)
{
enabled = false;
}
}
public override void OnEnable()
{
_scale = transform.localScale;
base.OnEnable();
Reset();
}
public void OnDisable()
{
transform.localScale = _scale;
}
public void Reset()
{
_amplitude = 1;
}
}
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common.Springs
{
public class ScaleSpring : SpringBase
{
public float From;
public float To;
public float Dumping;
private Vector3 _scale;
private float _amplitude = 1;
public static void Begin(Component target, float from, float to, float speed, float dumping)
{
var component = target.GetComponent<ScaleSpring>() ?? target.gameObject.AddComponent<ScaleSpring>();
component.From = from;
component.To = to;
component.Speed = speed;
component.Dumping = dumping;
component.enabled = true;
}
protected override void OnUpdate()
{
_amplitude = Mathf.Max(0, _amplitude - Dumping * UnityEngine.Time.deltaTime);
transform.localScale = _scale * (From + (To - From) * Sin() * _amplitude);
if (_amplitude <= 0)
{
enabled = false;
}
}
public override void OnEnable()
{
_scale = transform.localScale;
base.OnEnable();
Reset();
}
public void OnDisable()
{
transform.localScale = _scale;
}
public void Reset()
{
_amplitude = 1;
}
}
}

View File

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

View File

@@ -1,45 +1,45 @@
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common.Springs
{
public abstract class SpringBase : MonoBehaviour
{
public float Speed;
public float Period;
public bool RandomPeriod;
public bool SaveState;
protected float Time;
public void Start()
{
if (RandomPeriod)
{
Period = Random.Range(0, 360);
}
}
public virtual void OnEnable()
{
if (!SaveState)
{
Time = 0;
}
}
public void Update()
{
OnUpdate();
Time += UnityEngine.Time.deltaTime;
}
protected virtual void OnUpdate()
{
}
protected float Sin()
{
return (Mathf.Sin(Speed * Time + Period * Mathf.Deg2Rad) + 1) / 2;
}
}
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Common.Springs
{
public abstract class SpringBase : MonoBehaviour
{
public float Speed;
public float Period;
public bool RandomPeriod;
public bool SaveState;
protected float Time;
public void Start()
{
if (RandomPeriod)
{
Period = Random.Range(0, 360);
}
}
public virtual void OnEnable()
{
if (!SaveState)
{
Time = 0;
}
}
public void Update()
{
OnUpdate();
Time += UnityEngine.Time.deltaTime;
}
protected virtual void OnUpdate()
{
}
protected float Sin()
{
return (Mathf.Sin(Speed * Time + Period * Mathf.Deg2Rad) + 1) / 2;
}
}
}

View File

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

View File

@@ -1,28 +1,28 @@
using UnityEngine;
using UnityEngine.Events;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
public class StateHandler : StateMachineBehaviour
{
public string Name;
public UnityEvent StateEnterEvent;
public UnityEvent StateUpdateEvent;
public UnityEvent StateExit;
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
StateEnterEvent?.Invoke();
}
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
StateUpdateEvent?.Invoke();
}
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
StateExit?.Invoke();
}
}
using UnityEngine;
using UnityEngine.Events;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
public class StateHandler : StateMachineBehaviour
{
public string Name;
public UnityEvent StateEnterEvent;
public UnityEvent StateUpdateEvent;
public UnityEvent StateExit;
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
StateEnterEvent?.Invoke();
}
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
StateUpdateEvent?.Invoke();
}
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
StateExit?.Invoke();
}
}
}

View File

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

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: 97eafd2646b747840a01ac82d9ae6ae3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 97eafd2646b747840a01ac82d9ae6ae3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,15 +1,15 @@
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Data
{
[Serializable]
public class Expression
{
public string Name;
public Sprite Eyebrows;
public Sprite Eyes;
public Color EyesColor;
public Sprite Mouth;
}
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Data
{
[Serializable]
public class Expression
{
public string Name;
public Sprite Eyebrows;
public Sprite Eyes;
public Color EyesColor;
public Sprite Mouth;
}
}

View File

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

View File

@@ -1,26 +1,26 @@
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Data
{
[Serializable]
public class ItemIcon
{
public string Name;
public string Id;
public string Edition;
public string Collection;
public string Path;
public Sprite Sprite;
public ItemIcon(string edition, string collection, string type, string name, string path, Sprite sprite)
{
Id = $"{edition}.{collection}.{type}.{name}";
Name = name;
Collection = collection;
Edition = edition;
Path = path;
Sprite = sprite;
}
}
using System;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Data
{
[Serializable]
public class ItemIcon
{
public string Name;
public string Id;
public string Edition;
public string Collection;
public string Path;
public Sprite Sprite;
public ItemIcon(string edition, string collection, string type, string name, string path, Sprite sprite)
{
Id = $"{edition}.{collection}.{type}.{name}";
Name = name;
Collection = collection;
Edition = edition;
Path = path;
Sprite = sprite;
}
}
}

View File

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

View File

@@ -1,54 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Newtonsoft.Json;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Data
{
/// <summary>
/// Represents sprite entry in SpriteCollection.
/// </summary>
[Serializable]
public class ItemSprite
{
public string Name;
public string Id;
public string Edition;
public string Collection;
public string Path;
public Sprite Sprite;
public List<Sprite> Sprites;
public List<string> Tags = new List<string>();
public string Meta;
public Dictionary<string, string> MetaDict
{
get => Meta == "" ? new Dictionary<string, string>() : JsonConvert.DeserializeObject<Dictionary<string, string>>(Meta);
set => Meta = JsonConvert.SerializeObject(value);
}
public ItemSprite(string edition, string collection, string type, string name, string path, Sprite sprite, List<Sprite> sprites)
{
Id = $"{edition}.{collection}.{type}.{name}";
if (sprites == null || sprites.Count == 0)
{
throw new Exception($"Please set [Texture Type = Sprite] for [{Id}] from Import Settings!");
}
Name = name;
Collection = collection;
Edition = edition;
Path = path;
Sprite = sprite;
Sprites = sprites.OrderBy(i => i.name).ToList();
}
public Sprite GetSprite(string name)
{
return Sprites.Single(j => j.name == name);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Newtonsoft.Json;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Data
{
/// <summary>
/// Represents sprite entry in SpriteCollection.
/// </summary>
[Serializable]
public class ItemSprite
{
public string Name;
public string Id;
public string Edition;
public string Collection;
public string Path;
public Sprite Sprite;
public List<Sprite> Sprites;
public List<string> Tags = new List<string>();
public string Meta;
public Dictionary<string, string> MetaDict
{
get => Meta == "" ? new Dictionary<string, string>() : JsonConvert.DeserializeObject<Dictionary<string, string>>(Meta);
set => Meta = JsonConvert.SerializeObject(value);
}
public ItemSprite(string edition, string collection, string type, string name, string path, Sprite sprite, List<Sprite> sprites)
{
Id = $"{edition}.{collection}.{type}.{name}";
if (sprites == null || sprites.Count == 0)
{
throw new Exception($"Please set [Texture Type = Sprite] for [{Id}] from Import Settings!");
}
Name = name;
Collection = collection;
Edition = edition;
Path = path;
Sprite = sprite;
Sprites = sprites.OrderBy(i => i.name).ToList();
}
public Sprite GetSprite(string name)
{
return Sprites.Single(j => j.name == name);
}
}
}

View File

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

View File

@@ -1,10 +1,10 @@
fileFormatVersion: 2
guid: 04078430cc724a9dacacb89a3c367e2c
folderAsset: yes
timeCreated: 1516785056
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 04078430cc724a9dacacb89a3c367e2c
folderAsset: yes
timeCreated: 1516785056
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,47 +1,47 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Editor
{
public static class FirearmMuzzleResolver
{
private static Texture2D _texture;
public static void Resolve(ItemSprite sprite)
{
sprite.MetaDict = new Dictionary<string, string> { { "Muzzle", ResolveMuzzle(sprite.Path).ToString() } };
}
public static int ResolveMuzzle(string path)
{
path = Path.Combine(Environment.CurrentDirectory, path);
_texture ??= new Texture2D(2, 2);
if (File.Exists(path))
{
var bytes = File.ReadAllBytes(path);
_texture.LoadImage(bytes);
var pixels = _texture.GetPixels32();
var x = _texture.width / 2;
var height = _texture.height - 64;
for (var y = height - 1; y >= 0; y--)
{
if (pixels[x + y * _texture.width].a > 0)
{
return 100 * y / height;
}
}
}
return 0;
}
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using Assets.HeroEditor4D.Common.Scripts.Data;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Editor
{
public static class FirearmMuzzleResolver
{
private static Texture2D _texture;
public static void Resolve(ItemSprite sprite)
{
sprite.MetaDict = new Dictionary<string, string> { { "Muzzle", ResolveMuzzle(sprite.Path).ToString() } };
}
public static int ResolveMuzzle(string path)
{
path = Path.Combine(Environment.CurrentDirectory, path);
_texture ??= new Texture2D(2, 2);
if (File.Exists(path))
{
var bytes = File.ReadAllBytes(path);
_texture.LoadImage(bytes);
var pixels = _texture.GetPixels32();
var x = _texture.width / 2;
var height = _texture.height - 64;
for (var y = height - 1; y >= 0; y--)
{
if (pixels[x + y * _texture.width].a > 0)
{
return 100 * y / height;
}
}
}
return 0;
}
}
}

View File

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

View File

@@ -1,27 +1,27 @@
using Assets.HeroEditor4D.Common.Scripts.Collections;
using Assets.HeroEditor4D.Common.Scripts.Common;
using UnityEditor;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Editor
{
/// <summary>
/// Add "Refresh" button to IconCollection script
/// </summary>
[CustomEditor(typeof(IconCollection))]
public class IconCollectionEditor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
var collection = (IconCollection) target;
if (GUILayout.Button("Refresh"))
{
collection.Refresh();
}
}
}
using Assets.HeroEditor4D.Common.Scripts.Collections;
using Assets.HeroEditor4D.Common.Scripts.Common;
using UnityEditor;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Editor
{
/// <summary>
/// Add "Refresh" button to IconCollection script
/// </summary>
[CustomEditor(typeof(IconCollection))]
public class IconCollectionEditor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
var collection = (IconCollection) target;
if (GUILayout.Button("Refresh"))
{
collection.Refresh();
}
}
}
}

View File

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

View File

@@ -1,37 +1,37 @@
using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
using UnityEditor;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Editor
{
/// <summary>
/// Add action buttons to LayerManager script
/// </summary>
[CustomEditor(typeof(LayerManager))]
public class LayerManagerEditor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
var script = (LayerManager) target;
EditorGUILayout.LabelField("Service", EditorStyles.boldLabel);
if (GUILayout.Button("Read Sorting Order"))
{
script.GetSpritesBySortingOrder();
}
if (GUILayout.Button("Set Sorting Order"))
{
script.SetSpritesBySortingOrder();
}
if (GUILayout.Button("Copy order"))
{
script.CopyOrder();
}
}
}
using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
using UnityEditor;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Editor
{
/// <summary>
/// Add action buttons to LayerManager script
/// </summary>
[CustomEditor(typeof(LayerManager))]
public class LayerManagerEditor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
var script = (LayerManager) target;
EditorGUILayout.LabelField("Service", EditorStyles.boldLabel);
if (GUILayout.Button("Read Sorting Order"))
{
script.GetSpritesBySortingOrder();
}
if (GUILayout.Button("Set Sorting Order"))
{
script.SetSpritesBySortingOrder();
}
if (GUILayout.Button("Copy order"))
{
script.CopyOrder();
}
}
}
}

View File

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

View File

@@ -1,27 +1,27 @@
using Assets.HeroEditor4D.Common.Scripts.Collections;
using HeroEditor4D.Common.Editor;
using UnityEditor;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Editor
{
/// <summary>
/// Add "Refresh" button to SpriteCollection script
/// </summary>
[CustomEditor(typeof(SpriteCollection))]
public class SpriteCollectionEditor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
var spriteCollection = (SpriteCollection) target;
if (GUILayout.Button("Refresh"))
{
Debug.ClearDeveloperConsole();
SpriteCollectionRefresh.Refresh(spriteCollection);
}
}
}
using Assets.HeroEditor4D.Common.Scripts.Collections;
using HeroEditor4D.Common.Editor;
using UnityEditor;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.Editor
{
/// <summary>
/// Add "Refresh" button to SpriteCollection script
/// </summary>
[CustomEditor(typeof(SpriteCollection))]
public class SpriteCollectionEditor : UnityEditor.Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
var spriteCollection = (SpriteCollection) target;
if (GUILayout.Button("Refresh"))
{
Debug.ClearDeveloperConsole();
SpriteCollectionRefresh.Refresh(spriteCollection);
}
}
}
}

View File

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

View File

@@ -1,127 +1,127 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Assets.HeroEditor4D.Common.Scripts.Collections;
using Assets.HeroEditor4D.Common.Scripts.Data;
using Assets.HeroEditor4D.Common.Scripts.Editor;
using UnityEditor;
using UnityEngine;
namespace HeroEditor4D.Common.Editor
{
/// <summary>
/// Refreshes the main sprite collection when importing new sprite bundles.
/// </summary>
public class SpriteCollectionRefresh : AssetPostprocessor
{
public static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
var spriteCollection = UnityEngine.Object.FindObjectOfType<SpriteCollection>();
if (spriteCollection != null)
{
Refresh(spriteCollection);
}
}
public static void Refresh(SpriteCollection spriteCollection)
{
spriteCollection.Body = LoadSprites(spriteCollection, "/BodyParts/Body");
spriteCollection.Ears = LoadSprites(spriteCollection, "/BodyParts/Ears");
spriteCollection.Hair = LoadSprites(spriteCollection, "/BodyParts/Hair");
spriteCollection.Beard = LoadSprites(spriteCollection, "/BodyParts/Beard");
spriteCollection.Eyebrows = LoadSprites(spriteCollection, "/BodyParts/Eyebrows");
spriteCollection.Eyes = LoadSprites(spriteCollection, "/BodyParts/Eyes");
spriteCollection.Mouth = LoadSprites(spriteCollection, "/BodyParts/Mouth");
spriteCollection.Armor = LoadSprites(spriteCollection, "/Equipment/Armor");
spriteCollection.Cape = LoadSprites(spriteCollection, "/Equipment/Cape");
spriteCollection.Backpack = LoadSprites(spriteCollection, "/Equipment/Back");
spriteCollection.MeleeWeapon1H = LoadSprites(spriteCollection, "/Equipment/MeleeWeapon1H", 1);
spriteCollection.MeleeWeapon2H = LoadSprites(spriteCollection, "/Equipment/MeleeWeapon2H", 1);
spriteCollection.Shield = LoadSprites(spriteCollection, "/Equipment/Shield");
spriteCollection.Supplies = LoadSprites(spriteCollection, "/Equipment/Supplies", 1);
spriteCollection.Bow = LoadSprites(spriteCollection, "/Equipment/Bow");
spriteCollection.Crossbow = LoadSprites(spriteCollection, "/Equipment/Crossbow");
spriteCollection.Firearm1H = LoadSprites(spriteCollection, "/Equipment/Firearm1H");
spriteCollection.Firearm2H = LoadSprites(spriteCollection, "/Equipment/Firearm2H");
spriteCollection.Throwable = LoadSprites(spriteCollection, "/Equipment/Throwable");
spriteCollection.Makeup = LoadSprites(spriteCollection, "/Equipment/Makeup");
spriteCollection.Mask = LoadSprites(spriteCollection, "/Equipment/Mask");
spriteCollection.Earrings = LoadSprites(spriteCollection, "/Equipment/Earrings");
spriteCollection.Firearm1H.ForEach(FirearmMuzzleResolver.Resolve);
spriteCollection.Firearm2H.ForEach(FirearmMuzzleResolver.Resolve);
EditorUtility.SetDirty(spriteCollection);
if (spriteCollection.DebugLogging) Debug.Log("<color=yellow>SpriteCollection: refreshed.</color>");
}
private static List<ItemSprite> LoadSprites(SpriteCollection sc, string subPath, int nesting = 0)
{
var type = subPath.Split('/')[2];
var collection = new List<ItemSprite>();
foreach (var asset in sc.SpriteFolders)
{
if (asset == null) continue;
var path = AssetDatabase.GetAssetPath(asset) + subPath;
if (!Directory.Exists(path)) continue;
var include = sc.CollectionFilter.Where(i => !i.StartsWith("!")).ToList();
var exclude = sc.CollectionFilter.Where(i => i.StartsWith("!")).Select(i => i.Replace("!", "")).ToList();
var extensions = new List<string> { "*.png" };
if (sc.IncludePsd) extensions.Add("*.psd");
foreach (var ext in extensions)
{
var entries = Directory.GetFiles(path, ext, SearchOption.AllDirectories)
.Select(p => p.Replace("\\", "/"))
.Select(p => new ItemSprite(GetEditionName(p), GetCollectionName(p, nesting), type, Path.GetFileNameWithoutExtension(p), p, AssetDatabase.LoadAssetAtPath<Sprite>(p), AssetDatabase.LoadAllAssetsAtPath(p).OfType<Sprite>().ToList()))
.Where(i => (include.Count == 0 || include.Contains(i.Collection)) && !exclude.Contains(i.Collection) || sc.CollectionFilterIgnore.Any(i.Path.Contains) && !exclude.Contains(i.Collection)).ToList();
collection.AddRange(entries);
}
}
foreach (var entry in collection)
{
foreach (Match match in Regex.Matches(entry.Path, @"\[(.+?)\]"))
{
entry.Tags.Add(match.Groups[1].Value);
}
}
return collection.OrderBy(i => i.Name).ToList();
}
private static string GetEditionName(string path)
{
var edition = path.Split('/')[2];
return edition;
}
private static string GetCollectionName(string path, int nesting)
{
var parent = Directory.GetParent(path);
for (var i = 0; i < nesting; i++)
{
parent = parent?.Parent;
}
if (parent == null) throw new NotSupportedException();
return parent.Name;
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Assets.HeroEditor4D.Common.Scripts.Collections;
using Assets.HeroEditor4D.Common.Scripts.Data;
using Assets.HeroEditor4D.Common.Scripts.Editor;
using UnityEditor;
using UnityEngine;
namespace HeroEditor4D.Common.Editor
{
/// <summary>
/// Refreshes the main sprite collection when importing new sprite bundles.
/// </summary>
public class SpriteCollectionRefresh : AssetPostprocessor
{
public static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
var spriteCollection = UnityEngine.Object.FindObjectOfType<SpriteCollection>();
if (spriteCollection != null)
{
Refresh(spriteCollection);
}
}
public static void Refresh(SpriteCollection spriteCollection)
{
spriteCollection.Body = LoadSprites(spriteCollection, "/BodyParts/Body");
spriteCollection.Ears = LoadSprites(spriteCollection, "/BodyParts/Ears");
spriteCollection.Hair = LoadSprites(spriteCollection, "/BodyParts/Hair");
spriteCollection.Beard = LoadSprites(spriteCollection, "/BodyParts/Beard");
spriteCollection.Eyebrows = LoadSprites(spriteCollection, "/BodyParts/Eyebrows");
spriteCollection.Eyes = LoadSprites(spriteCollection, "/BodyParts/Eyes");
spriteCollection.Mouth = LoadSprites(spriteCollection, "/BodyParts/Mouth");
spriteCollection.Armor = LoadSprites(spriteCollection, "/Equipment/Armor");
spriteCollection.Cape = LoadSprites(spriteCollection, "/Equipment/Cape");
spriteCollection.Backpack = LoadSprites(spriteCollection, "/Equipment/Back");
spriteCollection.MeleeWeapon1H = LoadSprites(spriteCollection, "/Equipment/MeleeWeapon1H", 1);
spriteCollection.MeleeWeapon2H = LoadSprites(spriteCollection, "/Equipment/MeleeWeapon2H", 1);
spriteCollection.Shield = LoadSprites(spriteCollection, "/Equipment/Shield");
spriteCollection.Supplies = LoadSprites(spriteCollection, "/Equipment/Supplies", 1);
spriteCollection.Bow = LoadSprites(spriteCollection, "/Equipment/Bow");
spriteCollection.Crossbow = LoadSprites(spriteCollection, "/Equipment/Crossbow");
spriteCollection.Firearm1H = LoadSprites(spriteCollection, "/Equipment/Firearm1H");
spriteCollection.Firearm2H = LoadSprites(spriteCollection, "/Equipment/Firearm2H");
spriteCollection.Throwable = LoadSprites(spriteCollection, "/Equipment/Throwable");
spriteCollection.Makeup = LoadSprites(spriteCollection, "/Equipment/Makeup");
spriteCollection.Mask = LoadSprites(spriteCollection, "/Equipment/Mask");
spriteCollection.Earrings = LoadSprites(spriteCollection, "/Equipment/Earrings");
spriteCollection.Firearm1H.ForEach(FirearmMuzzleResolver.Resolve);
spriteCollection.Firearm2H.ForEach(FirearmMuzzleResolver.Resolve);
EditorUtility.SetDirty(spriteCollection);
if (spriteCollection.DebugLogging) Debug.Log("<color=yellow>SpriteCollection: refreshed.</color>");
}
private static List<ItemSprite> LoadSprites(SpriteCollection sc, string subPath, int nesting = 0)
{
var type = subPath.Split('/')[2];
var collection = new List<ItemSprite>();
foreach (var asset in sc.SpriteFolders)
{
if (asset == null) continue;
var path = AssetDatabase.GetAssetPath(asset) + subPath;
if (!Directory.Exists(path)) continue;
var include = sc.CollectionFilter.Where(i => !i.StartsWith("!")).ToList();
var exclude = sc.CollectionFilter.Where(i => i.StartsWith("!")).Select(i => i.Replace("!", "")).ToList();
var extensions = new List<string> { "*.png" };
if (sc.IncludePsd) extensions.Add("*.psd");
foreach (var ext in extensions)
{
var entries = Directory.GetFiles(path, ext, SearchOption.AllDirectories)
.Select(p => p.Replace("\\", "/"))
.Select(p => new ItemSprite(GetEditionName(p), GetCollectionName(p, nesting), type, Path.GetFileNameWithoutExtension(p), p, AssetDatabase.LoadAssetAtPath<Sprite>(p), AssetDatabase.LoadAllAssetsAtPath(p).OfType<Sprite>().ToList()))
.Where(i => (include.Count == 0 || include.Contains(i.Collection)) && !exclude.Contains(i.Collection) || sc.CollectionFilterIgnore.Any(i.Path.Contains) && !exclude.Contains(i.Collection)).ToList();
collection.AddRange(entries);
}
}
foreach (var entry in collection)
{
foreach (Match match in Regex.Matches(entry.Path, @"\[(.+?)\]"))
{
entry.Tags.Add(match.Groups[1].Value);
}
}
return collection.OrderBy(i => i.Name).ToList();
}
private static string GetEditionName(string path)
{
var edition = path.Split('/')[2];
return edition;
}
private static string GetCollectionName(string path, int nesting)
{
var parent = Directory.GetParent(path);
for (var i = 0; i < nesting; i++)
{
parent = parent?.Parent;
}
if (parent == null) throw new NotSupportedException();
return parent.Name;
}
}
}

View File

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

View File

@@ -1,35 +1,35 @@
using System;
using UnityEngine;
namespace HeroEditor4D.Common.Editor
{
[ExecuteInEditMode]
public class TransformNormalizer : MonoBehaviour
{
public bool ZeroZ;
public bool RoundTransform;
public int RoundTransformDigits;
public void OnEnable()
{
if (ZeroZ)
{
foreach (var t in GetComponentsInChildren<Transform>())
{
t.localPosition = new Vector3(t.localPosition.x, t.localPosition.y, 0);
}
}
if (RoundTransform)
{
foreach (var t in GetComponentsInChildren<Transform>())
{
t.localPosition = new Vector3(
(float) Math.Round(t.localPosition.x, RoundTransformDigits),
(float) Math.Round(t.localPosition.y, RoundTransformDigits),
(float) Math.Round(t.localPosition.z, RoundTransformDigits));
}
}
}
}
using System;
using UnityEngine;
namespace HeroEditor4D.Common.Editor
{
[ExecuteInEditMode]
public class TransformNormalizer : MonoBehaviour
{
public bool ZeroZ;
public bool RoundTransform;
public int RoundTransformDigits;
public void OnEnable()
{
if (ZeroZ)
{
foreach (var t in GetComponentsInChildren<Transform>())
{
t.localPosition = new Vector3(t.localPosition.x, t.localPosition.y, 0);
}
}
if (RoundTransform)
{
foreach (var t in GetComponentsInChildren<Transform>())
{
t.localPosition = new Vector3(
(float) Math.Round(t.localPosition.x, RoundTransformDigits),
(float) Math.Round(t.localPosition.y, RoundTransformDigits),
(float) Math.Round(t.localPosition.z, RoundTransformDigits));
}
}
}
}
}

View File

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

View File

@@ -1,10 +1,10 @@
fileFormatVersion: 2
guid: 6aa568607f734861a39324ee92c2f5d6
folderAsset: yes
timeCreated: 1516802262
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 6aa568607f734861a39324ee92c2f5d6
folderAsset: yes
timeCreated: 1516802262
licenseType: Store
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,116 +1,116 @@
using System.Collections.Generic;
using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
public class CaptureOptions : MonoBehaviour
{
public Toggle Left;
public Toggle Right;
public Toggle Front;
public Toggle Back;
public Toggle Idle;
public Toggle Ready;
public Toggle Walk;
public Toggle Run;
public Toggle Slash;
public Toggle Jab;
public Toggle Shot;
public Toggle Cast;
public Toggle Block;
public Toggle Jump;
public Toggle Climb;
public Toggle Death;
public Toggle Shadow;
public InputField FrameSize;
public InputField FrameCount;
public void Open()
{
gameObject.SetActive(true);
}
public void Close()
{
gameObject.SetActive(false);
}
public void Capture()
{
var direction = Vector2.right;
if (Right.isOn) direction = Vector2.right;
if (Left.isOn) direction = Vector2.left;
if (Front.isOn) direction = Vector2.down;
if (Back.isOn) direction = Vector2.up;
var options = new List<CaptureOption>();
if (Idle.isOn) options.Add(new CaptureOption("Idle"));
if (Ready.isOn) options.Add(new CaptureOption("Ready"));
if (Walk.isOn) options.Add(new CaptureOption("Walk"));
if (Run.isOn) options.Add(new CaptureOption("Run"));
if (Slash.isOn) options.Add(new CaptureOption("Idle", FindObjectOfType<Character4D>().WeaponType == WeaponType.Melee2H ? "Slash2H" : "Slash1H"));
if (Jab.isOn) options.Add(new CaptureOption("Idle", "Jab"));
if (Shot.isOn)
{
var character = FindObjectOfType<Character>();
switch (character.WeaponType)
{
case WeaponType.Bow:
options.Add(new CaptureOption("Idle", "ShotBow"));
break;
case WeaponType.Firearm1H:
options.Add(new CaptureOption("Ready", "Fire1H"));
break;
case WeaponType.Firearm2H:
options.Add(new CaptureOption("Ready", "Fire2H"));
break;
case WeaponType.Paired:
options.Add(new CaptureOption("Idle", "SecondaryShot"));
break;
}
}
if (Cast.isOn) options.Add(new CaptureOption("Idle", "Cast"));
if (Block.isOn) options.Add(new CaptureOption("ShieldBlock"));
if (Jump.isOn) options.Add(new CaptureOption("Jump", "Idle"));
if (Climb.isOn) options.Add(new CaptureOption("Climb"));
if (Death.isOn) options.Add(new CaptureOption(null, null, "Death"));
FindObjectOfType<SpriteSheetCapture>().Capture(direction, options, int.Parse(FrameSize.text), int.Parse(FrameCount.text), Shadow.isOn);
Close();
}
public void OnFrameSizeChanged(string value)
{
if (FrameSize.text == "") return;
var valueInt = int.Parse(value);
if (valueInt < 128) valueInt = 128;
if (valueInt > 512) valueInt = 512;
FrameSize.SetTextWithoutNotify(valueInt.ToString());
}
public void OnFrameCountChanged(string value)
{
if (FrameCount.text == "") return;
var valueInt = int.Parse(value);
if (valueInt < 4) valueInt = 4;
if (valueInt > 16) valueInt = 16;
FrameCount.SetTextWithoutNotify(valueInt.ToString());
}
}
using System.Collections.Generic;
using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
public class CaptureOptions : MonoBehaviour
{
public Toggle Left;
public Toggle Right;
public Toggle Front;
public Toggle Back;
public Toggle Idle;
public Toggle Ready;
public Toggle Walk;
public Toggle Run;
public Toggle Slash;
public Toggle Jab;
public Toggle Shot;
public Toggle Cast;
public Toggle Block;
public Toggle Jump;
public Toggle Climb;
public Toggle Death;
public Toggle Shadow;
public InputField FrameSize;
public InputField FrameCount;
public void Open()
{
gameObject.SetActive(true);
}
public void Close()
{
gameObject.SetActive(false);
}
public void Capture()
{
var direction = Vector2.right;
if (Right.isOn) direction = Vector2.right;
if (Left.isOn) direction = Vector2.left;
if (Front.isOn) direction = Vector2.down;
if (Back.isOn) direction = Vector2.up;
var options = new List<CaptureOption>();
if (Idle.isOn) options.Add(new CaptureOption("Idle"));
if (Ready.isOn) options.Add(new CaptureOption("Ready"));
if (Walk.isOn) options.Add(new CaptureOption("Walk"));
if (Run.isOn) options.Add(new CaptureOption("Run"));
if (Slash.isOn) options.Add(new CaptureOption("Idle", FindObjectOfType<Character4D>().WeaponType == WeaponType.Melee2H ? "Slash2H" : "Slash1H"));
if (Jab.isOn) options.Add(new CaptureOption("Idle", "Jab"));
if (Shot.isOn)
{
var character = FindObjectOfType<Character>();
switch (character.WeaponType)
{
case WeaponType.Bow:
options.Add(new CaptureOption("Idle", "ShotBow"));
break;
case WeaponType.Firearm1H:
options.Add(new CaptureOption("Ready", "Fire1H"));
break;
case WeaponType.Firearm2H:
options.Add(new CaptureOption("Ready", "Fire2H"));
break;
case WeaponType.Paired:
options.Add(new CaptureOption("Idle", "SecondaryShot"));
break;
}
}
if (Cast.isOn) options.Add(new CaptureOption("Idle", "Cast"));
if (Block.isOn) options.Add(new CaptureOption("ShieldBlock"));
if (Jump.isOn) options.Add(new CaptureOption("Jump", "Idle"));
if (Climb.isOn) options.Add(new CaptureOption("Climb"));
if (Death.isOn) options.Add(new CaptureOption(null, null, "Death"));
FindObjectOfType<SpriteSheetCapture>().Capture(direction, options, int.Parse(FrameSize.text), int.Parse(FrameCount.text), Shadow.isOn);
Close();
}
public void OnFrameSizeChanged(string value)
{
if (FrameSize.text == "") return;
var valueInt = int.Parse(value);
if (valueInt < 128) valueInt = 128;
if (valueInt > 512) valueInt = 512;
FrameSize.SetTextWithoutNotify(valueInt.ToString());
}
public void OnFrameCountChanged(string value)
{
if (FrameCount.text == "") return;
var valueInt = int.Parse(value);
if (valueInt < 4) valueInt = 4;
if (valueInt > 16) valueInt = 16;
FrameCount.SetTextWithoutNotify(valueInt.ToString());
}
}
}

View File

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

View File

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

View File

@@ -1,21 +1,21 @@
using System;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
public class ColorSetup : MonoBehaviour
{
public Slider Hue;
public Slider Saturation;
public Slider Brightness;
public Color Color;
public Action<float, float, float> OnColorChanged;
public void OnSliderChanged()
{
OnColorChanged?.Invoke(Hue.value, Saturation.value, Brightness.value);
}
}
using System;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
public class ColorSetup : MonoBehaviour
{
public Slider Hue;
public Slider Saturation;
public Slider Brightness;
public Color Color;
public Action<float, float, float> OnColorChanged;
public void OnSliderChanged()
{
OnColorChanged?.Invoke(Hue.value, Saturation.value, Brightness.value);
}
}
}

View File

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

View File

@@ -1,44 +1,44 @@
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
public class HuePaint : MonoBehaviour
{
[Range(0.0f, 1.0f)]
public float Hue;
private MaterialPropertyBlock _materialPropertyBlock;
private SpriteRenderer _spriteRenderer;
private readonly int _shaderColor = Shader.PropertyToID("_Color");
private readonly int _shaderHue = Shader.PropertyToID("_Hue");
public void OnValidate()
{
if (Hue > 0)
{
ShiftHue();
}
}
public void Start()
{
if (Hue > 0)
{
ShiftHue();
}
}
public void ShiftHue()
{
_materialPropertyBlock ??= new MaterialPropertyBlock();
_spriteRenderer ??= GetComponent<SpriteRenderer>();
var spriteColor = _spriteRenderer.color;
_materialPropertyBlock.SetColor(_shaderColor, spriteColor);
_materialPropertyBlock.SetFloat(_shaderHue, Hue);
_spriteRenderer.SetPropertyBlock(_materialPropertyBlock);
}
}
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
public class HuePaint : MonoBehaviour
{
[Range(0.0f, 1.0f)]
public float Hue;
private MaterialPropertyBlock _materialPropertyBlock;
private SpriteRenderer _spriteRenderer;
private readonly int _shaderColor = Shader.PropertyToID("_Color");
private readonly int _shaderHue = Shader.PropertyToID("_Hue");
public void OnValidate()
{
if (Hue > 0)
{
ShiftHue();
}
}
public void Start()
{
if (Hue > 0)
{
ShiftHue();
}
}
public void ShiftHue()
{
_materialPropertyBlock ??= new MaterialPropertyBlock();
_spriteRenderer ??= GetComponent<SpriteRenderer>();
var spriteColor = _spriteRenderer.color;
_materialPropertyBlock.SetColor(_shaderColor, spriteColor);
_materialPropertyBlock.SetFloat(_shaderHue, Hue);
_spriteRenderer.SetPropertyBlock(_materialPropertyBlock);
}
}
}

View File

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

View File

@@ -1,12 +1,12 @@
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
public class NavigateButton : MonoBehaviour
{
public void Navigate(string url)
{
Application.OpenURL(url);
}
}
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
public class NavigateButton : MonoBehaviour
{
public void Navigate(string url)
{
Application.OpenURL(url);
}
}
}

View File

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

View File

@@ -1,16 +1,16 @@
using UnityEngine;
using UnityEngine.UI;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
/// <summary>
/// Used to set Slider zero value.
/// </summary>
public class SliderReset : MonoBehaviour
{
public void Reset()
{
GetComponentInParent<Slider>().value = 0;
}
}
using UnityEngine;
using UnityEngine.UI;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
/// <summary>
/// Used to set Slider zero value.
/// </summary>
public class SliderReset : MonoBehaviour
{
public void Reset()
{
GetComponentInParent<Slider>().value = 0;
}
}
}

View File

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

View File

@@ -1,231 +1,231 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
using Assets.HeroEditor4D.Common.Scripts.Common;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
/// <summary>
/// Used for creating sprite sheets for frame-by-frame animation.
/// </summary>
public class SpriteSequenceCapture : MonoBehaviour
{
public Character4D Character4D;
public GameObject Canvas;
public GameObject Camera;
public string UpperBodyAnimationFolder;
public string LowerBodyAnimationFolder;
public string ComplexAnimationFolder;
public List<string> UpperBodyClipNames;
public List<string> LowerBodyClipNames;
public List<string> ComplexClipNames;
public Dropdown DirectionDropdown;
public Dropdown PrimaryAnimationDropdown;
public Dropdown SecondaryAnimationDropdown;
public Slider CameraSizeSlider;
public Dropdown FrameSizeDropdown;
public Dropdown FrameRatioDropdown;
public Dropdown ScreenshotIntervalDropdown;
public Dropdown ShadowDropdown;
public GameObject Shadow;
public ScreenshotTransparent ScreenshotTransparent;
#if UNITY_EDITOR
/// <summary>
/// Called only in Editor.
/// </summary>
public void OnValidate()
{
UpperBodyClipNames = Directory.GetFiles(UpperBodyAnimationFolder, "*.anim", SearchOption.AllDirectories).Select(Path.GetFileNameWithoutExtension).ToList();
LowerBodyClipNames = Directory.GetFiles(LowerBodyAnimationFolder, "*.anim", SearchOption.AllDirectories).Select(Path.GetFileNameWithoutExtension).ToList();
ComplexClipNames = Directory.GetFiles(ComplexAnimationFolder, "*.anim", SearchOption.AllDirectories).Select(Path.GetFileNameWithoutExtension).ToList();
UpperBodyClipNames.AddRange(ComplexClipNames);
for (var i = 0; i < UpperBodyClipNames.Count; i++)
{
if (UpperBodyClipNames[i].EndsWith("U")) UpperBodyClipNames[i] = UpperBodyClipNames[i].Substring(0, UpperBodyClipNames[i].Length - 1);
}
for (var i = 0; i < LowerBodyClipNames.Count; i++)
{
if (LowerBodyClipNames[i].EndsWith("L")) LowerBodyClipNames[i] = LowerBodyClipNames[i].Substring(0, LowerBodyClipNames[i].Length - 1);
}
PrimaryAnimationDropdown.options = new List<Dropdown.OptionData>();
SecondaryAnimationDropdown.options = new List<Dropdown.OptionData>();
foreach (var clipName in UpperBodyClipNames)
{
PrimaryAnimationDropdown.options.Add(new Dropdown.OptionData(clipName));
}
foreach (var clipName in LowerBodyClipNames)
{
SecondaryAnimationDropdown.options.Add(new Dropdown.OptionData(clipName));
}
PrimaryAnimationDropdown.value = UpperBodyClipNames.IndexOf("Slash1H");
SecondaryAnimationDropdown.value = LowerBodyClipNames.IndexOf("Idle");
}
/// <summary>
/// Called on start.
/// </summary>
public void Start()
{
if (Character4D) Character4D.SetDirection(Vector2.left);
foreach (var dropdown in new[] { PrimaryAnimationDropdown, SecondaryAnimationDropdown, FrameSizeDropdown, FrameRatioDropdown, ScreenshotIntervalDropdown, ShadowDropdown })
{
dropdown.RefreshShownValue();
}
if (UpperBodyClipNames.Count == 0) OnValidate();
}
/// <summary>
/// Called when direction dropdown changed.
/// </summary>
/// <param name="value"></param>
public void OnDirectionChanged(int value)
{
switch (value)
{
case 0: Character4D.SetDirection(Vector2.left); break;
case 1: Character4D.SetDirection(Vector2.right); break;
case 2: Character4D.SetDirection(Vector2.down); break;
case 3: Character4D.SetDirection(Vector2.up); break;
}
}
/// <summary>
/// Load character from prefab.
/// </summary>
public void Load()
{
var path = UnityEditor.EditorUtility.OpenFilePanel("Open character prefab", "", "prefab");
if (path.Length > 0)
{
path = "Assets" + path.Replace(Application.dataPath, null);
Load(path);
}
}
/// <summary>
/// Load character from prefab by given path.
/// </summary>
public void Load(string path)
{
var character = UnityEditor.AssetDatabase.LoadAssetAtPath<Character4D>(path);
if (character == null) throw new Exception("Error loading character, please make sure you are loading correct prefab!");
if (Character4D != null) Destroy(Character4D.gameObject);
Character4D = Instantiate(character, transform);
Character4D.transform.localPosition = Vector3.zero;
Shadow = Character4D.transform.Find("Shadow").gameObject;
OnDirectionChanged(DirectionDropdown.value);
var mat = new Material(Shader.Find("Sprites/Default"));
foreach (var spriteRenderer in Character4D.GetComponentsInChildren<SpriteRenderer>())
{
if (spriteRenderer.name != "Eyes")
{
spriteRenderer.material = mat;
}
}
Debug.LogWarning("All materials were replaced by [Sprites/Default] to avoid outline artefacts.");
}
/// <summary>
/// Create sprite sheet.
/// </summary>
public void Capture()
{
var frameSize = new[] { 256, 512, 1024 }[FrameSizeDropdown.value];
var frameRatio = FrameRatioDropdown.value + 4;
var interval = new[] { 0.1f, 0.25f, 0.5f, 1f }[ScreenshotIntervalDropdown.value];
Camera.GetComponent<Camera>().orthographicSize = CameraSizeSlider.value;
Shadow.SetActive(ShadowDropdown.value == 0);
var upperClips = new List<string> { UpperBodyClipNames[PrimaryAnimationDropdown.value] };
var lowerClips = new List<string> { LowerBodyClipNames[SecondaryAnimationDropdown.value] };
StartCoroutine(CaptureFrames(upperClips, lowerClips, frameSize, frameRatio, interval));
}
private void ShowFrame(string upperClip, string lowerClip, float normalizedTime)
{
if (ComplexClipNames.Contains(upperClip))
{
Character4D.Animator.Play(upperClip, 2, normalizedTime);
}
else
{
Character4D.Animator.Play(upperClip, 1, normalizedTime);
Character4D.Animator.Play(lowerClip, 0, normalizedTime);
}
Character4D.Animator.speed = 0;
if (Character4D.Animator.IsInTransition(1))
{
Debug.Log("IsInTransition");
}
}
private IEnumerator CaptureFrames(List<string> upperClips, List<string> lowerClips, int frameSize, int frameRatio, float interval)
{
Canvas.SetActive(false);
var death = upperClips.Any(i => i.Contains("Death"));
foreach (var upperClip in upperClips)
{
foreach (var lowerClip in lowerClips)
{
for (var i = 0; i < frameRatio; i++)
{
ShowFrame(upperClip, lowerClip, (float) i / (frameRatio - 1));
yield return new WaitForSeconds(interval);
string direction;
switch (DirectionDropdown.value)
{
case 0: direction = "Left"; break;
case 1: direction = "Right"; break;
case 2: direction = "Front"; break;
case 3: direction = "Back"; break;
default: throw new NotImplementedException();
}
var path = death ? $"{Application.dataPath.Replace("/Assets", null)}/SpriteSheets/{direction}/{upperClip}/{i}.png" : $"{Application.dataPath.Replace("/Assets", null)}/SpriteSheets/{direction}/{upperClip}-{lowerClip}/{i}.png";
ScreenshotTransparent.Width = ScreenshotTransparent.Height = frameSize;
ScreenshotTransparent.Capture(path);
}
}
if (death) break;
}
Canvas.SetActive(true);
}
#endif
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
using Assets.HeroEditor4D.Common.Scripts.Common;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
/// <summary>
/// Used for creating sprite sheets for frame-by-frame animation.
/// </summary>
public class SpriteSequenceCapture : MonoBehaviour
{
public Character4D Character4D;
public GameObject Canvas;
public GameObject Camera;
public string UpperBodyAnimationFolder;
public string LowerBodyAnimationFolder;
public string ComplexAnimationFolder;
public List<string> UpperBodyClipNames;
public List<string> LowerBodyClipNames;
public List<string> ComplexClipNames;
public Dropdown DirectionDropdown;
public Dropdown PrimaryAnimationDropdown;
public Dropdown SecondaryAnimationDropdown;
public Slider CameraSizeSlider;
public Dropdown FrameSizeDropdown;
public Dropdown FrameRatioDropdown;
public Dropdown ScreenshotIntervalDropdown;
public Dropdown ShadowDropdown;
public GameObject Shadow;
public ScreenshotTransparent ScreenshotTransparent;
#if UNITY_EDITOR
/// <summary>
/// Called only in Editor.
/// </summary>
public void OnValidate()
{
UpperBodyClipNames = Directory.GetFiles(UpperBodyAnimationFolder, "*.anim", SearchOption.AllDirectories).Select(Path.GetFileNameWithoutExtension).ToList();
LowerBodyClipNames = Directory.GetFiles(LowerBodyAnimationFolder, "*.anim", SearchOption.AllDirectories).Select(Path.GetFileNameWithoutExtension).ToList();
ComplexClipNames = Directory.GetFiles(ComplexAnimationFolder, "*.anim", SearchOption.AllDirectories).Select(Path.GetFileNameWithoutExtension).ToList();
UpperBodyClipNames.AddRange(ComplexClipNames);
for (var i = 0; i < UpperBodyClipNames.Count; i++)
{
if (UpperBodyClipNames[i].EndsWith("U")) UpperBodyClipNames[i] = UpperBodyClipNames[i].Substring(0, UpperBodyClipNames[i].Length - 1);
}
for (var i = 0; i < LowerBodyClipNames.Count; i++)
{
if (LowerBodyClipNames[i].EndsWith("L")) LowerBodyClipNames[i] = LowerBodyClipNames[i].Substring(0, LowerBodyClipNames[i].Length - 1);
}
PrimaryAnimationDropdown.options = new List<Dropdown.OptionData>();
SecondaryAnimationDropdown.options = new List<Dropdown.OptionData>();
foreach (var clipName in UpperBodyClipNames)
{
PrimaryAnimationDropdown.options.Add(new Dropdown.OptionData(clipName));
}
foreach (var clipName in LowerBodyClipNames)
{
SecondaryAnimationDropdown.options.Add(new Dropdown.OptionData(clipName));
}
PrimaryAnimationDropdown.value = UpperBodyClipNames.IndexOf("Slash1H");
SecondaryAnimationDropdown.value = LowerBodyClipNames.IndexOf("Idle");
}
/// <summary>
/// Called on start.
/// </summary>
public void Start()
{
if (Character4D) Character4D.SetDirection(Vector2.left);
foreach (var dropdown in new[] { PrimaryAnimationDropdown, SecondaryAnimationDropdown, FrameSizeDropdown, FrameRatioDropdown, ScreenshotIntervalDropdown, ShadowDropdown })
{
dropdown.RefreshShownValue();
}
if (UpperBodyClipNames.Count == 0) OnValidate();
}
/// <summary>
/// Called when direction dropdown changed.
/// </summary>
/// <param name="value"></param>
public void OnDirectionChanged(int value)
{
switch (value)
{
case 0: Character4D.SetDirection(Vector2.left); break;
case 1: Character4D.SetDirection(Vector2.right); break;
case 2: Character4D.SetDirection(Vector2.down); break;
case 3: Character4D.SetDirection(Vector2.up); break;
}
}
/// <summary>
/// Load character from prefab.
/// </summary>
public void Load()
{
var path = UnityEditor.EditorUtility.OpenFilePanel("Open character prefab", "", "prefab");
if (path.Length > 0)
{
path = "Assets" + path.Replace(Application.dataPath, null);
Load(path);
}
}
/// <summary>
/// Load character from prefab by given path.
/// </summary>
public void Load(string path)
{
var character = UnityEditor.AssetDatabase.LoadAssetAtPath<Character4D>(path);
if (character == null) throw new Exception("Error loading character, please make sure you are loading correct prefab!");
if (Character4D != null) Destroy(Character4D.gameObject);
Character4D = Instantiate(character, transform);
Character4D.transform.localPosition = Vector3.zero;
Shadow = Character4D.transform.Find("Shadow").gameObject;
OnDirectionChanged(DirectionDropdown.value);
var mat = new Material(Shader.Find("Sprites/Default"));
foreach (var spriteRenderer in Character4D.GetComponentsInChildren<SpriteRenderer>())
{
if (spriteRenderer.name != "Eyes")
{
spriteRenderer.material = mat;
}
}
Debug.LogWarning("All materials were replaced by [Sprites/Default] to avoid outline artefacts.");
}
/// <summary>
/// Create sprite sheet.
/// </summary>
public void Capture()
{
var frameSize = new[] { 256, 512, 1024 }[FrameSizeDropdown.value];
var frameRatio = FrameRatioDropdown.value + 4;
var interval = new[] { 0.1f, 0.25f, 0.5f, 1f }[ScreenshotIntervalDropdown.value];
Camera.GetComponent<Camera>().orthographicSize = CameraSizeSlider.value;
Shadow.SetActive(ShadowDropdown.value == 0);
var upperClips = new List<string> { UpperBodyClipNames[PrimaryAnimationDropdown.value] };
var lowerClips = new List<string> { LowerBodyClipNames[SecondaryAnimationDropdown.value] };
StartCoroutine(CaptureFrames(upperClips, lowerClips, frameSize, frameRatio, interval));
}
private void ShowFrame(string upperClip, string lowerClip, float normalizedTime)
{
if (ComplexClipNames.Contains(upperClip))
{
Character4D.Animator.Play(upperClip, 2, normalizedTime);
}
else
{
Character4D.Animator.Play(upperClip, 1, normalizedTime);
Character4D.Animator.Play(lowerClip, 0, normalizedTime);
}
Character4D.Animator.speed = 0;
if (Character4D.Animator.IsInTransition(1))
{
Debug.Log("IsInTransition");
}
}
private IEnumerator CaptureFrames(List<string> upperClips, List<string> lowerClips, int frameSize, int frameRatio, float interval)
{
Canvas.SetActive(false);
var death = upperClips.Any(i => i.Contains("Death"));
foreach (var upperClip in upperClips)
{
foreach (var lowerClip in lowerClips)
{
for (var i = 0; i < frameRatio; i++)
{
ShowFrame(upperClip, lowerClip, (float) i / (frameRatio - 1));
yield return new WaitForSeconds(interval);
string direction;
switch (DirectionDropdown.value)
{
case 0: direction = "Left"; break;
case 1: direction = "Right"; break;
case 2: direction = "Front"; break;
case 3: direction = "Back"; break;
default: throw new NotImplementedException();
}
var path = death ? $"{Application.dataPath.Replace("/Assets", null)}/SpriteSheets/{direction}/{upperClip}/{i}.png" : $"{Application.dataPath.Replace("/Assets", null)}/SpriteSheets/{direction}/{upperClip}-{lowerClip}/{i}.png";
ScreenshotTransparent.Width = ScreenshotTransparent.Height = frameSize;
ScreenshotTransparent.Capture(path);
}
}
if (death) break;
}
Canvas.SetActive(true);
}
#endif
}
}

View File

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

View File

@@ -1,185 +1,185 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
[RequireComponent(typeof(Camera))]
public class SpriteSheetCapture : MonoBehaviour
{
private Character4D _character;
public void Capture(Vector2 direction, List<CaptureOption> options, int frameSize, int frameCount, bool shadow)
{
StartCoroutine(CaptureFrames(direction, options, frameSize, frameCount, shadow));
}
private IEnumerator CaptureFrames(Vector2 direction, List<CaptureOption> options, int frameSize, int frameCount, bool shadow)
{
_character = FindObjectOfType<Character4D>();
_character.SetDirection(direction);
_character.Shadows.ForEach(i => i.SetActive(false));
_character.Shadows[0].SetActive(shadow);
var stateHandler = _character.Animator.GetBehaviours<StateHandler>().SingleOrDefault(i => i.Name == "Death");
if (stateHandler)
{
stateHandler.StateExit.RemoveAllListeners();
}
var clips = new List<List<Texture2D>>();
foreach (var option in options)
{
_character.SetExpression("Default");
_character.AnimationManager.SetState(CharacterState.Idle);
_character.Animator.speed = 99;
yield return null;
_character.Animator.speed = 0;
var frames = new List<Texture2D>();
for (var j = 0; j < frameCount; j++)
{
var normalizedTime = (float) j / (frameCount - 1);
yield return ShowFrame(option.StateL, option.StateU, option.StateC, normalizedTime);
var clip = _character.Animator.GetCurrentAnimatorClipInfo(option.StateU == null ? 2 : 1)[0].clip;
var expressionEvent = clip.events.Where(i => i.functionName == "SetExpression" && Mathf.Abs(i.time / clip.length - normalizedTime) <= 1f / (frameCount - 1))
.OrderBy(i => Mathf.Abs(i.time / clip.length - normalizedTime)).FirstOrDefault();
if (expressionEvent != null)
{
_character.SetExpression(expressionEvent.stringParameter);
}
var frame = CaptureFrame(frameSize, frameSize);
frames.Add(frame);
yield return null;
}
clips.Add(frames);
}
_character.AnimationManager.SetState(CharacterState.Idle);
_character.Animator.speed = 1;
if (stateHandler)
{
stateHandler.StateExit.AddListener(() => _character.SetExpression("Default"));
}
var texture = CreateSheet(clips, frameSize, frameSize);
yield return StandaloneFilePicker.SaveFile("Save as sprite sheet", "", "Character", ".png", texture.EncodeToPNG(), (success, path) => { Debug.Log(success ? $"Saved as {path}" : "Error saving."); });
}
private IEnumerator ShowFrame(string stateL, string stateU, string stateC, float normalizedTime)
{
switch (stateU)
{
case "Idle" when _character.WeaponType == WeaponType.Firearm1H:
stateU = "IdleFirearm1H";
break;
case "Idle" when _character.WeaponType == WeaponType.Firearm2H:
stateU = "IdleFirearm2H";
break;
case "Ready" when _character.WeaponType == WeaponType.Firearm1H:
stateU = "ReadyFirearm1H";
break;
case "Ready" when _character.WeaponType == WeaponType.Firearm2H:
stateU = "ReadyFirearm2H";
break;
case "Ready":
stateU = "Ready1H";
break;
}
if (stateC != null)
{
_character.Animator.Play(stateC, 2, normalizedTime);
}
else
{
_character.Animator.Play(stateL, 0, normalizedTime);
_character.Animator.Play(stateU, 1, normalizedTime);
}
yield return null;
while (_character.Animator.GetCurrentAnimatorClipInfo(stateC == null ? 0 : 2).Length == 0)
{
yield return null;
}
if (_character.Animator.IsInTransition(1))
{
Debug.Log("IsInTransition");
}
}
private Texture2D CaptureFrame(int width, int height)
{
var cam = GetComponent<Camera>();
var renderTexture = new RenderTexture(width, height, 24);
var texture2D = new Texture2D(width, height, TextureFormat.ARGB32, false);
cam.targetTexture = renderTexture;
cam.Render();
RenderTexture.active = renderTexture;
texture2D.ReadPixels(new Rect(0, 0, width, height), 0, 0);
cam.targetTexture = null;
RenderTexture.active = null;
Destroy(renderTexture);
return texture2D;
}
private static Texture2D CreateSheet(List<List<Texture2D>> clips, int width, int height)
{
var texture = new Texture2D(clips[0].Count * width, clips.Count * height);
for (var i = 0; i < clips.Count; i++)
{
for (var j = 0; j < clips[i].Count; j++)
{
texture.SetPixels(j * width, (clips.Count - 1 - i) * height, width, height, clips[i][j].GetPixels());
}
}
texture.Apply();
return texture;
}
}
public class CaptureOption
{
public string StateL;
public string StateU;
public string StateC;
public CaptureOption(string stateL)
{
StateL = stateL;
StateU = stateL;
}
public CaptureOption(string stateL, string stateU, string stateC = null)
{
StateL = stateL;
StateU = stateU;
StateC = stateC;
}
}
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
using Assets.HeroEditor4D.Common.Scripts.Common;
using Assets.HeroEditor4D.Common.Scripts.Enums;
using UnityEngine;
namespace Assets.HeroEditor4D.Common.Scripts.EditorScripts
{
[RequireComponent(typeof(Camera))]
public class SpriteSheetCapture : MonoBehaviour
{
private Character4D _character;
public void Capture(Vector2 direction, List<CaptureOption> options, int frameSize, int frameCount, bool shadow)
{
StartCoroutine(CaptureFrames(direction, options, frameSize, frameCount, shadow));
}
private IEnumerator CaptureFrames(Vector2 direction, List<CaptureOption> options, int frameSize, int frameCount, bool shadow)
{
_character = FindObjectOfType<Character4D>();
_character.SetDirection(direction);
_character.Shadows.ForEach(i => i.SetActive(false));
_character.Shadows[0].SetActive(shadow);
var stateHandler = _character.Animator.GetBehaviours<StateHandler>().SingleOrDefault(i => i.Name == "Death");
if (stateHandler)
{
stateHandler.StateExit.RemoveAllListeners();
}
var clips = new List<List<Texture2D>>();
foreach (var option in options)
{
_character.SetExpression("Default");
_character.AnimationManager.SetState(CharacterState.Idle);
_character.Animator.speed = 99;
yield return null;
_character.Animator.speed = 0;
var frames = new List<Texture2D>();
for (var j = 0; j < frameCount; j++)
{
var normalizedTime = (float) j / (frameCount - 1);
yield return ShowFrame(option.StateL, option.StateU, option.StateC, normalizedTime);
var clip = _character.Animator.GetCurrentAnimatorClipInfo(option.StateU == null ? 2 : 1)[0].clip;
var expressionEvent = clip.events.Where(i => i.functionName == "SetExpression" && Mathf.Abs(i.time / clip.length - normalizedTime) <= 1f / (frameCount - 1))
.OrderBy(i => Mathf.Abs(i.time / clip.length - normalizedTime)).FirstOrDefault();
if (expressionEvent != null)
{
_character.SetExpression(expressionEvent.stringParameter);
}
var frame = CaptureFrame(frameSize, frameSize);
frames.Add(frame);
yield return null;
}
clips.Add(frames);
}
_character.AnimationManager.SetState(CharacterState.Idle);
_character.Animator.speed = 1;
if (stateHandler)
{
stateHandler.StateExit.AddListener(() => _character.SetExpression("Default"));
}
var texture = CreateSheet(clips, frameSize, frameSize);
yield return StandaloneFilePicker.SaveFile("Save as sprite sheet", "", "Character", ".png", texture.EncodeToPNG(), (success, path) => { Debug.Log(success ? $"Saved as {path}" : "Error saving."); });
}
private IEnumerator ShowFrame(string stateL, string stateU, string stateC, float normalizedTime)
{
switch (stateU)
{
case "Idle" when _character.WeaponType == WeaponType.Firearm1H:
stateU = "IdleFirearm1H";
break;
case "Idle" when _character.WeaponType == WeaponType.Firearm2H:
stateU = "IdleFirearm2H";
break;
case "Ready" when _character.WeaponType == WeaponType.Firearm1H:
stateU = "ReadyFirearm1H";
break;
case "Ready" when _character.WeaponType == WeaponType.Firearm2H:
stateU = "ReadyFirearm2H";
break;
case "Ready":
stateU = "Ready1H";
break;
}
if (stateC != null)
{
_character.Animator.Play(stateC, 2, normalizedTime);
}
else
{
_character.Animator.Play(stateL, 0, normalizedTime);
_character.Animator.Play(stateU, 1, normalizedTime);
}
yield return null;
while (_character.Animator.GetCurrentAnimatorClipInfo(stateC == null ? 0 : 2).Length == 0)
{
yield return null;
}
if (_character.Animator.IsInTransition(1))
{
Debug.Log("IsInTransition");
}
}
private Texture2D CaptureFrame(int width, int height)
{
var cam = GetComponent<Camera>();
var renderTexture = new RenderTexture(width, height, 24);
var texture2D = new Texture2D(width, height, TextureFormat.ARGB32, false);
cam.targetTexture = renderTexture;
cam.Render();
RenderTexture.active = renderTexture;
texture2D.ReadPixels(new Rect(0, 0, width, height), 0, 0);
cam.targetTexture = null;
RenderTexture.active = null;
Destroy(renderTexture);
return texture2D;
}
private static Texture2D CreateSheet(List<List<Texture2D>> clips, int width, int height)
{
var texture = new Texture2D(clips[0].Count * width, clips.Count * height);
for (var i = 0; i < clips.Count; i++)
{
for (var j = 0; j < clips[i].Count; j++)
{
texture.SetPixels(j * width, (clips.Count - 1 - i) * height, width, height, clips[i][j].GetPixels());
}
}
texture.Apply();
return texture;
}
}
public class CaptureOption
{
public string StateL;
public string StateU;
public string StateC;
public CaptureOption(string stateL)
{
StateL = stateL;
StateU = stateL;
}
public CaptureOption(string stateL, string stateU, string stateC = null)
{
StateL = stateL;
StateU = stateU;
StateC = stateC;
}
}
}

View File

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

View File

@@ -1,87 +1,87 @@
using System;
using System.Collections;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
public static class StandaloneFilePicker
{
#if UNITY_EDITOR
public static IEnumerator OpenFile(string title, string directory, string extension, Action<bool, string, byte[]> callback)
{
var path = UnityEditor.EditorUtility.OpenFilePanel(title, directory, extension.Replace(".", null));
if (!string.IsNullOrEmpty(path))
{
var bytes = System.IO.File.ReadAllBytes(path);
callback(true, path, bytes);
}
else
{
callback(false, null, null);
}
yield break;
}
public static IEnumerator SaveFile(string title, string directory, string defaultName, string extension, byte[] bytes, Action<bool, string> callback)
{
var path = UnityEditor.EditorUtility.SaveFilePanel(title, directory, defaultName, extension.Replace(".", null));
if (!string.IsNullOrEmpty(path))
{
System.IO.File.WriteAllBytes(path, bytes);
callback(true, path);
}
else
{
callback(false, null);
}
yield break;
}
#elif UNITY_STANDALONE_WIN || UNITY_WSA
public static IEnumerator OpenFile(string title, string directory, string extension, Action<bool, string, byte[]> callback)
{
throw new NotImplementedException("Import [Simple File Browser For Windows]: http://u3d.as/2QLg");
//yield return SimpleFileBrowserForWindows.WindowsFileBrowser.OpenFile(title, directory, "File", new[] { extension }, callback);
}
public static IEnumerator SaveFile(string title, string directory, string defaultName, string extension, byte[] bytes, Action<bool, string> callback)
{
throw new NotImplementedException("Import [Simple File Browser For Windows]: http://u3d.as/2QLg");
//yield return SimpleFileBrowserForWindows.WindowsFileBrowser.SaveFile(title, directory, defaultName, "Prefab", extension, bytes, callback);
}
#elif UNITY_WEBGL
public static IEnumerator OpenFile(string title, string directory, string extension, Action<bool, string, byte[]> callback)
{
throw new NotImplementedException("Import [Simple File Browser for WebGL]: http://u3d.as/2W52");
//SimpleFileBrowserForWebGL.WebFileBrowser.Upload((fileName, mime, bytes) => callback(true, null, bytes), extension);
}
public static IEnumerator SaveFile(string title, string directory, string defaultName, string extension, byte[] bytes, Action<bool, string> callback)
{
throw new NotImplementedException("Import [Simple File Browser for WebGL]: http://u3d.as/2W52");
//SimpleFileBrowserForWebGL.WebFileBrowser.Download(defaultName, bytes);
}
#else
public static IEnumerator OpenFile(string title, string directory, string extension, Action<bool, string, byte[]> callback)
{
throw new NotSupportedException();
}
public static IEnumerator SaveFile(string title, string directory, string defaultName, string extension, byte[] bytes, Action<bool, string> callback)
{
throw new NotSupportedException();
}
#endif
}
using System;
using System.Collections;
namespace Assets.HeroEditor4D.Common.Scripts.Common
{
public static class StandaloneFilePicker
{
#if UNITY_EDITOR
public static IEnumerator OpenFile(string title, string directory, string extension, Action<bool, string, byte[]> callback)
{
var path = UnityEditor.EditorUtility.OpenFilePanel(title, directory, extension.Replace(".", null));
if (!string.IsNullOrEmpty(path))
{
var bytes = System.IO.File.ReadAllBytes(path);
callback(true, path, bytes);
}
else
{
callback(false, null, null);
}
yield break;
}
public static IEnumerator SaveFile(string title, string directory, string defaultName, string extension, byte[] bytes, Action<bool, string> callback)
{
var path = UnityEditor.EditorUtility.SaveFilePanel(title, directory, defaultName, extension.Replace(".", null));
if (!string.IsNullOrEmpty(path))
{
System.IO.File.WriteAllBytes(path, bytes);
callback(true, path);
}
else
{
callback(false, null);
}
yield break;
}
#elif UNITY_STANDALONE_WIN || UNITY_WSA
public static IEnumerator OpenFile(string title, string directory, string extension, Action<bool, string, byte[]> callback)
{
throw new NotImplementedException("Import [Simple File Browser For Windows]: http://u3d.as/2QLg");
//yield return SimpleFileBrowserForWindows.WindowsFileBrowser.OpenFile(title, directory, "File", new[] { extension }, callback);
}
public static IEnumerator SaveFile(string title, string directory, string defaultName, string extension, byte[] bytes, Action<bool, string> callback)
{
throw new NotImplementedException("Import [Simple File Browser For Windows]: http://u3d.as/2QLg");
//yield return SimpleFileBrowserForWindows.WindowsFileBrowser.SaveFile(title, directory, defaultName, "Prefab", extension, bytes, callback);
}
#elif UNITY_WEBGL
public static IEnumerator OpenFile(string title, string directory, string extension, Action<bool, string, byte[]> callback)
{
throw new NotImplementedException("Import [Simple File Browser for WebGL]: http://u3d.as/2W52");
//SimpleFileBrowserForWebGL.WebFileBrowser.Upload((fileName, mime, bytes) => callback(true, null, bytes), extension);
}
public static IEnumerator SaveFile(string title, string directory, string defaultName, string extension, byte[] bytes, Action<bool, string> callback)
{
throw new NotImplementedException("Import [Simple File Browser for WebGL]: http://u3d.as/2W52");
//SimpleFileBrowserForWebGL.WebFileBrowser.Download(defaultName, bytes);
}
#else
public static IEnumerator OpenFile(string title, string directory, string extension, Action<bool, string, byte[]> callback)
{
throw new NotSupportedException();
}
public static IEnumerator SaveFile(string title, string directory, string defaultName, string extension, byte[] bytes, Action<bool, string> callback)
{
throw new NotSupportedException();
}
#endif
}
}

View File

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

View File

@@ -1,8 +1,8 @@
fileFormatVersion: 2
guid: f10bf499246ece24b8424effe703a9af
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: f10bf499246ece24b8424effe703a9af
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,15 +1,15 @@
namespace Assets.HeroEditor4D.Common.Scripts.Enums
{
public enum BodyPart
{
Body,
Head,
Hair,
Ears,
Eyebrows,
Eyes,
Mouth,
Beard,
Makeup
}
namespace Assets.HeroEditor4D.Common.Scripts.Enums
{
public enum BodyPart
{
Body,
Head,
Hair,
Ears,
Eyebrows,
Eyes,
Mouth,
Beard,
Makeup
}
}

View File

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

View File

@@ -1,17 +1,17 @@
namespace Assets.HeroEditor4D.Common.Scripts.Enums
{
public enum CharacterState
{
Idle = 0,
Ready = 1,
Walk = 2,
Run = 3,
Jump = 4,
Climb = 5,
Death = 9,
ShieldBlock = 10,
WeaponBlock = 11,
Evasion = 12,
Dance = 13
}
namespace Assets.HeroEditor4D.Common.Scripts.Enums
{
public enum CharacterState
{
Idle = 0,
Ready = 1,
Walk = 2,
Run = 3,
Jump = 4,
Climb = 5,
Death = 9,
ShieldBlock = 10,
WeaponBlock = 11,
Evasion = 12,
Dance = 13
}
}

View File

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

View File

@@ -1,25 +1,25 @@
namespace Assets.HeroEditor4D.Common.Scripts.Enums
{
public enum EquipmentPart
{
Armor,
Helmet,
Vest,
Bracers,
Leggings,
MeleeWeapon1H,
MeleeWeapon2H,
Bow,
Crossbow,
SecondaryMelee1H,
SecondaryFirearm1H,
Shield,
Earrings,
Cape,
Quiver,
Backpack,
Mask,
Firearm1H,
Firearm2H
}
namespace Assets.HeroEditor4D.Common.Scripts.Enums
{
public enum EquipmentPart
{
Armor,
Helmet,
Vest,
Bracers,
Leggings,
MeleeWeapon1H,
MeleeWeapon2H,
Bow,
Crossbow,
SecondaryMelee1H,
SecondaryFirearm1H,
Shield,
Earrings,
Cape,
Quiver,
Backpack,
Mask,
Firearm1H,
Firearm2H
}
}

Some files were not shown because too many files have changed in this diff Show More