Multi-Floors Jump-Fall Animation

MultiFloors
Sascha 2023-08-16 11:55:39 +07:00
parent 1bb64c6b74
commit d18277e5ef
8 changed files with 15055 additions and 109 deletions

File diff suppressed because it is too large Load Diff

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 656b791f995bd97df88dcab765ca6629
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 6705282624c70f6b6bad52273aaa9f9f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

@ -28,6 +28,60 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-7813949928488344673
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Jump Down
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: 3889258018363239029}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 656b791f995bd97df88dcab765ca6629, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-6275708185945827372
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Jump Up
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: 2536144234008407466}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 6705282624c70f6b6bad52273aaa9f9f, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-3319961429774070512
AnimatorState:
serializedVersion: 6
@ -78,15 +132,23 @@ AnimatorStateMachine:
m_Position: {x: 300, y: 20, z: 0}
- serializedVersion: 1
m_State: {fileID: 5653169121862862346}
m_Position: {x: 600, y: 110, z: 0}
m_Position: {x: 560, y: 110, z: 0}
- serializedVersion: 1
m_State: {fileID: -6275708185945827372}
m_Position: {x: 40, y: 20, z: 0}
- serializedVersion: 1
m_State: {fileID: -7813949928488344673}
m_Position: {x: 40, y: 120, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_AnyStateTransitions:
- {fileID: 8886190454754367644}
- {fileID: 7988097314276463737}
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 760, y: 60, z: 0}
m_AnyStatePosition: {x: -150, y: 70, z: 0}
m_EntryPosition: {x: 70, y: 200, z: 0}
m_ExitPosition: {x: 540, y: -50, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -3319961429774070512}
--- !u!1101 &-401782204561343896
@ -141,6 +203,18 @@ AnimatorController:
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
- m_Name: JumpUp
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
- m_Name: JumpDown
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
@ -223,6 +297,28 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &2536144234008407466
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions: []
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -3319961429774070512}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 1
m_HasExitTime: 1
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &3190558205857764453
AnimatorStateTransition:
m_ObjectHideFlags: 1
@ -248,6 +344,28 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &3889258018363239029
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions: []
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -3319961429774070512}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 1
m_HasExitTime: 1
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &3966032925786685889
AnimatorStateTransition:
m_ObjectHideFlags: 1
@ -328,3 +446,53 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &7988097314276463737
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: JumpDown
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -7813949928488344673}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &8886190454754367644
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: JumpUp
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -6275708185945827372}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1

File diff suppressed because it is too large Load Diff

