summaryrefslogtreecommitdiff
path: root/Assets/Scripts
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts')
-rw-r--r--Assets/Scripts/Test 1/TestErika.cs2
-rw-r--r--Assets/Scripts/Test 1/TestInput.cs32
-rw-r--r--Assets/Scripts/Unit/AnimationData.cs54
-rw-r--r--Assets/Scripts/Unit/Component/UnitAnimation.cs108
-rw-r--r--Assets/Scripts/Unit/Component/UnitState.cs56
-rw-r--r--Assets/Scripts/Unit/Controller/UnitController.cs10
-rw-r--r--Assets/Scripts/Unit/Events/AnimationEventBase.cs2
-rw-r--r--Assets/Scripts/Unit/Events/EventEffect.cs2
-rw-r--r--Assets/Scripts/Unit/Events/EventProjectile.cs2
-rw-r--r--Assets/Scripts/Unit/UnitTimeline.cs15
-rw-r--r--Assets/Scripts/Utils/MinMaxAttribute.cs14
-rw-r--r--Assets/Scripts/Utils/MinMaxAttribute.cs.meta11
12 files changed, 239 insertions, 69 deletions
diff --git a/Assets/Scripts/Test 1/TestErika.cs b/Assets/Scripts/Test 1/TestErika.cs
index 528924dc..deafc7c3 100644
--- a/Assets/Scripts/Test 1/TestErika.cs
+++ b/Assets/Scripts/Test 1/TestErika.cs
@@ -51,7 +51,7 @@ public class TestErika : MonoBehaviour
// animCtr[action.Key.ToString()] = action.Value;
//}
- unitCtr.unitState.ChangeState(UnitState.EUnitState.Idle, new UnitState.IdleParam());
+ unitCtr.unitState.ChangeState(UnitState.EUnitState.Idle, new UnitState.IdleParam(), true);
//unitCtr.unitRootMotion.SetUpRootMotion(unitFolder, actionData);
diff --git a/Assets/Scripts/Test 1/TestInput.cs b/Assets/Scripts/Test 1/TestInput.cs
index ed526f0d..f7178549 100644
--- a/Assets/Scripts/Test 1/TestInput.cs
+++ b/Assets/Scripts/Test 1/TestInput.cs
@@ -7,22 +7,22 @@ public class TestInput : MonoBehaviour
private void Update()
{
- if(Input.GetKeyDown("j"))
- {
- InputManager.Instance.OnAttack();
- }
- if(Input.GetKeyDown("space"))
- {
- InputManager.Instance.OnJump();
- }
- if(Input.GetKeyDown("d"))
- {
- InputManager.Instance.OnMoveRight();
- }
- if(Input.GetKeyDown("a"))
- {
- InputManager.Instance.OnMoveLeft();
- }
+ //if(Input.GetKeyDown("j"))
+ //{
+ // InputManager.Instance.OnAttack();
+ //}
+ //if(Input.GetKeyDown("space"))
+ //{
+ // InputManager.Instance.OnJump();
+ //}
+ //if(Input.GetKeyDown("d"))
+ //{
+ // InputManager.Instance.OnMoveRight();
+ //}
+ //if(Input.GetKeyDown("a"))
+ //{
+ // InputManager.Instance.OnMoveLeft();
+ //}
}
}
diff --git a/Assets/Scripts/Unit/AnimationData.cs b/Assets/Scripts/Unit/AnimationData.cs
index 211e9acb..6035978d 100644
--- a/Assets/Scripts/Unit/AnimationData.cs
+++ b/Assets/Scripts/Unit/AnimationData.cs
@@ -6,6 +6,25 @@ using UnityEngine;
using UnityEditor;
#endif
+// 不要修改枚举的顺序,只能在后面新加,不能删除
+
+public enum EAnimationToogle
+{
+ Combo = 0, // 连击
+ SuperArmor = 1, //霸体
+}
+
+[Serializable]
+public class ToggleTimeDictionary : SerializableDictionary<EAnimationToogle, Vector2> { }
+
+public enum EAnimationCurve
+{
+ TimeScale = 0, //
+}
+
+[Serializable]
+public class CurveDictionary : SerializableDictionary<EAnimationCurve, AnimationCurve> { }
+
// 某个动画的数据,包括帧事件、碰撞盒、速度曲线
[CreateAssetMenu(fileName = "Animation Data")]
public class AnimationData : ScriptableObject
@@ -22,15 +41,20 @@ public class AnimationData : ScriptableObject
public List<ColliderData> defendBoxes;
// 对应的进度的播放速度,默认是1
- public AnimationCurve curve;
+ [UnityEngine.Serialization.FormerlySerializedAs("curve")]
+ public AnimationCurve speedCurve;
- public const int FPS = 30;
+ public CurveDictionary curves;
+
+ public ToggleTimeDictionary toggles;
+
+ public const int FPS = 30;
public AnimationData()
{
Keyframe frame0 = new Keyframe(0, 1);
Keyframe frame1 = new Keyframe(1, 1);
- curve = new AnimationCurve(frame0, frame1);
+ speedCurve = new AnimationCurve(frame0, frame1);
}
public List<ColliderData> GetColliderBoxesByType(ColliderBox.EColliderType type)
@@ -51,6 +75,30 @@ public class AnimationData : ScriptableObject
return null;
}
+ public bool HasCurve(EAnimationCurve curve)
+ {
+ return curves != null && curves.ContainsKey(curve);
+ }
+
+ public AnimationCurve GetCurve(EAnimationCurve curve)
+ {
+ if (!HasCurve(curve))
+ return null;
+ return curves[curve];
+ }
+
+ public bool HasToggle(EAnimationToogle toggle)
+ {
+ return toggles != null && toggles.ContainsKey(toggle);
+ }
+
+ public bool IsToggleOpen(EAnimationToogle toggle, float normalizedTime)
+ {
+ if (!HasToggle(toggle))
+ return false;
+ return toggles[toggle].y <= normalizedTime && normalizedTime >= toggles[toggle].x;
+ }
+
public ColliderInfo GetColliderInfo(ColliderBox.EColliderType type, int index, float playbackTime)
{
return GetColliderInfoByFrame(type, index, playbackTime * FPS);
diff --git a/Assets/Scripts/Unit/Component/UnitAnimation.cs b/Assets/Scripts/Unit/Component/UnitAnimation.cs
index e1bca484..44cfb08b 100644
--- a/Assets/Scripts/Unit/Component/UnitAnimation.cs
+++ b/Assets/Scripts/Unit/Component/UnitAnimation.cs
@@ -5,6 +5,7 @@ using UnityEngine;
using UnityEditor;
#endif
+// 单独一层动画
public class AnimatorLayerInfo
{
public UnitAnimation.ELayer layer;
@@ -24,7 +25,7 @@ public class AnimatorLayerInfo
if (clipInfo == null || clipInfo.Length == 0)
return null;
var clip = clipInfo[0]; //选第一个
- string folder = m_Owner.folder;
+ string folder = m_UnitAnimation.owner.folder;
string name = clip.clip.name;
if (m_AnimationData != null && m_AnimationData.animationName == name)
return m_AnimationData;
@@ -36,19 +37,19 @@ public class AnimatorLayerInfo
}
}
- // 当前动作所有animation data,包括blendtree使用的所有动画
- //private List<AnimationData> m_AnimationDatas;
- //public List<AnimationData> animationDatas
- //{
- // get
- // {
- // return null;
- // }
- //}
-
- // 当前在播放的动作
- // 如果处于transition中,动作不变,切换完成后才会到下一个动作
- public AnimatorStateInfo stateInfo
+ // 当前动作所有animation data,包括blendtree使用的所有动画
+ //private List<AnimationData> m_AnimationDatas;
+ //public List<AnimationData> animationDatas
+ //{
+ // get
+ // {
+ // return null;
+ // }
+ //}
+
+ // 当前在播放的动作
+ // 如果处于transition中,动作不变,切换完成后才会到下一个动作
+ public AnimatorStateInfo stateInfo
{
get
{
@@ -111,7 +112,20 @@ public class AnimatorLayerInfo
}
}
- public float weight
+ public float playbackSpeed
+ {
+ get
+ {
+ return m_Animator.GetFloat("PlaybackSpeed" + layerIndex);
+ }
+ set
+ {
+ float v = Mathf.Clamp(value, 0, 10);
+ m_Animator.SetFloat("PlaybackSpeed" + layerIndex, v);
+ }
+ }
+
+ public float weight
{
get
{
@@ -139,19 +153,22 @@ public class AnimatorLayerInfo
}
}
- UnitController m_Owner;
+ UnitAnimation m_UnitAnimation;
- Coroutine m_CalcPlaybackTimeCoroutine;
+ Coroutine m_CalcPlaybackTimeCoroutine;
- public AnimatorLayerInfo(UnitController owner, Animator animator, UnitAnimation.ELayer layer)
+ TimelineEventProxy m_TimelineEventProxy;
+
+ public AnimatorLayerInfo(UnitAnimation unitAnimation, Animator animator, UnitAnimation.ELayer layer)
{
- this.m_Owner = owner;
+ this.m_UnitAnimation = unitAnimation;
this.m_Animator = animator;
this.layer = layer;
- m_CalcPlaybackTimeCoroutine = owner.StartCoroutine(CalcPlaybackRealTimeCoroutine());
- }
+ m_CalcPlaybackTimeCoroutine = unitAnimation.StartCoroutine(CalcPlaybackRealTimeCoroutine());
+ m_TimelineEventProxy = new TimelineEventProxy(unitAnimation.owner.transform, unitAnimation);
+ }
- IEnumerator CalcPlaybackRealTimeCoroutine()
+ IEnumerator CalcPlaybackRealTimeCoroutine()
{
while (true)
{
@@ -164,6 +181,17 @@ public class AnimatorLayerInfo
yield return null;
}
}
+
+ public void OnUpdate()
+ {
+ // 执行事件
+ m_TimelineEventProxy.ExecuteAnimationEvents(animationData, playbackTimeInSeconds * TimelineEventProxy.FPS);
+ if(animationData.speedCurve != null)
+ {
+ playbackSpeed = animationData.speedCurve.Evaluate(playbackNomralizedTime);
+ }
+ }
+
}
// 控制动画播放、执行动作timeline(包括执行事件和碰撞盒)
@@ -210,14 +238,12 @@ public class UnitAnimation : UnitComponent
public Animator animator { get { return m_Animator; } }
private Animator m_Animator;
- private UnitTimeline m_Timeline;
-
private UnitActionData m_ActionData;
public AnimatorLayerInfo[] layers { get { return m_LayerInfo; } }
private readonly AnimatorLayerInfo[] m_LayerInfo = new AnimatorLayerInfo[(int)ELayer.Count];
- public bool isInTransition
+ public bool isInTransition
{
get
{
@@ -229,13 +255,12 @@ public class UnitAnimation : UnitComponent
{
base.Initialize();
- m_Timeline = this.m_Owner.unitObj.GetOrAddComponent<UnitTimeline>();
m_Animator = this.m_Owner.unitObj.GetComponent<Animator>();
m_Animator.speed = 0;
- m_LayerInfo[0] = new AnimatorLayerInfo(m_Owner, m_Animator, ELayer.Basic);
- m_LayerInfo[1] = new AnimatorLayerInfo(m_Owner, m_Animator, ELayer.Attack);
+ m_LayerInfo[0] = new AnimatorLayerInfo(this, m_Animator, ELayer.Basic);
+ m_LayerInfo[1] = new AnimatorLayerInfo(this, m_Animator, ELayer.Attack);
if (m_Animator == null)
{
@@ -247,11 +272,22 @@ public class UnitAnimation : UnitComponent
{
base.OnUpdate();
+ UpdateLayer();
UpdateAnimation();
UpdateRootMotion();
}
- void UpdateAnimation()
+ void UpdateLayer()
+ {
+ m_LayerInfo[0].OnUpdate();
+ return;
+ for (int i = 0; i < m_LayerInfo.Length; ++i)
+ {
+ m_LayerInfo[i].OnUpdate();
+ }
+ }
+
+ void UpdateAnimation()
{
m_Animator.speed = 1;
m_Animator.Update(Time.deltaTime);
@@ -265,13 +301,19 @@ public class UnitAnimation : UnitComponent
public void AnimIdle()
{
- m_Animator.SetTrigger(ETrigger.ToIdle.ToString());
- }
+ if(layers[0].stateInfo.shortNameHash != Animator.StringToHash("Idle"))
+ {
+ m_Animator.SetTrigger(ETrigger.ToIdle.ToString());
+ }
+ }
public void AnimMove()
{
- m_Animator.SetTrigger(ETrigger.ToMove.ToString());
- }
+ if (layers[0].stateInfo.shortNameHash != Animator.StringToHash("Move"))
+ {
+ m_Animator.SetTrigger(ETrigger.ToMove.ToString());
+ }
+ }
public void AnimAttack()
{
diff --git a/Assets/Scripts/Unit/Component/UnitState.cs b/Assets/Scripts/Unit/Component/UnitState.cs
index 4a57ad6d..fd9bba00 100644
--- a/Assets/Scripts/Unit/Component/UnitState.cs
+++ b/Assets/Scripts/Unit/Component/UnitState.cs
@@ -10,7 +10,9 @@ public class UnitState : UnitComponent
{
public enum EUnitState
{
- Idle ,
+ Nien,
+
+ Idle ,
Move ,
Spawn ,
Die ,
@@ -105,21 +107,47 @@ public class UnitState : UnitComponent
return false;
}
- #region Idle
+ IEnumerator Nein() { yield break; }
+ void OnNienExit(EUnitState nextState) { }
+
+ #region Idle
IEnumerator Idle(IdleParam param)
{
- if(m_Owner.isInAir)
+ if(m_Owner.isInAir) // 浮空切换到landing
{
}
- m_Owner.unitAnimation.AnimIdle();
- yield return null;
+ else // idle
+ {
+ m_Owner.SetYPosition(0);
+ m_Owner.unitAnimation.AnimIdle();
+ while (true)
+ {
+ if (Input.GetKeyDown("j"))
+ {
+ ChangeState(EUnitState.Skill, new SkillParam());
+ }
+ if (Input.GetKeyDown("space"))
+ {
+ ChangeState(EUnitState.Jump, new JumpParam());
+ }
+ if (Input.GetKey("d"))
+ {
+ InputManager.Instance.OnMoveRight();
+ }
+ if (Input.GetKey("a"))
+ {
+ InputManager.Instance.OnMoveLeft();
+ }
+ yield return null;
+ }
+ }
}
void OnIdleExit(EUnitState nextState)
{
- LogHelper.Log(nextState.ToString());
+ m_Owner.unitAnimation.animator.ResetTrigger("ToIdle");
}
#endregion
@@ -139,7 +167,7 @@ public class UnitState : UnitComponent
}
//if (Input.GetKey(param.key))
m_Owner.unitAnimation.AnimMove();
- while (Input.GetKey(param.key))
+ while (Input.GetKey(param.key))
{
yield return null;
}
@@ -148,7 +176,7 @@ public class UnitState : UnitComponent
void OnMoveExit(EUnitState nextState)
{
- //m_Owner.unitAnimation.animator.ResetTrigger("ToMove");
+ m_Owner.unitAnimation.animator.ResetTrigger("ToMove");
}
#endregion
@@ -174,8 +202,16 @@ public class UnitState : UnitComponent
IEnumerator Jump(JumpParam param)
{
- yield return new WaitForActionReachEnd(m_Owner.unitAnimation);
- ChangeState<IdleParam>(EUnitState.Idle);
+ while(true)
+ {
+ // 空中连击
+ if(Input.GetKeyDown("j"))
+ {
+ SkillParam skill = new SkillParam();
+ ChangeState(EUnitState.Skill, skill);
+ }
+ yield return null;
+ }
}
void OnJumpExit(EUnitState next)
diff --git a/Assets/Scripts/Unit/Controller/UnitController.cs b/Assets/Scripts/Unit/Controller/UnitController.cs
index a9baf595..a48ef6ee 100644
--- a/Assets/Scripts/Unit/Controller/UnitController.cs
+++ b/Assets/Scripts/Unit/Controller/UnitController.cs
@@ -109,4 +109,14 @@ public class UnitController : MonoBehaviour/*, Interactable*/
public virtual void OnGrab()
{
}
+
+
+ public void SetYPosition(float y)
+ {
+ Vector3 pos = transform.position;
+ pos.y = y;
+ transform.position = pos;
+ }
+
}
+
diff --git a/Assets/Scripts/Unit/Events/AnimationEventBase.cs b/Assets/Scripts/Unit/Events/AnimationEventBase.cs
index 613eff27..d8d97892 100644
--- a/Assets/Scripts/Unit/Events/AnimationEventBase.cs
+++ b/Assets/Scripts/Unit/Events/AnimationEventBase.cs
@@ -7,7 +7,7 @@ public abstract class AnimationEventBase : ScriptableObject
{
public int startFrame;
- public abstract UnitTimeline.EEventType type { get; }
+ public abstract TimelineEventProxy.EEventType type { get; }
public string fullName
{
diff --git a/Assets/Scripts/Unit/Events/EventEffect.cs b/Assets/Scripts/Unit/Events/EventEffect.cs
index 61a4a7e3..71228b84 100644
--- a/Assets/Scripts/Unit/Events/EventEffect.cs
+++ b/Assets/Scripts/Unit/Events/EventEffect.cs
@@ -4,7 +4,7 @@ using UnityEngine;
public class EventEffect : AnimationEventBase
{
- public override UnitTimeline.EEventType type { get { return UnitTimeline.EEventType.EventEffect; } }
+ public override TimelineEventProxy.EEventType type { get { return TimelineEventProxy.EEventType.EventEffect; } }
public override string shortName { get { return "E"; } }
[Tooltip("Effect path")]
diff --git a/Assets/Scripts/Unit/Events/EventProjectile.cs b/Assets/Scripts/Unit/Events/EventProjectile.cs
index 032c93bb..0a85cce9 100644
--- a/Assets/Scripts/Unit/Events/EventProjectile.cs
+++ b/Assets/Scripts/Unit/Events/EventProjectile.cs
@@ -4,7 +4,7 @@ using UnityEngine;
public class EventProjectile : AnimationEventBase
{
- public override UnitTimeline.EEventType type { get { return UnitTimeline.EEventType.EventProjectile; } }
+ public override TimelineEventProxy.EEventType type { get { return TimelineEventProxy.EEventType.EventProjectile; } }
public override string shortName { get { return "P"; } }
diff --git a/Assets/Scripts/Unit/UnitTimeline.cs b/Assets/Scripts/Unit/UnitTimeline.cs
index 478840a9..99c6bdaf 100644
--- a/Assets/Scripts/Unit/UnitTimeline.cs
+++ b/Assets/Scripts/Unit/UnitTimeline.cs
@@ -7,9 +7,9 @@ using UnityEngine;
using UnityEditor;
#endif
-// 处理动画帧事件和碰撞盒
+// 执行帧事件
[DisallowMultipleComponent]
-public partial class UnitTimeline : MonoBehaviour
+public partial class TimelineEventProxy
{
public enum EEventType
{
@@ -40,6 +40,15 @@ public partial class UnitTimeline : MonoBehaviour
private int m_PrevFrame = -1;
+ private UnitAnimation m_UnitAnimation;
+
+ private Transform m_Root;
+
+ public TimelineEventProxy(Transform root, UnitAnimation unitAnimation = null)
+ {
+ m_Root = root;
+ }
+
public static Type GetTypeByName(string name)
{
Type type = Type.GetType(name);
@@ -102,7 +111,7 @@ public partial class UnitTimeline : MonoBehaviour
go.transform.SetParent(root.transform);
FxClear onClear = root.AddComponent<FxClear>();
onClear.RunInEditor = true;
- onClear.Initialize(new PlayEffectInfo(path, EffectPlayTypes.Oneshot, transform, effect.position, effect.rotation, effect.scale, 0, false));
+ onClear.Initialize(new PlayEffectInfo(path, EffectPlayTypes.Oneshot, m_Root, effect.position, effect.rotation, effect.scale, 0, false));
}
#endif
}
diff --git a/Assets/Scripts/Utils/MinMaxAttribute.cs b/Assets/Scripts/Utils/MinMaxAttribute.cs
new file mode 100644
index 00000000..bba4087a
--- /dev/null
+++ b/Assets/Scripts/Utils/MinMaxAttribute.cs
@@ -0,0 +1,14 @@
+using UnityEngine;
+
+public class MinMaxSliderAttribute : PropertyAttribute
+{
+
+ public float min;
+ public float max;
+
+ public MinMaxSliderAttribute(float min, float max)
+ {
+ this.min = min;
+ this.max = max;
+ }
+}
diff --git a/Assets/Scripts/Utils/MinMaxAttribute.cs.meta b/Assets/Scripts/Utils/MinMaxAttribute.cs.meta
new file mode 100644
index 00000000..7a97ffb4
--- /dev/null
+++ b/Assets/Scripts/Utils/MinMaxAttribute.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7afbee84722215549ae77c81ee280f53
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: