summaryrefslogtreecommitdiff
path: root/Erika/Assets/Scripts/Unit
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2022-06-21 21:13:15 +0800
committerchai <chaifix@163.com>2022-06-21 21:13:15 +0800
commitc7ee5ed7c9575eda05404f6022992f179b36d3a0 (patch)
tree859f0b9e13f1dbeb87f01172244e2e5b63ca5638 /Erika/Assets/Scripts/Unit
parentfb8dba84fe70d4bad6d22900716a67b02766448a (diff)
parent6bdc4612f4e77f513330a1b2af340341256544ba (diff)
Merge branch 'master' of warmcat.org:/home/git-repo/Erika into HEAD
# Conflicts: # Erika/Assets/Bundle/Materials/Unit/Effect.meta # Erika/Assets/Bundle/Shaders/Include.meta # Erika/Assets/Bundle/Shaders/Unit/Effect.meta # Erika/Assets/Bundle/Unit/Monster/Robots_Prowler/ActionData.meta # Erika/Assets/Bundle/Unit/Monster/Robots_Prowler/UnitData.meta # Erika/Assets/Bundle/Unit/NPC.meta # Erika/Assets/Bundle/Unit/PC/Erika/Materials/Normal.meta # Erika/Assets/Bundle/Unit/PC/Erika/Models.meta # Erika/Assets/Bundle/Unit/PC/Erika/UnitData.meta # Erika/Assets/Bundle/Unit/PC/ErikaCyborg/ActionData.meta # Erika/Assets/Bundle/Unit/PC/ErikaCyborg/AnimationClip.meta # Erika/Assets/Bundle/Unit/PC/ErikaCyborg/AnimationData.meta # Erika/Assets/Bundle/Unit/PC/ErikaCyborg/Materials/AfterImage.meta # Erika/Assets/Bundle/Unit/PC/ErikaCyborg/Materials/Normal.meta # Erika/Assets/Bundle/Unit/PC/ErikaCyborg/Models.meta # Erika/Assets/Bundle/Unit/PC/ErikaCyborg/RootMotion.meta # Erika/Assets/Bundle/Unit/PC/ErikaCyborg/UnitData.meta # Erika/Assets/Bundle/Unit/PC/ErikaCyborg/Weapons.meta # Erika/Assets/Bundle/Unit/Prop.meta # Erika/Assets/Scripts/Managers/ResourceManager.cs # Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs # Erika/Assets/Scripts/Utils/LogHelper.cs # Erika/Assets/Scripts/Utils/LogTag.cs # Erika/Assets/Scripts/Utils/LogTag.cs.meta
Diffstat (limited to 'Erika/Assets/Scripts/Unit')
-rw-r--r--Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs3
-rw-r--r--Erika/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs3
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs8
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs64
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitComponent.cs3
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs34
-rw-r--r--Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs5
-rw-r--r--Erika/Assets/Scripts/Unit/TransitionData.cs24
-rw-r--r--Erika/Assets/Scripts/Unit/TransitionData.cs.meta11
-rw-r--r--Erika/Assets/Scripts/Unit/UnitRootMotion.cs7
10 files changed, 111 insertions, 51 deletions
diff --git a/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs b/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs
index 771e946b..295b1025 100644
--- a/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs
+++ b/Erika/Assets/Scripts/Unit/Action/WaitForActionReachEnd.cs
@@ -3,6 +3,9 @@ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
+/// <summary>
+/// 当前动作播放结束
+/// </summary>
public class WaitForActionReachEnd : IEnumerator
{
UnitAnimation m_UnitAnimation;
diff --git a/Erika/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs b/Erika/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs
index 82f3e792..16fbc2e5 100644
--- a/Erika/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs
+++ b/Erika/Assets/Scripts/Unit/Action/WaitForTransitionDone.cs
@@ -3,6 +3,9 @@ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
+/// <summary>
+/// 等待动画过渡结束
+/// </summary>
public class WaitForTransitionDone : IEnumerator
{
UnitAnimation m_UnitAnimation;
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs
index 74c33626..0620c0b6 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/PCAnimation.cs
@@ -138,10 +138,10 @@ public class PCAnimation : UnitAnimation
{
m_LayerInfo[0].OnUpdate();
return;
- for (int i = 0; i < m_LayerInfo.Length; ++i)
- {
- m_LayerInfo[i].OnUpdate();
- }
+ //for (int i = 0; i < m_LayerInfo.Length; ++i)
+ //{
+ // m_LayerInfo[i].OnUpdate();
+ //}
}
void UpdateAnimation()
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs
index a5de6c57..931e49ab 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitAnimation/UnitAnimation.cs
@@ -1,17 +1,15 @@
#define ANIM_CROSS_FADE
-
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
-
#if UNITY_EDITOR
-using UnityEditor;
+using UnityEditor;
#endif
-
-//http://unitylore.org/wiki/doku.php?id=l3y0gj
-
-// 单独一层动画
+
+// http://unitylore.org/wiki/doku.php?id=l3y0gj
+
+// 单独一层动画
public class AnimatorLayerInfo
{
public int layer;
@@ -31,14 +29,17 @@ public class AnimatorLayerInfo
get
{
AnimatorClipInfo[] clipInfos = clipsInfo;
- if (clipInfos == null || clipInfos.Length == 0)
+ if (clipInfos == null || clipInfos.Length == 0)
+ {
+ LogHelper.LogError(LogTag.UnitAnimation, "No current animation.");
return null;
+ }
var clip = clipInfos[0]; //选第一个
string folder = m_UnitAnimation.owner.folder;
string name = clip.clip.name;
if (m_AnimationData != null && m_AnimationData.animationName == name)
return m_AnimationData;
- string path = folder + "AnimationData/" + name + ".asset" ; // 要注意这里使用名字区别的,因为最终每个角色的动画都会在一个目录下面
+ string path = folder + "AnimationData/" + name + ".asset" ; // 要注意这里是用名字区别的,因为最终每个角色的动画都会在一个目录下面
m_AnimationData = ResourceManager.Instance.LoadAsset<AnimationData>(path);
return m_AnimationData;
}
@@ -55,7 +56,6 @@ public class AnimatorLayerInfo
{
stateInfo = m_Animator.GetNextAnimatorStateInfo(layerIndex);
}
- // Debug.Assert(stateInfo.IsName(layerName + "." + m_CurrentState));
return stateInfo;
}
}
@@ -127,11 +127,6 @@ public class AnimatorLayerInfo
AnimatorStateInfo state = stateInfo;
if (!state.loop && state.normalizedTime > 1)
return 1;
- //if (state.IsName("Attack0"))
- //{
- // Debug.Log("normalizedTime=" + state.normalizedTime);
- // Debug.Log("playbackTimeInSeconds=" + state.normalizedTime * clipInfo.clip.length);
- //}
return state.normalizedTime % 1f;
}
}
@@ -190,12 +185,12 @@ public class AnimatorLayerInfo
this.m_UnitAnimation = unitAnimation;
this.m_Animator = animator;
this.layer = layer;
- m_CalcPlaybackTimeCoroutine = unitAnimation.StartCoroutine(CoCalcPlaybackRealTimeCoroutine());
+ m_CalcPlaybackTimeCoroutine = unitAnimation.StartCoroutine(CalcPlaybackRealTimeCoroutine());
m_TimelineEventProxy = new TimelineEventProxy(unitAnimation.owner);
applySpeedCurve = true;
}
- IEnumerator CoCalcPlaybackRealTimeCoroutine()
+ IEnumerator CalcPlaybackRealTimeCoroutine()
{
while (true)
{
@@ -228,13 +223,6 @@ public class AnimatorLayerInfo
}
}
- /// <summary>
- /// cross fade,不同状态间切换的间隔预先设置或者动态根据Pose的差异计算
- /// </summary>
- /// <param name="animState"></param>
- /// <param name="normalizedTransitionDuration"></param>
- /// <param name="normalizedTimeOffset"></param>
- /// <param name="normalizedTransitionTime"></param>
public void OnCrossFade(string animState, float normalizedTransitionDuration, float normalizedTimeOffset, float normalizedTransitionTime )
{
m_CurrentState = animState;
@@ -244,11 +232,6 @@ public class AnimatorLayerInfo
playbackSpeed = 1;
}
- /// <summary>
- /// 直接播放动作
- /// </summary>
- /// <param name="animState"></param>
- /// <param name="normalizedTime"></param>
public void OnPlay(string animState, float normalizedTime)
{
m_CurrentState = animState;
@@ -272,12 +255,9 @@ public class UnitAnimation : UnitComponent
public virtual AnimatorLayerInfo baseLayer
{
get { return layers[0]; }
- }
-
- /// <summary>
- /// 角色动作只有一层,不使用layer mask和layer syncing
- /// </summary>
- public AnimatorLayerInfo layer
+ }
+
+ public AnimatorLayerInfo layer
{
get
{
@@ -298,6 +278,12 @@ public class UnitAnimation : UnitComponent
base.OnUpdate();
}
+ /// <summary>
+ /// 直接播放动作
+ /// </summary>
+ /// <param name="animState"></param>
+ /// <param name="layerIndex"></param>
+ /// <param name="normalizedTime"></param>
public void Play(string animState, int layerIndex = 0, float normalizedTime = float.NegativeInfinity)
{
AnimatorLayerInfo layer = this.layers[layerIndex];
@@ -312,6 +298,14 @@ public class UnitAnimation : UnitComponent
}
}
+ /// <summary>
+ /// CrossFade
+ /// </summary>
+ /// <param name="animState"></param>
+ /// <param name="normalizedTransitionDuration"></param>
+ /// <param name="layerIndex"></param>
+ /// <param name="normalizedTimeOffset"></param>
+ /// <param name="normalizedTransitionTime"></param>
public void CrossFade(string animState, float normalizedTransitionDuration, int layerIndex = 0, float normalizedTimeOffset = float.NegativeInfinity, float normalizedTransitionTime = 0.0f)
{
AnimatorLayerInfo layer = this.layers[layerIndex];
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitComponent.cs b/Erika/Assets/Scripts/Unit/Components/UnitComponent.cs
index 825b6d92..dd59f19f 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitComponent.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitComponent.cs
@@ -2,6 +2,9 @@
using System.Collections.Generic;
using UnityEngine;
+/// <summary>
+/// Unit组件
+/// </summary>
public class UnitComponent : MonoBehaviour
{
public UnitController owner { get { return m_Owner; } }
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs
index 738cc7ce..ff7ca78b 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitState/PCState_States.cs
@@ -108,7 +108,8 @@ public partial class PCState : UnitState
TryAttackToAir();
yield return null;
}
- ChangeState(EUnitState.Idle, new IdleParam());
+ ChangeState(EUnitState.Idle, new IdleParam());
+ yield break;
}
void OnMoveExit(EUnitState nextState)
@@ -136,6 +137,7 @@ public partial class PCState : UnitState
SkillParam skill = new SkillParam();
skill.offset = 0.12f;
ChangeState(EUnitState.AttackToAir, skill);
+ yield break;
}
}
@@ -154,6 +156,7 @@ public partial class PCState : UnitState
if (isAnimationReachEnd)
{
ChangeState(EUnitState.Idle, new IdleParam());
+ yield break;
}
yield return null;
@@ -184,12 +187,14 @@ public partial class PCState : UnitState
if (InputManager.Instance.TryCommand(0.5f, false, KeyCode.J))
{
ChangeState(EUnitState.AirAttack, new SkillParam());
+ yield break;
}
}
if (isAnimationReachEnd || isAnimationReachEndPoint)
{
- ChangeState(EUnitState.Landing, new LandingParam());
+ ChangeState(EUnitState.Landing, new LandingParam());
+ yield break;
}
yield return null;
}
@@ -228,14 +233,15 @@ public partial class PCState : UnitState
m_Owner.pcAnimation.AnimAirAttack(id++);
id %= total;
- yield return null; // 等待animator更新
+ //yield return null; // 等待animator更新
yield return new WaitForTransitionDone(m_Owner.pcAnimation);
}
}
if (isAnimationReachEnd)
{
- ChangeState(EUnitState.Landing, new LandingParam());
+ ChangeState(EUnitState.Landing, new LandingParam());
+ yield break;
}
yield return null;
@@ -259,7 +265,8 @@ public partial class PCState : UnitState
{
if (isAnimationReachEnd)
{
- ChangeState(EUnitState.Landing, new LandingParam());
+ ChangeState(EUnitState.Landing, new LandingParam());
+ yield break;
}
TryTianyin();
@@ -271,7 +278,8 @@ public partial class PCState : UnitState
if (Input.GetKeyDown("j"))
{
TryTurnAround();
- ChangeState(EUnitState.AirAttack, new SkillParam());
+ ChangeState(EUnitState.AirAttack, new SkillParam());
+ yield break;
}
}
@@ -298,18 +306,24 @@ public partial class PCState : UnitState
{
TurnLeft();
ChangeState(EUnitState.AirDash, new AirDashParam());
+ yield break;
}
if (InputManager.Instance.TryCommand(0.5f, KeyCode.D, KeyCode.D))
{
TurnRight();
ChangeState(EUnitState.AirDash, new AirDashParam());
+ yield break;
}
- if (isAnimationReachEnd)
+ if (isAnimationReachEnd)
+ {
ChangeState(EUnitState.Landing, new LandingParam());
+ yield break;
+ }
bool canAttack = m_Owner.pcAnimation.baseLayer.IsToggleOpen(EAnimationToogle.Combo);
if (Input.GetKeyDown("j") && canAttack)
{
- ChangeState(EUnitState.AirAttack, new SkillParam());
+ ChangeState(EUnitState.AirAttack, new SkillParam());
+ yield break;
}
yield return null;
}
@@ -361,6 +375,7 @@ public partial class PCState : UnitState
if (Input.GetKeyDown("j"))
{
ChangeState(EUnitState.AirAttack, new SkillParam());
+ yield break;
}
m_Owner.transform.position = pos;
@@ -374,7 +389,8 @@ public partial class PCState : UnitState
{
pos.y = 0;
m_Owner.transform.position = pos;
- ChangeState(EUnitState.Idle, new IdleParam());
+ ChangeState(EUnitState.Idle, new IdleParam());
+ yield break;
}
yield return null;
diff --git a/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs b/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs
index ff42c2be..2d39f606 100644
--- a/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs
+++ b/Erika/Assets/Scripts/Unit/Components/UnitState/UnitState.cs
@@ -4,7 +4,10 @@ using System.Collections;
using System.Collections.Generic;
using UnityEngine;
-// 角色状态机
+
+/// <summary>
+/// 角色状态机
+/// </summary>
[DisallowMultipleComponent]
public class UnitState : UnitComponent
{
diff --git a/Erika/Assets/Scripts/Unit/TransitionData.cs b/Erika/Assets/Scripts/Unit/TransitionData.cs
new file mode 100644
index 00000000..c0a47b5d
--- /dev/null
+++ b/Erika/Assets/Scripts/Unit/TransitionData.cs
@@ -0,0 +1,24 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+/// <summary>
+/// 动画过渡间隔配置
+/// </summary>
+public class TransitionData
+{
+ // 起始动画
+ public string fromAnimation;
+ // 结束动画
+ public string toAnimation;
+
+ public enum TransitionType
+ {
+ FixedTime, // 固定时间(秒)
+ NormalizedTime, // 归一化时间
+ PoseDifference, // 对比前后pose的差异
+ }
+
+ public float duration; // Fixedtime or Normlaizedtime
+
+}
diff --git a/Erika/Assets/Scripts/Unit/TransitionData.cs.meta b/Erika/Assets/Scripts/Unit/TransitionData.cs.meta
new file mode 100644
index 00000000..77e209a5
--- /dev/null
+++ b/Erika/Assets/Scripts/Unit/TransitionData.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0f0269041d05a4240a5012977f08db63
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs
index 5234daab..396189bc 100644
--- a/Erika/Assets/Scripts/Unit/UnitRootMotion.cs
+++ b/Erika/Assets/Scripts/Unit/UnitRootMotion.cs
@@ -5,7 +5,9 @@ using UnityEngine;
using UnityEditor;
#endif
-// 同步root motion到角色根节点
+/// <summary>
+/// 同步root motion到角色根节点
+/// </summary>
[DisallowMultipleComponent]
public class UnitRootMotion : UnitComponent
{
@@ -108,7 +110,7 @@ public class UnitRootMotion : UnitComponent
}
else
{
- // 因为Unti被旋转了90度,所以这里的deltaPosition的forward是x方向了
+ // 因为Unit被旋转了90度,所以这里的deltaPosition的forward是x方向了
Vector3 dest = m_Owner.unitAnimation.animator.deltaPosition;
dest.z = 0;
var state = m_Owner.unitAnimation.baseLayer.stateInfo;
@@ -117,6 +119,7 @@ public class UnitRootMotion : UnitComponent
{
dest.y = 0;
}
+ dest.y = Mathf.Max(0, dest.y); // 从地面以下拉回
//m_Owner.transform.position += RootMotionUtility.ExchangeXZ(dest); // 不需要exchangeXZ
m_Owner.transform.position += dest;
}