@ -10,11 +10,14 @@ namespace Actions {
private const float rotationSpeed = 10f;
private const float stoppingDistance = 0.1f;
private const int pathfindingDistanceMultiplier = 10;
private const float DIFFERENT_FLOORS_TELEPORT_TIMER_MAX = .5f;
[FormerlySerializedAs("MaxMoveDistance")] [SerializeField]
private int maxMoveDistance = 4;
private int currentPositionIndex;
private float differentFloorsTeleportTimer;
private bool isChangingFloors;
private List<Vector3> PositionList { get; set; }
@ -25,25 +28,48 @@ namespace Actions {
private void Update() {
if (!IsActive) return;
Vector3 targetPosition = PositionList[currentPositionIndex];
Vector3 moveDirection = (targetPosition - Unit.GetWorldPosition()).normalized;
transform.forward = Vector3.Lerp(transform.forward, moveDirection, rotationSpeed * Time.deltaTime); //Rotate towards targetPosition
if (Vector3.Distance(targetPosition, Unit.GetWorldPosition()) > stoppingDistance) {
//Move towards targetPosition
transform.position += moveSpeed * Time.deltaTime * moveDirection;
Vector3 targetPosition = PositionList[currentPositionIndex];
if (isChangingFloors) {
//Stop and teleport logic
differentFloorsTeleportTimer -= Time.deltaTime;
Vector3 targetSameFloorPosition = targetPosition;
targetSameFloorPosition.y = transform.position.y;
Vector3 rotateDirection = (targetSameFloorPosition - Unit.GetWorldPosition()).normalized;
transform.forward = Vector3.Slerp(transform.forward, rotateDirection, rotationSpeed * Time.deltaTime);
if (differentFloorsTeleportTimer < 0f) {
isChangingFloors = false;
transform.position = targetPosition;
}
}
else {
currentPositionIndex++;
if (currentPositionIndex < PositionList.Count) return;
//Regular move logic
Vector3 moveDirection = (targetPosition - Unit.GetWorldPosition()).normalized;
transform.forward = Vector3.Slerp(transform.forward, moveDirection, rotationSpeed * Time.deltaTime); //Rotate towards targetPosition
transform.position += moveSpeed * Time.deltaTime * moveDirection; //Move towards targetPosition
}
if (!(Vector3.Distance(targetPosition, Unit.GetWorldPosition()) < stoppingDistance)) return;
currentPositionIndex++;
if (currentPositionIndex >= PositionList.Count) {
OnStopMoving?.Invoke(this, EventArgs.Empty);
ActionComplete();
}
else {
targetPosition = PositionList[currentPositionIndex];
GridPosition targetGridPosition = LevelGrid.Instance.GetGridPosition(targetPosition);
GridPosition unitGridPosition = LevelGrid.Instance.GetGridPosition(transform.position);
if (targetGridPosition.Floor == unitGridPosition.Floor) return; //Same floor
isChangingFloors = true;
differentFloorsTeleportTimer = DIFFERENT_FLOORS_TELEPORT_TIMER_MAX;
OnChangeFloorsStarted?.Invoke(this, new() { unitGridPosition = unitGridPosition, targetGridPosition = targetGridPosition });
}
}
public event EventHandler OnStartMoving;
public event EventHandler OnStopMoving;
public event EventHandler<ChangeFloorsStartedEventArgs> OnChangeFloorsStarted;
public override List<GridPosition> GetValidActionGridPositionList() {
List<GridPosition> validGridPositionList = new();
@ -89,5 +115,10 @@ namespace Actions {
int targetCountAtGridPosition = Unit.GetAction<ShootAction>().GetTargetCountAtPosition(gridPosition);
return new(gridPosition, targetCountAtGridPosition * 10);
}
public class ChangeFloorsStartedEventArgs : EventArgs {
public GridPosition targetGridPosition;
public GridPosition unitGridPosition;
}
}
}

@ -7,6 +7,8 @@ public class UnitAnimator : MonoBehaviour {
private static readonly int isWalking = Animator.StringToHash("IsWalking");
private static readonly int shoot = Animator.StringToHash("Shoot");
private static readonly int swordSlash = Animator.StringToHash("SwordSlash");
private static readonly int jumpUp = Animator.StringToHash("JumpUp");
private static readonly int jumpDown = Animator.StringToHash("JumpDown");
[SerializeField] private Animator animator;
[SerializeField] private Transform bulletProjectilePrefab;
@ -20,6 +22,7 @@ public class UnitAnimator : MonoBehaviour {
if (TryGetComponent(out MoveAction moveAction)) {
moveAction.OnStartMoving += MoveAction_OnStartMoving;
moveAction.OnStopMoving += MoveAction_OnStopMoving;
moveAction.OnChangeFloorsStarted += MoveAction_OnChangeFloorsStarted;
}
if (TryGetComponent(out ShootAction shootAction)) {
@ -34,6 +37,8 @@ public class UnitAnimator : MonoBehaviour {
private void Start() => EquipRifle();
private void MoveAction_OnChangeFloorsStarted(object sender, MoveAction.ChangeFloorsStartedEventArgs e) => animator.SetTrigger(e.targetGridPosition.Floor > e.unitGridPosition.Floor ? jumpUp : jumpDown);
private void SwordAction_OnSwordActionStarted(object sender, EventArgs e) {
EquipSword();
animator.SetTrigger(swordSlash);