2023-08-27 02:58:19 +08:00
|
|
|
using System;
|
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
2024-02-21 01:40:53 +08:00
|
|
|
using Animancer;
|
2023-08-27 02:58:19 +08:00
|
|
|
using BITFALL.Player.Movement;
|
2024-04-19 00:40:34 +08:00
|
|
|
using BITKit;
|
2023-08-27 02:58:19 +08:00
|
|
|
using BITKit.Entities;
|
|
|
|
using BITKit.StateMachine;
|
2024-04-15 14:57:50 +08:00
|
|
|
using Cysharp.Threading.Tasks;
|
2023-08-27 02:58:19 +08:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
namespace BITFALL.Player.Animation.States
|
|
|
|
{
|
|
|
|
[Serializable]
|
|
|
|
public class Climb : PlayerAnimateStates
|
|
|
|
{
|
2024-04-19 00:40:34 +08:00
|
|
|
[SerializeField] private AnimationClip clip;
|
2023-08-27 02:58:19 +08:00
|
|
|
public override void OnStateEntry(IState old)
|
|
|
|
{
|
2024-04-19 00:40:34 +08:00
|
|
|
//animationController.animator.Play("Climb");
|
|
|
|
self.AnimancerComponent.Play(clip);
|
2023-08-27 02:58:19 +08:00
|
|
|
}
|
|
|
|
public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState)
|
|
|
|
{
|
2023-10-20 19:31:12 +08:00
|
|
|
if (newState is IPlayerClimbState or IPlayerLinkState { LinkArea: 4 })
|
2023-08-27 02:58:19 +08:00
|
|
|
{
|
2024-04-19 00:40:34 +08:00
|
|
|
self.TransitionState<Climb>();
|
2023-08-27 02:58:19 +08:00
|
|
|
}
|
|
|
|
else if(Enabled)
|
|
|
|
{
|
2023-11-30 00:23:23 +08:00
|
|
|
Exit();
|
2023-08-27 02:58:19 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-02-21 01:40:53 +08:00
|
|
|
[Serializable]
|
|
|
|
public class Vault : PlayerAnimateStates
|
|
|
|
{
|
|
|
|
[SerializeField] private AnimationClip vaultClip;
|
|
|
|
private AnimancerState state;
|
|
|
|
private IPlayerVaultState _vaultState;
|
|
|
|
public override void OnStateEntry(IState old)
|
|
|
|
{
|
|
|
|
base.OnStateEntry(old);
|
2024-04-19 00:40:34 +08:00
|
|
|
self.AnimancerComponent.Stop();
|
|
|
|
state =self.AnimancerComponent.Play(vaultClip);
|
2024-02-21 01:40:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnStateExit(IState old, IState newState)
|
|
|
|
{
|
|
|
|
state?.Stop();
|
|
|
|
base.OnStateExit(old, newState);
|
|
|
|
state = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnStateUpdate(float deltaTime)
|
|
|
|
{
|
|
|
|
base.OnStateUpdate(deltaTime);
|
|
|
|
if (_vaultState.Phase is 1)
|
|
|
|
_vaultState.NormalizedTime = state.NormalizedTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState)
|
|
|
|
{
|
|
|
|
if (newState is IPlayerVaultState _state)
|
|
|
|
{
|
|
|
|
_vaultState = _state;
|
2024-04-19 00:40:34 +08:00
|
|
|
self.TransitionState<Vault>();
|
2024-02-21 01:40:53 +08:00
|
|
|
}
|
|
|
|
else if(Enabled)
|
|
|
|
{
|
|
|
|
Exit();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
[Serializable]
|
2024-04-19 00:40:34 +08:00
|
|
|
public class Crawl:PlayerAnimateStates,IPlayerCrawlState
|
|
|
|
{
|
|
|
|
[SerializeField] private MixerTransition2D mixer;
|
|
|
|
[SerializeField] private AnimationClip entryClip;
|
|
|
|
[SerializeField] private AnimationClip clip;
|
|
|
|
[SerializeField] private AnimationClip exitClip;
|
|
|
|
private MixerState<Vector2> state;
|
|
|
|
private bool entry;
|
|
|
|
|
|
|
|
[Inject] private IEntityOverride _entityOverride;
|
|
|
|
[Inject] private IPlayerMovement _playerMovement;
|
|
|
|
public override async void OnStateEntry(IState old)
|
|
|
|
{
|
|
|
|
base.OnStateEntry(old);
|
|
|
|
entry = false;
|
|
|
|
await self.AnimancerComponent.Play(entryClip, 0.25f);
|
|
|
|
if (!Enabled) return;
|
|
|
|
entry = true;
|
|
|
|
}
|
|
|
|
public override async void OnStateExit(IState old, IState newState)
|
|
|
|
{
|
|
|
|
base.OnStateExit(old, newState);
|
|
|
|
state = null;
|
|
|
|
_entityOverride.AddOverride(this);
|
|
|
|
var x = self.AnimancerComponent.Layers[1].Play(exitClip);
|
|
|
|
await x;
|
|
|
|
_entityOverride.RemoveOverride(this);
|
|
|
|
x.Stop();
|
|
|
|
}
|
|
|
|
public override void OnStateUpdate(float deltaTime)
|
|
|
|
{
|
|
|
|
base.OnStateUpdate(deltaTime);
|
|
|
|
if (!entry) return;
|
|
|
|
if (self._movement.Velocity.magnitude >= 0.1f && ((Vector2)_playerMovement.InputVector).magnitude>0)
|
|
|
|
{
|
|
|
|
state = self.AnimancerComponent.Play(mixer,0.2f).As<MixerState<Vector2>>();
|
|
|
|
var velocity = self._movement.LocomotionBasedVelocity;
|
|
|
|
state.Parameter = new Vector2(velocity.x,velocity.z >=0 ? Mathf.Max( velocity.z,Mathf.Abs(velocity.x)) : velocity.z);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
self.AnimancerComponent.Play(clip,0.4f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState)
|
|
|
|
{
|
|
|
|
base.OnMovementStateChanged(oldState, newState);
|
|
|
|
if(newState is IPlayerCrawlState && self.CurrentState is not Crawl)
|
|
|
|
self.TransitionState<Crawl>();
|
|
|
|
else if(newState is not IPlayerCrawlState && Enabled)
|
|
|
|
Exit();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
[Serializable]
|
2024-02-21 01:40:53 +08:00
|
|
|
public class EdgeClimb : PlayerAnimateStates
|
|
|
|
{
|
|
|
|
[SerializeField] private AnimationClip edgeClimbClip;
|
2024-04-19 21:43:30 +08:00
|
|
|
[SerializeField] private AnimationClip idleClip;
|
2024-02-21 01:40:53 +08:00
|
|
|
[SerializeField] private AnimationClip climbUpClip;
|
2024-04-19 21:43:30 +08:00
|
|
|
[SerializeField] private LinearMixerTransition moveMixer;
|
|
|
|
[SerializeField] private AnimationClip leftClip;
|
|
|
|
[SerializeField] private AnimationClip rightClip;
|
2024-02-21 01:40:53 +08:00
|
|
|
private int _phase;
|
|
|
|
private AnimancerState state;
|
2024-04-19 21:43:30 +08:00
|
|
|
|
|
|
|
[Inject] private IPlayerMovement _playerMovement;
|
2024-02-21 01:40:53 +08:00
|
|
|
public override void OnStateEntry(IState old)
|
|
|
|
{
|
|
|
|
base.OnStateEntry(old);
|
|
|
|
_phase = -1;
|
|
|
|
}
|
|
|
|
public override void OnStateExit(IState old, IState newState)
|
|
|
|
{
|
|
|
|
base.OnStateExit(old, newState);
|
2024-04-19 21:43:30 +08:00
|
|
|
//state.Stop();
|
2024-02-21 01:40:53 +08:00
|
|
|
state = null;
|
|
|
|
}
|
2024-04-15 14:57:50 +08:00
|
|
|
public override async void OnStateUpdate(float deltaTime)
|
2024-02-21 01:40:53 +08:00
|
|
|
{
|
2024-04-19 00:40:34 +08:00
|
|
|
if(self._movement.CurrentState is not IPlayerEdgeClimbState edgeClimbState) return;
|
2024-04-19 21:43:30 +08:00
|
|
|
|
|
|
|
switch (edgeClimbState.Phase)
|
|
|
|
{
|
|
|
|
case 5:
|
|
|
|
if (_playerMovement.InputVector.x != 0)
|
|
|
|
{
|
|
|
|
var mixState =self.AnimancerComponent.Play(moveMixer,0.2f).As<MixerState<float>>();
|
|
|
|
mixState.Parameter = _playerMovement.InputVector.x;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
self.AnimancerComponent.Play(idleClip,0.2f);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2024-02-21 01:40:53 +08:00
|
|
|
|
|
|
|
if(_phase==edgeClimbState.Phase) return;
|
|
|
|
_phase = edgeClimbState.Phase;
|
|
|
|
switch (edgeClimbState.Phase)
|
|
|
|
{
|
2024-04-19 21:43:30 +08:00
|
|
|
case 0:
|
2024-02-21 01:40:53 +08:00
|
|
|
state?.Stop();
|
2024-04-19 21:43:30 +08:00
|
|
|
state = self.AnimancerComponent.Play(edgeClimbClip,0.2f);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
self.AnimancerComponent.Play(idleClip,0.2f);
|
2024-02-21 01:40:53 +08:00
|
|
|
break;
|
2024-04-19 21:43:30 +08:00
|
|
|
case 8:
|
2024-02-21 01:40:53 +08:00
|
|
|
state?.Stop();
|
2024-04-19 21:43:30 +08:00
|
|
|
state = self.AnimancerComponent.Play(climbUpClip,0.2f);
|
2024-04-15 14:57:50 +08:00
|
|
|
await state;
|
|
|
|
if (!Enabled) return;
|
|
|
|
edgeClimbState.ManualCancel();
|
2024-02-21 01:40:53 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState)
|
|
|
|
{
|
|
|
|
if (newState is IPlayerEdgeClimbState)
|
|
|
|
{
|
2024-04-19 00:40:34 +08:00
|
|
|
self.TransitionState<EdgeClimb>();
|
|
|
|
}
|
|
|
|
else if(Enabled)
|
|
|
|
{
|
|
|
|
Exit();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
[Serializable]
|
|
|
|
public sealed class Dodge: PlayerAnimateStates
|
|
|
|
{
|
|
|
|
[SerializeField] private MixerTransition2D mixer;
|
|
|
|
[Inject] private IPlayerMovement _playerMovement;
|
|
|
|
|
|
|
|
public override async void OnStateEntry(IState old)
|
|
|
|
{
|
|
|
|
base.OnStateEntry(old);
|
|
|
|
var state =self.AnimancerComponent.Play(mixer).As<MixerState<Vector2>>();
|
|
|
|
state.Parameter = _playerMovement.InputVector;
|
|
|
|
await state;
|
|
|
|
if (!Enabled) return;
|
|
|
|
if (self._movement.CurrentState is IPlayerDodgeState dodgeState)
|
|
|
|
{
|
|
|
|
dodgeState.ManualCancel();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState)
|
|
|
|
{
|
|
|
|
if (newState is IPlayerDodgeState)
|
|
|
|
{
|
|
|
|
self.TransitionState<Dodge>();
|
2024-02-21 01:40:53 +08:00
|
|
|
}
|
|
|
|
else if(Enabled)
|
|
|
|
{
|
|
|
|
Exit();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-08-27 02:58:19 +08:00
|
|
|
}
|