From 63f4fd784f27e195913607e938a6d7282a9485d3 Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 10 Sep 2021 22:29:23 +0800 Subject: *misc --- Assets/Scripts/Unit/AnimationData.cs | 2 ++ .../Unit/Components/UnitState/PCState_Event.cs | 11 ++++++++ .../Unit/Components/UnitState/PCState_States.cs | 33 +++++++++++++--------- .../Scripts/Unit/Components/UnitState/UnitState.cs | 12 ++++++++ .../Scripts/Unit/Events/EventUnit_SetPosition.cs | 23 +++++++++++++++ .../Unit/Events/EventUnit_SetPosition.cs.meta | 11 ++++++++ Assets/Scripts/Unit/TimelineEventProxy.cs | 9 +++++- Assets/Scripts/Unit/UnitRootMotion.cs | 6 ++++ 8 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 Assets/Scripts/Unit/Events/EventUnit_SetPosition.cs create mode 100644 Assets/Scripts/Unit/Events/EventUnit_SetPosition.cs.meta (limited to 'Assets/Scripts/Unit') diff --git a/Assets/Scripts/Unit/AnimationData.cs b/Assets/Scripts/Unit/AnimationData.cs index c62e35fc..04a5fbb3 100644 --- a/Assets/Scripts/Unit/AnimationData.cs +++ b/Assets/Scripts/Unit/AnimationData.cs @@ -84,6 +84,8 @@ public enum EAnimationProperty TransitionInDuration = 3, // 过渡到这个动作的时间 TransitionOutDuration = 5, // 过渡到下一个动作的时间 CanBeInterrupted = 4, // 是否可以被打断 + ORMEnforcement = 6, // 限制Y坐标的rootmotion不能小于0,仅限override rootmotion + Endpoint = 7, // 结束点,范围[0-1],如果只截取动作的一部分,用这个属性设置 } [Serializable] diff --git a/Assets/Scripts/Unit/Components/UnitState/PCState_Event.cs b/Assets/Scripts/Unit/Components/UnitState/PCState_Event.cs index b5c0833f..73c65a0c 100644 --- a/Assets/Scripts/Unit/Components/UnitState/PCState_Event.cs +++ b/Assets/Scripts/Unit/Components/UnitState/PCState_Event.cs @@ -5,8 +5,19 @@ using UnityEngine; public partial class PCState : UnitState { + void OnTimeLineEvent(AnimationEventBase animEvent) { + if(animEvent is EventUnit_SetPosition) + { + EventUnit_SetPosition setPos = animEvent as EventUnit_SetPosition; + Vector3 pos = owner.transform.position; + if(setPos.setY) + { + pos.y = setPos.y; + } + owner.transform.position = pos; + } } diff --git a/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs b/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs index 2cfaf876..14d62c87 100644 --- a/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs +++ b/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs @@ -43,14 +43,9 @@ public partial class PCState : UnitState IEnumerator Idle(IdleParam param) { - //if (m_Owner.isInAir) // 浮空切换到landing - //{ - // ChangeState(EUnitState.Landing, new LandingParam()); - //} - //else // idle - //{ - m_Owner.SetYPosition(0); m_Owner.pcAnimation.AnimIdle(); + yield return new WaitForTransitionDone(owner.unitAnimation); + m_Owner.SetYPosition(0); while (true) { if (Input.GetKeyDown("j")) @@ -81,7 +76,6 @@ public partial class PCState : UnitState } yield return null; } - //} } void OnIdleExit(EUnitState nextState) @@ -106,7 +100,11 @@ public partial class PCState : UnitState //if (Input.GetKey(param.key)) m_Owner.pcAnimation.AnimMove(); while (Input.GetKey(param.key)) - { + { + if (Input.GetKeyDown("u")) + { + ChangeState(EUnitState.AttackToAir, new SkillParam()); + } yield return null; } ChangeState(EUnitState.Idle, new IdleParam()); @@ -188,7 +186,7 @@ public partial class PCState : UnitState } } - if (isAnimationReachEnd) + if (isAnimationReachEnd || isAnimationReachEndPoint) { ChangeState(EUnitState.Landing, new LandingParam()); } @@ -334,9 +332,13 @@ public partial class PCState : UnitState while (true) { Vector3 pos = m_Owner.transform.position; - vy += g * Time.deltaTime; - pos.y += vy * Time.deltaTime; - pos.y = Mathf.Max(0, pos.y); + + if(!landingGround) + { + vy += g * Time.deltaTime; + pos.y += vy * Time.deltaTime; + pos.y = Mathf.Max(0, pos.y); + } TryDash(); @@ -352,13 +354,16 @@ public partial class PCState : UnitState TurnAround(true); pos.x += vx * Time.deltaTime; } + if (Input.GetKeyDown("j")) { ChangeState(EUnitState.AirAttack, new SkillParam()); } + m_Owner.transform.position = pos; + if (pos.y > 0 && pos.y <= 1 && !landingGround) - { + { landingGround = true; m_Owner.pcAnimation.AnimLandingGround(); } diff --git a/Assets/Scripts/Unit/Components/UnitState/UnitState.cs b/Assets/Scripts/Unit/Components/UnitState/UnitState.cs index b94a98df..ff42c2be 100644 --- a/Assets/Scripts/Unit/Components/UnitState/UnitState.cs +++ b/Assets/Scripts/Unit/Components/UnitState/UnitState.cs @@ -17,6 +17,18 @@ public class UnitState : UnitComponent } } + // 如果设置了endpoint属性,检查是否到了endpoint + public virtual bool isAnimationReachEndPoint + { + get + { + var layer = owner.unitAnimation.baseLayer; + if (!layer.animationData.HasProperty(EAnimationProperty.Endpoint)) + return false; + return layer.playbackNormalizedTime >= layer.animationData.GetProperty(EAnimationProperty.Endpoint); + } + } + public virtual bool isComboOpen { get diff --git a/Assets/Scripts/Unit/Events/EventUnit_SetPosition.cs b/Assets/Scripts/Unit/Events/EventUnit_SetPosition.cs new file mode 100644 index 00000000..2298492b --- /dev/null +++ b/Assets/Scripts/Unit/Events/EventUnit_SetPosition.cs @@ -0,0 +1,23 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class EventUnit_SetPosition : AnimationEventBase +{ + public override TimelineEventProxy.EEventType type => TimelineEventProxy.EEventType.EventUnit_SetPosition; + + public override string shortName => "P"; + + public bool setX; + [If("setX")] + public float x; + + public bool setY; + [If("setY")] + public float y; + + public bool setZ; + [If("setZ")] + public float z; + +} diff --git a/Assets/Scripts/Unit/Events/EventUnit_SetPosition.cs.meta b/Assets/Scripts/Unit/Events/EventUnit_SetPosition.cs.meta new file mode 100644 index 00000000..d7ccb476 --- /dev/null +++ b/Assets/Scripts/Unit/Events/EventUnit_SetPosition.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b8952562a0fbae41a92bd6c1f897ca1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/TimelineEventProxy.cs b/Assets/Scripts/Unit/TimelineEventProxy.cs index 10dae57d..e3ce605e 100644 --- a/Assets/Scripts/Unit/TimelineEventProxy.cs +++ b/Assets/Scripts/Unit/TimelineEventProxy.cs @@ -54,6 +54,8 @@ public partial class TimelineEventProxy EventCamera_Blur, // 相机模糊 EventCamera_WhiteOut, // 相机白屏 + EventUnit_SetPosition, // 设置位置 + EventMesh_AfterImage, // 角色残像 EventMesh_AfterImageStop, // 角色残像停止事件 EventMesh_FadeIn, // 角色透明度 @@ -253,6 +255,11 @@ public partial class TimelineEventProxy } - #endregion + void EventUnit_SetPosition(AnimationEventBase animEvent) + { + // 在unitState回调里处理 + } + + #endregion } \ No newline at end of file diff --git a/Assets/Scripts/Unit/UnitRootMotion.cs b/Assets/Scripts/Unit/UnitRootMotion.cs index 98789725..5234daab 100644 --- a/Assets/Scripts/Unit/UnitRootMotion.cs +++ b/Assets/Scripts/Unit/UnitRootMotion.cs @@ -97,7 +97,13 @@ public class UnitRootMotion : UnitComponent m_PrevFrame = frame; Vector3 dest = rmData.GetRootMotionDistance(m_PrevFrame, frame); Vector3 realDest = m_Owner.transform.rotation * dest; + if(animData.GetProperty(EAnimationProperty.ORMEnforcement) != 0) + { + if(m_Owner.transform.position.y + realDest.y < 0) + realDest.y = 0; + } m_Owner.transform.position += realDest; + m_PrevFrame = frame; } else -- cgit v1.1-26-g67d0