BITFALL/Assets/Artists/Scripts/Player/PlayerAnimationController/PlayerMotionBasedAnimationS...

238 lines
6.3 KiB
C#
Raw Normal View History

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
}