keyword + animation
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user