diff options
author | chai <215380520@qq.com> | 2022-11-16 20:57:37 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2022-11-16 20:57:37 +0800 |
commit | 7dd988e2dc0583633781462f3836e6f97b7c682b (patch) | |
tree | 1d72c23aee44f1fd6de305e110f709478f4b2c66 /Erika/Assets/Scripts/Unit | |
parent | e5b23c103b9c98975ad0d003937d3616478d0177 (diff) |
* playback speed
Diffstat (limited to 'Erika/Assets/Scripts/Unit')
30 files changed, 286 insertions, 94 deletions
diff --git a/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs b/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs index 394601e2..a17b39be 100644 --- a/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs +++ b/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs @@ -21,7 +21,7 @@ public class WaitForActionReachEnd : IEnumerator public bool MoveNext() { - return m_UnitAnimation.playbackNormalizedTime < 1f; + return m_UnitAnimation.playbackClampedNormalizedTime < 1f; } public void Reset() diff --git a/Erika/Assets/Scripts/Unit/AfterImage/AfterImageAvatar.cs b/Erika/Assets/Scripts/Unit/AfterImage/AfterImageAvatar.cs index 170a1202..0b258496 100644 --- a/Erika/Assets/Scripts/Unit/AfterImage/AfterImageAvatar.cs +++ b/Erika/Assets/Scripts/Unit/AfterImage/AfterImageAvatar.cs @@ -30,7 +30,7 @@ public class AfterImageAvatar : MonoBehaviour transform.position = prototype.transform.position; animator.runtimeAnimatorController = prototype.unitMotion.animator.runtimeAnimatorController; - animator.Play(prototype.unitMotion.stateHash, 0, prototype.unitMotion.playbackNormalizedTime); + animator.Play(prototype.unitMotion.stateHash, 0, prototype.unitMotion.playbackClampedNormalizedTime); animator.speed = 0.02f;
animator.Update(1 / 60f);
diff --git a/Erika/Assets/Scripts/Unit/AnimationData.cs b/Erika/Assets/Scripts/Unit/AnimationData.cs index 2d324d49..dab3d55c 100644 --- a/Erika/Assets/Scripts/Unit/AnimationData.cs +++ b/Erika/Assets/Scripts/Unit/AnimationData.cs @@ -9,14 +9,15 @@ using UnityEditor; // 不要修改枚举的顺序,只能在后面新加,不能删除
public enum EAnimationToogle
{
- Combo = 0, // 连击
+ Combo = 0, // 连击,是否可以按键触发combo
SuperArmor = 1, // 霸体
Break = 2, // 打断
- SkillLink = 3, // 技能连招
- Link = 4, // 普攻连招
+ SkillLink = 3, // 技能连招,开启后允许按键触发combo
+ ComboLink = 4, // 普攻连招,开启后按键触发combo
MoveLink = 5, // 接移动
+ ChangeAble = 6, // 是否可以切换动作,从combo池中拿出下一个动作
}
[Serializable]
diff --git a/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs b/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs index ecc4daa4..bec49d66 100644 --- a/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs +++ b/Erika/Assets/Scripts/Unit/AnimatorLayerInfo.cs @@ -106,7 +106,7 @@ public class AnimatorLayerInfo { get { - return playbackNormalizedTime * clipInfo.clip.length; + return playbackClampedNormalizedTime * clipInfo.clip.length; } } @@ -121,7 +121,7 @@ public class AnimatorLayerInfo } // 播放进度百分比,[0-1],是逻辑上的,如果动画不是loop,那么播放完后normalizedTime是1 - public float playbackNormalizedTime + public float playbackClampedNormalizedTime { get { @@ -209,7 +209,7 @@ public class AnimatorLayerInfo { if (m_AnimationData == null) return false; - return m_AnimationData.IsToggleOpen(toggle, playbackNormalizedTime); + return m_AnimationData.IsToggleOpen(toggle, playbackClampedNormalizedTime); } public void OnUpdate() @@ -220,7 +220,7 @@ public class AnimatorLayerInfo // 播放速度控制 if (applySpeedCurve && animationData != null && animationData.speedCurve != null) { - playbackSpeed = animationData.speedCurve.Evaluate(playbackNormalizedTime); + playbackSpeed = animationData.speedCurve.Evaluate(playbackClampedNormalizedTime); } } diff --git a/Erika/Assets/Scripts/Unit/AnimatorState.cs b/Erika/Assets/Scripts/Unit/AnimatorState.cs index 62d59239..8bb8a002 100644 --- a/Erika/Assets/Scripts/Unit/AnimatorState.cs +++ b/Erika/Assets/Scripts/Unit/AnimatorState.cs @@ -8,8 +8,6 @@ using UnityEngine; /// </summary> public enum EAnimatorState { - None = 0, - // locomotion __Localmotion = 1, Idle, diff --git a/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs b/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs index 2af3442a..8593980c 100644 --- a/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs +++ b/Erika/Assets/Scripts/Unit/Collider/CollisionHandler.cs @@ -25,7 +25,7 @@ public class CollisionHandler : MonoBehaviour this.m_Owner = owner; this.transform.SetParent(owner.transform); - this.transform.localPosition = Vector3.zero; + this.transform.ResetTransformation(); m_Collider = GetComponent<Collider>(); } @@ -43,7 +43,7 @@ public class CollisionHandler : MonoBehaviour { BoxCollider bc = collider as BoxCollider; Vector3 center = info.position; - Vector3 localPosition = m_Owner.faceRotation * center; + Vector3 localPosition = center;// m_Owner.faceRotation * center; switch(info.collider.pivot) { case ColliderBox.Pivot.MiddleBottom: diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs index 8a69314d..a19512ec 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitMotion.cs @@ -32,6 +32,10 @@ public class UnitMotion : UnitComponent // 角色的所有动作数据,包括(动画、事件、RM) public UnitMotionData m_MotionData; + private TimelineEventProxy m_TimelineEventProxy; + + #region 动作状态 + // 当前动作 protected int m_currentMotionIDID; public int currentMotionID @@ -93,7 +97,8 @@ public class UnitMotion : UnitComponent } } - public float playbackNormalizedTime + // 归一化的动画播放时间 + public float playbackClampedNormalizedTime { get { @@ -105,12 +110,21 @@ public class UnitMotion : UnitComponent } } - public AnimatorStateInfo stateInfo + // 并非准确的播放时间,只是逻辑时间,因为动画会加速减速 + public float playbackClampedTimeInSeconds + { + get + { + return playbackClampedNormalizedTime * animationClip.length; + } + } + + public AnimatorStateInfo stateInfo { get { AnimatorStateInfo stateInfo = m_Animator.GetCurrentAnimatorStateInfo(0); - if (isInTransition) // 过渡中的动作认为当前动作是下一个动作 + if (isInTransition) // 过渡中的动作认为当前动作是下一个动作(为了保证及时性,和m_CUrrentMotionID保证一致) { stateInfo = m_Animator.GetNextAnimatorStateInfo(0); } @@ -124,48 +138,53 @@ public class UnitMotion : UnitComponent { return stateInfo.shortNameHash; } - } + } - // 并非准确的播放时间,只是逻辑时间,因为动画会加速减速 - public float playbackTimeInSeconds - { - get - { - return playbackNormalizedTime * animationClip.length; - } - } + public float playbackSpeed + { + get + { + //return m_Animator.GetFloat("PlaybackSpeed" + 0); + return m_Animator.speed; + } + set + { + float v = Mathf.Clamp(value, 0, 10); + //m_Animator.SetFloat("PlaybackSpeed" + 0, v); + m_Animator.speed = v; + } + } - private TimelineEventProxy m_TimelineEventProxy; + /// <summary> + /// 当前动作是否是motionId + /// </summary> + /// <param name="motionId"></param> + /// <returns></returns> + public bool IsCurrent(int motionId) + { + if (motionId == 0) + return false; + return m_currentMotionIDID == motionId; + } - public float playbackSpeed - { - get - { - return m_Animator.GetFloat("PlaybackSpeed" + 0); - } - set - { - float v = Mathf.Clamp(value, 0, 10); - m_Animator.SetFloat("PlaybackSpeed" + 0, v); - } - } + #endregion public override void OnUpdate() { base.OnUpdate(); // 执行事件 - m_TimelineEventProxy.ExecuteAnimationEvents(animationData, playbackTimeInSeconds * TimelineEventProxy.FPS); + m_TimelineEventProxy.ExecuteAnimationEvents(animationData, playbackClampedTimeInSeconds * TimelineEventProxy.FPS); // 播放速度控制 if (/*applySpeedCurve && */animationData != null && animationData.speedCurve != null) { - playbackSpeed = animationData.speedCurve.Evaluate(playbackNormalizedTime); + playbackSpeed = animationData.speedCurve.Evaluate(playbackClampedNormalizedTime); } } public bool IsToggleOpen(EAnimationToogle toggle) { - return animationData.IsToggleOpen(toggle, playbackNormalizedTime); + return animationData.IsToggleOpen(toggle, playbackClampedNormalizedTime); } //public override void Initialize() @@ -276,6 +295,21 @@ public class UnitMotion : UnitComponent #region 播放动作,对外屏蔽Animator /// <summary> + /// 重置所有trigger的状态,否则在过渡时切换另一个动作会有问题,导致切换失败 + /// </summary> + private void ClearAllTriggers() + { + var allMotions = m_MotionData.allMotions; + if (allMotions == null || allMotions.Count == 0) + return; + allMotions.ForEach(m => { + if (m.hide) + return; + m_Animator.ResetTrigger("To" + m.animatorState.ToString()); + }); + } + + /// <summary> /// 用trigger跳转动作 /// </summary> /// <param name="animType"></param> @@ -293,6 +327,8 @@ public class UnitMotion : UnitComponent if (!overrideAnim) return; + ClearAllTriggers(); + string trigger = "To" + stateName; m_Animator.SetTrigger(trigger); currentMotionID = motion.uid; @@ -309,6 +345,8 @@ public class UnitMotion : UnitComponent if (!overrideAnim) return; + ClearAllTriggers(); + string trigger = "To" + stateName; m_Animator.SetTrigger(trigger); currentMotionID = motion.uid; diff --git a/Erika/Assets/Scripts/Unit/Components/UnitBody.cs b/Erika/Assets/Scripts/Unit/Components/UnitBody.cs index cc7ac348..e2c01f0e 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitBody.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitBody.cs @@ -4,9 +4,9 @@ using UnityEngine; public class UnitBody : UnitComponent
{
- public override void Initialize()
+ public override void Initialize(object obj = null)
{
- base.Initialize();
+ base.Initialize(obj);
}
public override void OnUpdate()
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs b/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs index 1d216a06..b0910c0c 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitCollider.cs @@ -30,9 +30,9 @@ public class UnitCollider : UnitComponent base.OnDestroy(); } - public override void Initialize() + public override void Initialize(object obj = null) { - base.Initialize(); + base.Initialize(obj); showGizmos = true; m_AllColliders.Clear(); @@ -46,7 +46,7 @@ public class UnitCollider : UnitComponent public ColliderInfo[] GetCurrentBoxesInfoByType(ColliderBox.EColliderType type) { AnimationData animData = m_Owner.unitMotion.animationData; - float playbackTime = m_Owner.unitMotion.playbackNormalizedTime * m_Owner.unitMotion.animationClip.length; + float playbackTime = m_Owner.unitMotion.playbackClampedNormalizedTime * m_Owner.unitMotion.animationClip.length; //float playbackTime = layerInfo.playbackRealTimeInSeconds; ColliderInfo[] infos = animData.GetActiveCollidersInfo(type, playbackTime); return infos; @@ -86,20 +86,26 @@ public class UnitCollider : UnitComponent public override void OnUpdate() { + } + + public override void OnFixedUpdate() + { + base.OnFixedUpdate(); + m_ActiveColliders.Clear(); for (int i = (int)ColliderBox.EColliderType.HitBox; i < (int)ColliderBox.EColliderType.End; ++i) { ColliderBox.EColliderType colliderType = (ColliderBox.EColliderType)i; ColliderInfo[] activeColliders = GetCurrentBoxesInfoByType(colliderType); - if(activeColliders == null || activeColliders.Length == 0) + if (activeColliders == null || activeColliders.Length == 0) continue; - for(int j = 0; j < activeColliders.Length; ++j) + for (int j = 0; j < activeColliders.Length; ++j) { ColliderInfo info = activeColliders[j]; m_ActiveColliders.Add(info.uid); CollisionHandler handler = m_AllColliders.Find(s => s.colliderBox.uid == info.uid); - if(handler == null) + if (handler == null) { handler = ResourceManager.Instance.CreateObj<CollisionHandler>(StaticDefine.collider); handler.Initialize(m_Owner, info.collider); @@ -109,10 +115,10 @@ public class UnitCollider : UnitComponent } } - for(int i = m_AllColliders.Count - 1; i >= 0; --i) + for (int i = m_AllColliders.Count - 1; i >= 0; --i) { CollisionHandler handler = m_AllColliders[i]; - if(!m_ActiveColliders.Contains(handler.colliderBox.uid)) + if (!m_ActiveColliders.Contains(handler.colliderBox.uid)) { m_AllColliders.RemoveAt(i); diff --git a/Erika/Assets/Scripts/Unit/Components/UnitComponent.cs b/Erika/Assets/Scripts/Unit/Components/UnitComponent.cs index 948beba4..414a13bd 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitComponent.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitComponent.cs @@ -27,12 +27,7 @@ public class UnitComponent : MonoBehaviour { } - public virtual void Initialize() - { - m_Owner = GetComponent<UnitController>(); - } - - public virtual void Initialize(object param)
+ public virtual void Initialize(object param = null)
{
m_Owner = GetComponent<UnitController>(); } diff --git a/Erika/Assets/Scripts/Unit/Components/UnitLensEffect.cs b/Erika/Assets/Scripts/Unit/Components/UnitLensEffect.cs index 0511b1bb..13ccc08e 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitLensEffect.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitLensEffect.cs @@ -24,9 +24,9 @@ public partial class UnitLensEffect : UnitComponent m_CommandBufferPool = new ObjectPool<CommandBuffer>(null, null);
}
- public override void Initialize()
+ public override void Initialize(object obj = null)
{
- base.Initialize();
+ base.Initialize(obj);
renderers = new List<RendererProxy>();
m_Effects = new List<LensEffectBase>(); diff --git a/Erika/Assets/Scripts/Unit/Components/UnitPostEffect.cs b/Erika/Assets/Scripts/Unit/Components/UnitPostEffect.cs index ad98ff6a..872f2df1 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitPostEffect.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitPostEffect.cs @@ -5,9 +5,9 @@ using UnityEngine; public class UnitPostEffect : UnitComponent { - public override void Initialize() + public override void Initialize(object obj) { - base.Initialize(); + base.Initialize(obj); } diff --git a/Erika/Assets/Scripts/Unit/Components/UnitPreprocessing.cs b/Erika/Assets/Scripts/Unit/Components/UnitPreprocessing.cs index 8c56f0b6..00770ce2 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitPreprocessing.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitPreprocessing.cs @@ -27,9 +27,9 @@ public class UnitPreprocessing : UnitComponent private Material m_MaterialDepth; - public override void Initialize() + public override void Initialize(object obj = null) { - base.Initialize(); + base.Initialize(obj); } public override void OnPostInitialize() diff --git a/Erika/Assets/Scripts/Unit/Components/UnitRender.cs b/Erika/Assets/Scripts/Unit/Components/UnitRender.cs index a5822ffe..d20e56a8 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitRender.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitRender.cs @@ -19,9 +19,9 @@ public class UnitRender : UnitComponent }
} - public override void Initialize()
+ public override void Initialize(object obj = null)
{
- base.Initialize();
+ base.Initialize(obj);
} public override void OnPostInitialize()
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitSkill.cs b/Erika/Assets/Scripts/Unit/Components/UnitSkill.cs index 4af856f2..c8f31f31 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitSkill.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitSkill.cs @@ -2,12 +2,15 @@ using System.Collections.Generic; using UnityEngine; -/// <summary> -/// 技能逻辑,包含combo -/// </summary> [DisallowMultipleComponent] public class UnitSkill : UnitComponent { + public struct Param + { + public List<SkillData> skills; + public List<ComboData> combos; + } + //角色所有技能数据 protected List<SkillData> m_AllSkills; @@ -29,4 +32,39 @@ public class UnitSkill : UnitComponent return owner.unitStatemachine; } } + + public override void Initialize(object obj = null) + { + base.Initialize(obj); + + Param param = (Param)obj; + m_AllSkills = param.skills; + m_AllCombos = param.combos; + + + } + + #region 技能状态判定 + + /// <summary> + /// 是否可以连招 + /// </summary> + /// <returns></returns> + public bool IsLink() + { + return false; + } + + public bool IsSkillMoveAble() + { + return false; + } + + public bool CanSkillMove() + { + return false; + } + + #endregion + } diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState.cs index e44c7f85..e8eec45e 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitState/Erika/PCState.cs @@ -44,9 +44,9 @@ public partial class PCState : UnitState private EUnitState m_PrevState; - public override void Initialize() + public override void Initialize(object obj) { - base.Initialize(); + base.Initialize(obj); owner.onTimelineEvent += OnTimeLineEvent; } diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs index e6b526f7..49ace09d 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitState/MonsterState.cs @@ -31,9 +31,9 @@ public class MonsterState : UnitState UnitMotion unitMotion { get { return m_Owner.unitMotion; } } - public override void Initialize() + public override void Initialize(object obj) { - base.Initialize(); + base.Initialize(obj); } public void ChangeState<T>(EUnitState nextState, T param = default, bool bForce = false) @@ -116,7 +116,7 @@ public class MonsterState : UnitState yield return null; while (true) { - //bool reachEnd = m_Owner.monsterAnimation.playbackNormalizedTime == 1; + //bool reachEnd = m_Owner.monsterAnimation.playbackClampedNormalizedTime == 1; //if(reachEnd) //{ // ChangeState(EUnitState.Idle, new IdleParam()); @@ -140,7 +140,7 @@ public class MonsterState : UnitState yield return null; while (true) { - //bool reachEnd = m_Owner.monsterAnimation.playbackNormalizedTime == 1; + //bool reachEnd = m_Owner.monsterAnimation.playbackClampedNormalizedTime == 1; //if (reachEnd) //{ // //yield return new WaitForSeconds(1f); @@ -167,7 +167,7 @@ public class MonsterState : UnitState float g = -15.8f; while (true) { - //bool reachEnd = m_Owner.monsterAnimation.playbackNormalizedTime == 1; + //bool reachEnd = m_Owner.monsterAnimation.playbackClampedNormalizedTime == 1; //if (reachEnd) //{ // vy += g * Time.deltaTime; @@ -198,7 +198,7 @@ public class MonsterState : UnitState yield return null; while (true) { - //bool reachEnd = m_Owner.monsterAnimation.playbackNormalizedTime == 1; + //bool reachEnd = m_Owner.monsterAnimation.playbackClampedNormalizedTime == 1; //if (reachEnd) //{ // ChangeState(EUnitState.Idle, new IdleParam()); diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs index 924b3014..c9a39513 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs @@ -16,7 +16,7 @@ public class UnitState : UnitComponent {
get
{
- return owner.unitMotion.playbackNormalizedTime == 1;
+ return owner.unitMotion.playbackClampedNormalizedTime == 1;
}
} @@ -27,7 +27,7 @@ public class UnitState : UnitComponent {
if (!owner.unitMotion.animationData.HasProperty(EAnimationProperty.Endpoint))
return false;
- return owner.unitMotion.playbackNormalizedTime >= owner.unitMotion.animationData.GetProperty(EAnimationProperty.Endpoint);
+ return owner.unitMotion.playbackClampedNormalizedTime >= owner.unitMotion.animationData.GetProperty(EAnimationProperty.Endpoint);
}
} @@ -57,7 +57,7 @@ public class UnitState : UnitComponent {
get
{
- return owner.unitMotion.IsToggleOpen(EAnimationToogle.Link);
+ return owner.unitMotion.IsToggleOpen(EAnimationToogle.ComboLink);
}
} diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs index aa238da7..443450f0 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/IdleState.cs @@ -27,6 +27,7 @@ namespace UnitStates.Common public override void OnFixedUpdate() { + } public override void OnUpdate() diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/SkillState.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/SkillState.cs new file mode 100644 index 00000000..061a607c --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/SkillState.cs @@ -0,0 +1,35 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace UnitStates.Common +{ + + public class SkillState : UnitStateBase + { + public struct SkillParam : IStateParam + { + } + + public override void ModifyNextState(EUnitState state, UnitStateBase nextState) + { + } + + public override void OnEnter(IStateParam param) + { + m_Motion.Trigger(EAnimationType.Idle); + } + + public override void OnExit() + { + } + + public override void OnFixedUpdate() + { + } + + public override void OnUpdate() + { + } + } +} diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/SkillState.cs.meta b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/SkillState.cs.meta new file mode 100644 index 00000000..94c2a8e2 --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/Common/SkillState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: caaab93386974e5429d5ba2f97728f44 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs index f7b76b3a..e6c820d3 100644 --- a/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs +++ b/Erika/Assets/Scripts/Unit/Components/UnitStatemachine/UnitStatemachine.cs @@ -117,8 +117,11 @@ public sealed class UnitStatemachine : UnitComponent /// 切换到目标状态 /// </summary> /// <param name="state"></param> - public void ChangeState(EUnitState state, UnitStateBase.IStateParam param) + public bool ChangeState(EUnitState state, UnitStateBase.IStateParam param, bool bForce = false) { + if (!bForce && m_CurrentState == state) + return true; + UnitStateBase currentState = GetState(m_CurrentState); UnitStateBase nextState = GetState(state); if (currentState != null) @@ -131,6 +134,7 @@ public sealed class UnitStatemachine : UnitComponent { nextState.OnEnter(param); } + return true; } /// <summary> diff --git a/Erika/Assets/Scripts/Unit/Controller/PCController.cs b/Erika/Assets/Scripts/Unit/Controller/PCController.cs index 95320912..0c3ef100 100644 --- a/Erika/Assets/Scripts/Unit/Controller/PCController.cs +++ b/Erika/Assets/Scripts/Unit/Controller/PCController.cs @@ -39,6 +39,7 @@ public sealed partial class PCController : UnitController {
fsm.AddState(EUnitState.Idle, new UnitStates.Common.IdleState());
fsm.AddState(EUnitState.Move, new UnitStates.Common.MoveState());
+ fsm.AddState(EUnitState.Skill, new UnitStates.Common.SkillState());
fsm.ChangeState(EUnitState.Idle, null);
}
diff --git a/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs b/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs index 7ec5d30d..7f86a574 100644 --- a/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs +++ b/Erika/Assets/Scripts/Unit/Controller/PCController_Commands.cs @@ -2,12 +2,24 @@ using System.Collections.Generic; using UnityEngine; +// Input.XXXX() +// -> InputManager.InputXXX() +// -> PCController.CommandXXX() + public sealed partial class PCController : UnitController { - public void CommandMove() + public void CommandTurn (EUnitDirection dir) { - unitStatemachine.ChangeState(EUnitState.Move, null); + Turn(dir == EUnitDirection.Right); + } + + public void CommandMove(EUnitDirection dir) + { + if (!IsMoveAble()) + return; + + EnterMove(); } public void CommandIdle() @@ -23,7 +35,7 @@ public sealed partial class PCController : UnitController { } - public void CommandSkill() + public void CommandSkill(int id) { } diff --git a/Erika/Assets/Scripts/Unit/Controller/PCController_States.cs b/Erika/Assets/Scripts/Unit/Controller/PCController_States.cs new file mode 100644 index 00000000..6eee60b5 --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Controller/PCController_States.cs @@ -0,0 +1,25 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public sealed partial class PCController : UnitController +{ + + private bool IsMoveAble() + { + return true; + } + + #region 操作statemachine + + private void EnterMove() + { + if (fsm.IsInState(EUnitState.Move)) + return; + + fsm.ChangeState(EUnitState.Move, null); + } + + #endregion + +} diff --git a/Erika/Assets/Scripts/Unit/Controller/PCController_States.cs.meta b/Erika/Assets/Scripts/Unit/Controller/PCController_States.cs.meta new file mode 100644 index 00000000..f1ccd46a --- /dev/null +++ b/Erika/Assets/Scripts/Unit/Controller/PCController_States.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fafb158c8bb0c4340a63c4cb743706de +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Erika/Assets/Scripts/Unit/Controller/UnitController.cs b/Erika/Assets/Scripts/Unit/Controller/UnitController.cs index 3fec206a..9f765aae 100644 --- a/Erika/Assets/Scripts/Unit/Controller/UnitController.cs +++ b/Erika/Assets/Scripts/Unit/Controller/UnitController.cs @@ -9,6 +9,12 @@ using UnityEngine; // void OnGrab();
//}
+public enum EUnitDirection
+{
+ Right = 0, // 默认朝右
+ Left = 1, // 左
+}
+
/// <summary>
/// 角色控制器,包含所有角色组件的引用。可扩展
/// </summary>
@@ -210,9 +216,12 @@ public class UnitController : MonoBehaviour/*, Interactable*/ unitStatemachine = GetOrAddUnitComponent<UnitStatemachine>();
unitStatemachine.Initialize();
-
+
+ UnitSkill.Param unitSkillParam = new UnitSkill.Param();
+ unitSkillParam.combos = profile.combos;
+ unitSkillParam.skills = profile.skills;
unitSkill = GetOrAddUnitComponent<UnitSkill>();
- unitSkill.Initialize();
+ unitSkill.Initialize(unitSkillParam);
unitRootMotion = GetOrAddUnitComponent<UnitRootMotion>();
unitRootMotion.Initialize();
@@ -231,8 +240,11 @@ public class UnitController : MonoBehaviour/*, Interactable*/ unitPreprocessing = GetOrAddUnitComponent<UnitPreprocessing>();
unitPreprocessing.Initialize();
+
#endregion
+ unitObj.AddComponent<RootMotionProxy>();
+
unitDetail = gameObject.GetComponentInChildren<UnitDetail>();
unitPhysicsBoxes = gameObject.GetComponentInChildren<UnitPhysicsBoxCollection>();
@@ -290,7 +302,7 @@ public class UnitController : MonoBehaviour/*, Interactable*/ snapshot.trs = new TRS(unitObj.transform.position, unitObj.transform.rotation, unitObj.transform.lossyScale);
snapshot.unit = this;
snapshot.animStateHash = unitMotion.stateHash;
- snapshot.normalizedTime = unitMotion.playbackNormalizedTime;
+ snapshot.normalizedTime = unitMotion.playbackClampedNormalizedTime;
return snapshot;
}
diff --git a/Erika/Assets/Scripts/Unit/RootMotionProxy.cs b/Erika/Assets/Scripts/Unit/RootMotionProxy.cs index 96bba7ca..871c4f28 100644 --- a/Erika/Assets/Scripts/Unit/RootMotionProxy.cs +++ b/Erika/Assets/Scripts/Unit/RootMotionProxy.cs @@ -5,6 +5,9 @@ using UnityEngine; public class RootMotionProxy : MonoBehaviour { + /// <summary> + /// 有OnAnimatorMove方法时会屏蔽animator的apply rootmotion + /// </summary> private void OnAnimatorMove() { } diff --git a/Erika/Assets/Scripts/Unit/UnitProfile.cs b/Erika/Assets/Scripts/Unit/UnitProfile.cs index 37e07c7a..66e007ff 100644 --- a/Erika/Assets/Scripts/Unit/UnitProfile.cs +++ b/Erika/Assets/Scripts/Unit/UnitProfile.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using UnityEngine; /// <summary> -/// 用这个表创建unit +/// unit表 /// </summary> [CreateAssetMenu(fileName = "New Unit Profile", menuName = "Erika/Unit Profile")] public class UnitProfile : ScriptableObject @@ -39,4 +39,5 @@ public class UnitProfile : ScriptableObject [Tooltip("连招")] public List<ComboData> combos; -}
\ No newline at end of file +} + diff --git a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs index 661ecc5e..cc463c4b 100644 --- a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs +++ b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs @@ -16,9 +16,9 @@ public class UnitRootMotion : UnitComponent float m_PrevFrame;
AnimationData m_PrevAnimationData;
- public override void Initialize()
+ public override void Initialize(object obj = null)
{
- base.Initialize();
+ base.Initialize(obj);
m_PrevFrame = 0;
m_PrevAnimationData = null;
@@ -81,7 +81,7 @@ public class UnitRootMotion : UnitComponent {
m_Owner.unitMotion.animator.transform.localPosition = Vector3.zero;
- //UpdateRootMotion();
+ UpdateRootMotion();
}
public void OnAnimationChange()
@@ -89,13 +89,13 @@ public class UnitRootMotion : UnitComponent m_PrevAnimationData = null;
}
- public void UpdateRootMotion()
+ public void UpdateRootMotion()
{
bool overrideRootMotion = m_Owner.unitMotion.animationData.overrideRootMotion;
if(overrideRootMotion)
{
var rmData = m_Owner.unitMotion.animationData.rootMotionOverrideData;
- float frame = m_Owner.unitMotion.playbackNormalizedTime * m_Owner.unitMotion.animationClip.length * TimelineEventProxy.FPS;
+ float frame = m_Owner.unitMotion.playbackClampedNormalizedTime * m_Owner.unitMotion.animationClip.length * TimelineEventProxy.FPS;
var animData = m_Owner.unitMotion.animationData;
if(animData != m_PrevAnimationData)
{
@@ -129,7 +129,7 @@ public class UnitRootMotion : UnitComponent dest.y = Mathf.Max(0, dest.y); // 从地面以下拉回
//m_Owner.transform.position += RootMotionUtility.ExchangeXZ(dest); // 不需要exchangeXZ
m_Owner.unitCharacterController.Move(dest);
- }
+ }
}
#endif
|