keyword + animation

This commit is contained in:
SoulliesOfficial
2025-10-27 07:04:34 -04:00
parent c3c4a17440
commit 2906206f0c
40 changed files with 512 additions and 384 deletions

View File

@@ -1,8 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Continentis.MainGame.Character;
using SLSFramework.General;
using UniRx;
using UnityEngine;
using UnityEngine.Events;
namespace Continentis.MainGame.Commands
{
@@ -14,6 +17,11 @@ namespace Continentis.MainGame.Commands
private float overrideDuration;
private string stateName;
private int layer;
//在动画的normalizedTime执行函数
private AnimationClip clip;
private float clipScaledLength => clip.length / animator.speed;
private Dictionary<float, Action> animationActions;
public Cmd_PlayAnimation(CombatCharacterViewBase characterView, string stateName,
bool waitForFinish = false, float overrideDuration = -1, int layer = 0) : base(null)
@@ -21,9 +29,36 @@ namespace Continentis.MainGame.Commands
this.characterView = characterView;
this.animator = characterView.animator;
this.stateName = stateName;
this.clip = characterView.animationClips[stateName];
this.waitForFinish = waitForFinish;
this.overrideDuration = overrideDuration;
this.layer = layer;
this.animationActions = new Dictionary<float, Action>();
}
public Cmd_PlayAnimation AddAction(float normalizedDuration, Action action)
{
animationActions[normalizedDuration] = action;
return this;
}
public Cmd_PlayAnimation AddAction(int frame, Action action)
{
float normalizedDuration = frame / (clip.frameRate * clip.length);
return AddAction(normalizedDuration, action);
}
public Cmd_PlayAnimation AddAction<T>(float normalizedDuration, string selfContextKey, Action<T> action)
{
T param = selfContext.GetInfo<T>(selfContextKey);
animationActions[normalizedDuration] = () => action(param);
return this;
}
public Cmd_PlayAnimation AddAction<T>(int frame, string selfContextKey, Action<T> action)
{
float normalizedDuration = frame / (clip.frameRate * clip.length);
return AddAction(normalizedDuration, selfContextKey, action);
}
protected override IObservable<Unit> OnExecute(CommandContext outerContext)
@@ -47,6 +82,24 @@ namespace Continentis.MainGame.Commands
}
animator.CrossFade(stateName, 0f, layer, 0f);
//监听动画进度以执行函数独立Observable
if (animationActions.Count > 0)
{
Observable.EveryUpdate().TakeUntil(Observable.Timer(TimeSpan.FromSeconds(clipScaledLength))).Subscribe(_ =>
{
float normalizedTime = animator.GetCurrentAnimatorStateInfo(layer).normalizedTime % 1f;
foreach (var kvp in animationActions.ToList())
{
if (normalizedTime >= kvp.Key)
{
kvp.Value?.Invoke();
animationActions.Remove(kvp.Key); //确保只执行一次
}
}
});
}
if (waitForFinish)
{
float animationDuration = overrideDuration >= 0 ? overrideDuration : characterView.animationClips[stateName].length;