Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using UnityEditor;
- using System.Collections.Generic;
- using System.Linq;
- namespace Notan
- {
- public class AnimatorUtils
- {
- const float FRAMERATE = 60f;
- static PlayerAnimationsConfig GetAnimationsConfig(HoldType holdType) =>
- holdType == HoldType.OneHand ? oneHandAnimationsConfig :
- holdType == HoldType.TwoHand ? twoHandAnimationsConfig :
- holdType == HoldType.Spear ? spearAnimationsConfig :
- holdType == HoldType.Firearm ? firearmAnimationsConfig :
- holdType == HoldType.Bow ? bowAnimationsConfig :
- oneHandAnimationsConfig;
- static ObjectReferenceKeyframe GetKeyframe(KeyFrameData data, SpriteCollection sprites)
- {
- ObjectReferenceKeyframe keyframe = new ObjectReferenceKeyframe();
- keyframe.time = data.time / FRAMERATE;
- keyframe.value = sprites.GetSpriteWithId(data.spriteIndex);
- return keyframe;
- }
- static AnimationEvent GetAnimationEvent(AnimationEventData data, int animationId)
- {
- AnimationEvent animationEvent = new AnimationEvent();
- animationEvent.functionName = data.name;
- animationEvent.time = data.time;
- animationEvent.intParameter = animationId;
- return animationEvent;
- }
- static EditorCurveBinding GetEditorCurveBinding(string path = "")
- {
- EditorCurveBinding spriteBinding = new EditorCurveBinding();
- spriteBinding.type = typeof(SpriteRenderer);
- spriteBinding.path = path;
- spriteBinding.propertyName = "m_Sprite";
- return spriteBinding;
- }
- static AnimationClip AddEvents(AnimationClip clip, AnimationEventData[] data, int animationId)
- {
- if (data == null) return clip;
- List<AnimationEvent> previousEvents = AnimationUtility.GetAnimationEvents(clip).ToList();
- List<AnimationEvent> newAnimationEvents = data.Select(item => GetAnimationEvent(item, animationId)).ToList();
- AnimationEvent[] finalEvents = previousEvents.Concat(newAnimationEvents).ToArray();
- AnimationUtility.SetAnimationEvents(clip, finalEvents);
- return clip;
- }
- static AnimationClip AddKeyframes(AnimationClip clip, KeyFrameData[] data, SpriteCollection sprites, string target)
- {
- ObjectReferenceKeyframe[] keyframes = data.Select(data => GetKeyframe(data, sprites)).ToArray();
- EditorCurveBinding curve = GetEditorCurveBinding(target);
- AnimationUtility.SetObjectReferenceCurve(clip, curve, keyframes);
- return clip;
- }
- static AnimationClip UpdateSettings(AnimationClip clip, bool loop)
- {
- clip.frameRate = FRAMERATE;
- AnimationClipSettings animSettings = AnimationUtility.GetAnimationClipSettings(clip);
- animSettings.loopTime = loop;
- AnimationUtility.SetAnimationClipSettings(clip, animSettings);
- return clip;
- }
- public static AnimationClip CreateAnimation(AnimationData data1, AnimationData data2, SpritePlayerSet sprites, string name)
- {
- AnimationClip clip = new AnimationClip();
- clip = UpdateSettings(clip, data1.loop);
- clip = AddKeyframes(clip, data1.frames, sprites.armor1, "Armor");
- clip = AddKeyframes(clip, data1.frames, sprites.weapon1, "Weapon");
- clip = AddEvents(clip, data1.events, 1);
- clip = AddKeyframes(clip, data2.frames, sprites.armor2, "Armor 2");
- clip = AddKeyframes(clip, data2.frames, sprites.weapon2, "Weapon 2");
- clip = AddEvents(clip, data1.events, 2);
- clip = AddKeyframes(clip, data1.frames, sprites.shield, "Shield");
- clip.name = name;
- return clip;
- }
- public static void SetUpPlayer(Armor armor, Weapon weapon1, Weapon weapon2, Shield shield)
- {
- SpritePlayerSet set = new SpritePlayerSet(armor, weapon1, weapon2, shield);
- PlayerAnimationsConfig data1 = GetAnimationsConfig(weapon1.holdType);
- PlayerAnimationsConfig data2 = GetAnimationsConfig(weapon2.holdType);
- AnimationClip walkClip = CreateAnimation(data1.walk, data2.walk, set, "walk");
- AnimationClip idleClip = CreateAnimation(data1.idle, data2.idle, set, "idle");
- AnimationClip jumpClip = CreateAnimation(data1.jump, data2.jump, set, "jump");
- AnimationClip blockClip = CreateAnimation(data1.block, data2.block, set, "block");
- AnimationClip attackJumpClip = CreateAnimation(data1.jumpAttack, data2.jumpAttack, set, "jumpAttack");
- AnimationClip attackHoldClip = CreateAnimation(data1.attackHold, data2.attackHold, set, "attackHold");
- AnimationClip attackChargeClip = CreateAnimation(data1.attackCharge, data2.attackCharge, set, "attackCharge");
- AnimationClip attackReleaseClip = CreateAnimation(data1.attackRelease, data2.attackRelease, set, "attackRelease");
- // Prepare controller
- string controllerPath = "Assets/Animators/Player custom.overrideController";
- var controllerObject = AssetDatabase.LoadAssetAtPath(controllerPath, typeof(AnimatorOverrideController));
- AnimatorOverrideController controller = (AnimatorOverrideController)controllerObject;
- List<KeyValuePair<AnimationClip, AnimationClip>> overrides =
- new List<KeyValuePair<AnimationClip, AnimationClip>>(controller.overridesCount);
- controller.GetOverrides(overrides);
- overrides = overrides.Select<KeyValuePair<AnimationClip, AnimationClip>, KeyValuePair<AnimationClip, AnimationClip>>(
- kvp =>
- {
- AnimationClip clip =
- kvp.Key.name == "player-walk" ? walkClip :
- kvp.Key.name == "player-idle" ? idleClip :
- kvp.Key.name == "player-jump" ? jumpClip :
- kvp.Key.name == "player-block" ? blockClip :
- kvp.Key.name == "player-attack-jump" ? attackJumpClip :
- kvp.Key.name == "player-attack-hold" ? attackHoldClip :
- kvp.Key.name == "player-attack-charge" ? attackChargeClip :
- kvp.Key.name == "player-attack-release" ? attackReleaseClip :
- kvp.Value;
- return new KeyValuePair<AnimationClip, AnimationClip>(kvp.Key, clip);
- }
- ).ToList();
- controller.ApplyOverrides(overrides);
- }
- #region Data
- static PlayerAnimationsConfig oneHandAnimationsConfig = new PlayerAnimationsConfig()
- {
- walk = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 5, 0 ),
- new KeyFrameData( 6, 5 ),
- new KeyFrameData( 7, 10 ),
- new KeyFrameData( 8, 15 )
- }, null),
- block = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 4, 0 )
- }, null),
- jump = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 9, 0 )
- }, null),
- jumpAttack = new AnimationData(
- new KeyFrameData[7] {
- new KeyFrameData( 10, 0 ),
- new KeyFrameData( 11, 5 ),
- new KeyFrameData( 12, 10 ),
- new KeyFrameData( 13, 15 ),
- new KeyFrameData( 14, 20 ),
- new KeyFrameData( 15, 25 ),
- new KeyFrameData( 16, 30 )
- },
- new AnimationEventData[2] {
- new AnimationEventData(1/6f, "AnimEventStartHitbox"),
- new AnimationEventData(1/3f, "AnimEventEndHitbox"),
- }),
- idle = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 0, 0 ),
- new KeyFrameData( 1, 10 ),
- new KeyFrameData( 2, 20 ),
- new KeyFrameData( 3, 30 )
- }, null),
- attackCharge = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 17, 0 )
- },
- null,
- false),
- attackHold = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 17, 0 )
- },
- null,
- false),
- attackRelease = new AnimationData(
- new KeyFrameData[7] {
- new KeyFrameData( 17, 0 ),
- new KeyFrameData( 18, 5 ),
- new KeyFrameData( 19, 10 ),
- new KeyFrameData( 20, 15 ),
- new KeyFrameData( 21, 20 ),
- new KeyFrameData( 22, 25 ),
- new KeyFrameData( 23, 30 )
- },
- new AnimationEventData[3] {
- new AnimationEventData(1/6f, "AnimEventStartHitbox"),
- new AnimationEventData(1/4f, "AnimEventEndHitbox"),
- new AnimationEventData(1/2f, "AnimEventAttackEnd"),
- },
- false),
- };
- static PlayerAnimationsConfig twoHandAnimationsConfig = new PlayerAnimationsConfig()
- {
- // TODO: Definir todas las animaciones
- walk = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 0, 0 ),
- new KeyFrameData( 1, 5 ),
- new KeyFrameData( 2, 10 ),
- new KeyFrameData( 3, 15 )
- }, null),
- block = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 4, 0 )
- }, null),
- jump = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 4, 0 )
- }, null),
- jumpAttack = new AnimationData(
- new KeyFrameData[5] {
- new KeyFrameData( 5, 0 ),
- new KeyFrameData( 6, 10 ),
- new KeyFrameData( 7, 15 ),
- new KeyFrameData( 8, 20 ),
- new KeyFrameData( 9, 30 )
- },
- new AnimationEventData[2] {
- new AnimationEventData(1/6f, "AnimEventStartHitbox"),
- new AnimationEventData(1/3f, "AnimEventEndHitbox"),
- }),
- idle = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 10, 0 ),
- new KeyFrameData( 11, 10 ),
- new KeyFrameData( 12, 20 ),
- new KeyFrameData( 11, 30 )
- }, null),
- attackRelease = new AnimationData(
- new KeyFrameData[6] {
- new KeyFrameData( 13, 0 ),
- new KeyFrameData( 14, 5 ),
- new KeyFrameData( 15, 10 ),
- new KeyFrameData( 16, 15 ),
- new KeyFrameData( 17, 20 ),
- new KeyFrameData( 18, 30 )
- },
- new AnimationEventData[3] {
- new AnimationEventData(1/6f, "AnimEventStartHitbox"),
- new AnimationEventData(1/4f, "AnimEventEndHitbox"),
- new AnimationEventData(1/2f, "AnimEventAttackEnd"),
- },
- false),
- };
- static PlayerAnimationsConfig spearAnimationsConfig = new PlayerAnimationsConfig()
- {
- idle = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 0, 0 ),
- new KeyFrameData( 1, 10 ),
- new KeyFrameData( 2, 20 ),
- new KeyFrameData( 3, 30 )
- }, null),
- walk = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 4, 0 ),
- new KeyFrameData( 5, 5 ),
- new KeyFrameData( 6, 10 ),
- new KeyFrameData( 7, 15 )
- }, null),
- jump = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 8, 0 )
- }, null),
- jumpAttack = new AnimationData(
- new KeyFrameData[5] {
- new KeyFrameData( 9, 0 ),
- new KeyFrameData( 10, 10 ),
- new KeyFrameData( 11, 15 ),
- new KeyFrameData( 12, 20 ),
- new KeyFrameData( 13, 30 )
- },
- new AnimationEventData[2] {
- new AnimationEventData(1/6f, "AnimEventStartHitbox"),
- new AnimationEventData(1/3f, "AnimEventEndHitbox"),
- }),
- block = new AnimationData(
- new KeyFrameData[0] { }, null),
- attackCharge = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 14, 10 ),
- },
- null,
- false),
- attackHold = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 14, 10 ),
- },
- null,
- false),
- attackRelease = new AnimationData(
- new KeyFrameData[7] {
- new KeyFrameData( 14, 0 ),
- new KeyFrameData( 15, 5 ),
- new KeyFrameData( 16, 10 ),
- new KeyFrameData( 17, 15 ),
- new KeyFrameData( 18, 20 ),
- new KeyFrameData( 19, 25 ),
- new KeyFrameData( 20, 30 ),
- },
- new AnimationEventData[3] {
- new AnimationEventData(1/6f, "AnimEventStartHitbox"),
- new AnimationEventData(1/4f, "AnimEventEndHitbox"),
- new AnimationEventData(1/2f, "AnimEventAttackEnd"),
- },
- false),
- };
- static PlayerAnimationsConfig shieldAnimationSet = new PlayerAnimationsConfig()
- {
- walk = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 0, 0 ),
- new KeyFrameData( 1, 5 ),
- new KeyFrameData( 2, 10 ),
- new KeyFrameData( 3, 15 )
- }, null),
- block = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 4, 0 )
- }, null),
- jump = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 5, 0 )
- }, null),
- jumpAttack = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 6, 0 ),
- new KeyFrameData( 7, 10 ),
- new KeyFrameData( 8, 20 ),
- new KeyFrameData( 9, 30 )
- }, null),
- idle = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 10, 0 ),
- new KeyFrameData( 11, 10 ),
- new KeyFrameData( 12, 20 ),
- new KeyFrameData( 11, 30 )
- }, null),
- attackCharge = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 11, 10 ),
- },
- null,
- false),
- attackHold = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 11, 10 ),
- },
- null,
- false),
- attackRelease = new AnimationData(
- new KeyFrameData[7] {
- new KeyFrameData( 13, 0 ),
- new KeyFrameData( 14, 5 ),
- new KeyFrameData( 15, 10 ),
- new KeyFrameData( 16, 15 ),
- new KeyFrameData( 17, 20 ),
- new KeyFrameData( 18, 25 ),
- new KeyFrameData( 19, 30 )
- },
- new AnimationEventData[1] {
- new AnimationEventData(1/2f, "AnimEventAttackEnd"),
- },
- false),
- };
- static PlayerAnimationsConfig firearmAnimationsConfig = new PlayerAnimationsConfig()
- {
- walk = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 0, 0 ),
- new KeyFrameData( 1, 5 ),
- new KeyFrameData( 2, 10 ),
- new KeyFrameData( 3, 15 )
- }, null),
- block = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 4, 0 )
- }, null),
- jump = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 4, 0 )
- }, null),
- jumpAttack = new AnimationData(
- new KeyFrameData[7] {
- new KeyFrameData( 5, 0 ),
- new KeyFrameData( 6, 5 ),
- new KeyFrameData( 7, 10 ),
- new KeyFrameData( 8, 15 ),
- new KeyFrameData( 9, 20 ),
- new KeyFrameData( 10, 25 ),
- new KeyFrameData( 11, 30 )
- }, null),
- idle = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 12, 0 ),
- new KeyFrameData( 13, 10 ),
- new KeyFrameData( 14, 20 ),
- new KeyFrameData( 13, 30 )
- }, null),
- attackCharge = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 13, 10 ),
- },
- null,
- false),
- attackHold = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 13, 10 ),
- },
- null,
- false),
- attackRelease = new AnimationData(
- new KeyFrameData[11] {
- new KeyFrameData( 15, 0 ),
- new KeyFrameData( 16, 5 ),
- new KeyFrameData( 17, 10 ),
- new KeyFrameData( 18, 15 ),
- new KeyFrameData( 19, 20 ),
- new KeyFrameData( 20, 25 ),
- new KeyFrameData( 21, 30 ),
- new KeyFrameData( 22, 35 ),
- new KeyFrameData( 23, 40 ),
- new KeyFrameData( 24, 45 ),
- new KeyFrameData( 25, 50 )
- },
- new AnimationEventData[2] {
- new AnimationEventData(0f, "AnimEventStartHitbox"),
- new AnimationEventData(5/6f, "AnimEventAttackEnd"),
- },
- false),
- };
- static PlayerAnimationsConfig bowAnimationsConfig = new PlayerAnimationsConfig()
- {
- walk = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 0, 0 ),
- new KeyFrameData( 1, 5 ),
- new KeyFrameData( 2, 10 ),
- new KeyFrameData( 3, 15 )
- }, null),
- block = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 4, 0 )
- }, null),
- jump = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 8, 0 )
- }, null),
- jumpAttack = new AnimationData(
- new KeyFrameData[5] {
- new KeyFrameData( 9, 0 ),
- new KeyFrameData( 10, 10 ),
- new KeyFrameData( 11, 20 ),
- new KeyFrameData( 12, 30 ),
- new KeyFrameData( 13, 30 )
- }, null),
- idle = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 19, 0 ),
- new KeyFrameData( 20, 10 ),
- new KeyFrameData( 21, 20 ),
- new KeyFrameData( 19, 30 )
- }, null),
- attackChargeWalk = new AnimationData(
- new KeyFrameData[4] {
- new KeyFrameData( 4, 0 ),
- new KeyFrameData( 5, 10 ),
- new KeyFrameData( 6, 20 ),
- new KeyFrameData( 7, 30 )
- }, null),
- attackCharge = new AnimationData(
- new KeyFrameData[3] {
- new KeyFrameData( 14, 0 ),
- new KeyFrameData( 15, 5 ),
- new KeyFrameData( 16, 10 ),
- },
- null,
- false),
- attackHold = new AnimationData(
- new KeyFrameData[1] {
- new KeyFrameData( 16, 0 ),
- },
- null,
- false),
- attackRelease = new AnimationData(
- new KeyFrameData[2] {
- new KeyFrameData( 17, 0 ),
- new KeyFrameData( 18, 20 )
- },
- new AnimationEventData[2] {
- new AnimationEventData(0f, "AnimEventStartHitbox"),
- new AnimationEventData(1/3f, "AnimEventAttackEnd"),
- },
- false),
- };
- #endregion
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement