Files
Cielonos/Assets/Scripts/MainGame/Characters/Player/PlayerAnimationSubcontroller.cs
SoulliesOfficial f7af60351b 阶段性完成
2025-12-08 05:27:53 -05:00

127 lines
5.6 KiB
C#

using System;
using System.Linq;
using Cielonos.UI;
using FIMSpace.FProceduralAnimation;
using RootMotion.FinalIK;
using SLSFramework.General;
using SLSUtilities.FunctionalAnimation;
using UnityEngine;
using UnityEngine.InputSystem;
namespace Cielonos.MainGame.Characters
{
public partial class PlayerAnimationSubcontroller : AnimationSubcontrollerBase, IPlayerSubcontroller
{
public Player player => owner as Player;
public AnimatorOverrideController animatorOverride;
public LegsAnimator legsAnimator;
public override void Initialize()
{
base.Initialize();
player.operationSc.OnDash += delegate { fullBodyFuncAnimSm.Play("Dash"); };
player.operationSc.OnDodge += delegate { fullBodyFuncAnimSm.Play("Dodge"); };
}
protected override void Update()
{
base.Update();
player.inputSc.preinputSubmodule.Update(isDuringPreinput, isAtActionDisruption);
}
protected override void LateUpdate()
{
base.LateUpdate();
}
public override void RegisterDefaultFunctions()
{
base.RegisterDefaultFunctions();
registeredFunctions.Add("DashStart", anim =>
{
player.landMovementSc.isDashing = true;
player.landMovementSc.dashMoveMultiplier = anim.funcAnimData.variableCollection.GetVariable<float>("DashMoveMultiplier");
PostProcessingManager.Instance.radialBlurSm.ModifyBlurRadius(0.2f);
player.audioSc.PlayDashSound();
player.feedbackSc["Dash"]?.Play();
//player.renderSc.dashTrails.ForEach(ds => ds.active = true);
//player.renderSc.dashTrails.ForEach(ds => ds.Restart());
DodgeSource defaultDodge = new DodgeSource(owner, null, "DefaultDodge", 0, "NormalDodge", "PerfectDodge", Mathf.Infinity, 0.2f);
defaultDodge.onPerfectDodge = () =>
{
PostProcessingManager.Instance.chromaticAberrationSm.SetIntensity(0.5f);
PostProcessingManager.Instance.radialBlurSm.ModifyBlurRadius(0.2f);
PostProcessingManager.Instance.tonemappingSm.SetContrast(1.35f);
PostProcessingManager.Instance.tonemappingSm.SetSaturate(-2f);
player.attributeSm["Energy"] += 25;
player.attributeSm["Energy"] = Mathf.Min(player.attributeSm["Energy"], player.attributeSm["MaximumEnergy"]);
PlayerCanvas.Instance.playerInfoUIArea.UpdateEnergy();
};
player.reactionSc.dodgeSm.ApplyDodge(defaultDodge);
});
registeredFunctions.Add("DashEnd", anim =>
{
player.landMovementSc.isDashing = false;
player.landMovementSc.dashMoveMultiplier = 1;
player.landMovementSc.isSprinting = true;
//player.renderSc.dashTrails.ForEach(ds => ds.active = false);
player.reactionSc.dodgeSm.RemoveDodge("DefaultDodge");
});
registeredFunctions.Add("DodgeStart", anim =>
{
player.landMovementSc.isDashing = true;
player.landMovementSc.dashMoveMultiplier = anim.funcAnimData.variableCollection.GetVariable<float>("DashMoveMultiplier");
PostProcessingManager.Instance.radialBlurSm.ModifyBlurRadius(-0.2f);
player.audioSc.PlayDashSound();
player.feedbackSc["Dodge"]?.Play();
//player.renderSc.dashTrails.ForEach(ds => ds.active = true);
//player.renderSc.dashTrails.ForEach(ds => ds.Restart());
DodgeSource defaultDodge = new DodgeSource(owner, null, "DefaultDodge", 0, "NormalDodge", "PerfectDodge", Mathf.Infinity, 0.2f);
defaultDodge.onPerfectDodge = () =>
{
PostProcessingManager.Instance.chromaticAberrationSm.SetIntensity(0.5f);
PostProcessingManager.Instance.radialBlurSm.ModifyBlurRadius(-0.2f);
PostProcessingManager.Instance.tonemappingSm.SetContrast(1.35f);
PostProcessingManager.Instance.tonemappingSm.SetSaturate(-2.2f);
player.attributeSm["Energy"] += 25;
player.attributeSm["Energy"] = Mathf.Min(player.attributeSm["Energy"], player.attributeSm["MaximumEnergy"]);
PlayerCanvas.Instance.playerInfoUIArea.UpdateEnergy();
};
player.reactionSc.dodgeSm.ApplyDodge(defaultDodge);
});
registeredFunctions.Add("DodgeEnd", anim =>
{
player.landMovementSc.isDashing = false;
player.landMovementSc.dashMoveMultiplier = 1;
//player.renderSc.dashTrails.ForEach(ds => ds.active = false);
player.reactionSc.dodgeSm.RemoveDodge("DefaultDodge");
});
}
}
public partial class PlayerAnimationSubcontroller
{
public bool isDuringPreinput;
public bool isAtActionDisruption;
protected override void UpdateIntervalInfo()
{
base.UpdateIntervalInfo();
isDuringPreinput = currentIntervals.Any(interval => interval.intervalType == IntervalType.Preinput);
isAtActionDisruption = lastFrameIntervals.SwitchOut(currentIntervals, (interval) => interval.intervalType == IntervalType.Preinput);
}
}
}