NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/Anim/CharacterAnim.cs

307 lines
10 KiB
C#
Raw Normal View History

2023-10-19 15:00:19 +08:00
using System;
using Cysharp.Threading.Tasks;
2023-08-22 19:08:45 +08:00
using System.Collections.Generic;
2023-10-19 15:00:19 +08:00
using PhxhSDK;
2023-08-22 19:08:45 +08:00
using UnityEngine;
2023-10-19 15:00:19 +08:00
using Constants = Framework.Constants;
2024-04-11 17:45:07 +08:00
using Object = UnityEngine.Object;
2023-08-22 19:08:45 +08:00
namespace Gameplay.Character
{
public class CharacterAnim
{
2023-10-19 15:00:19 +08:00
public readonly Character owner;
2023-08-22 19:08:45 +08:00
public string targetDownAnim
{
get;
set;
}
2023-08-22 19:08:45 +08:00
public string targetFullAnim
{
get;
set;
}
2023-08-22 19:08:45 +08:00
public bool noFade = false;
public string currentDownAnim { get; private set; }
public string currentFullAnim { get; private set; }
2023-10-19 15:00:19 +08:00
public readonly Animator rawAnim;
2023-08-22 19:08:45 +08:00
private Dictionary<int, LTAnimLayerInfo> _layerDict;
private float _splitScaleNormalShoot = 1;
public float splitScaleNormalShoot
{
get
{
return _splitScaleNormalShoot;
}
set
{
2023-10-19 15:00:19 +08:00
if (Math.Abs(_splitScaleNormalShoot - value) < 0.01f) return;
2023-08-22 19:08:45 +08:00
_splitScaleNormalShoot = value;
2024-04-11 17:45:07 +08:00
rawAnim.SetFloat(EAnimParamConst.AttackScaleNormal, _splitScaleNormalShoot);
2024-04-11 18:14:10 +08:00
if (owner.weapon != null && owner.weapon.weaponAnim.rawAnim != null)
{
owner.weapon.weaponAnim.rawAnim.SetFloat(EAnimParamConst.AttackScaleNormal, _splitScaleNormalShoot);
}
2023-08-22 19:08:45 +08:00
}
}
private float _splitScaleNormalReload = 1;
public float splitScaleNormalReload
{
get
{
return _splitScaleNormalReload;
}
set
{
2023-10-19 15:00:19 +08:00
if (Math.Abs(_splitScaleNormalReload - value) < 0.01f) return;
2023-08-22 19:08:45 +08:00
_splitScaleNormalReload = value;
2024-04-11 17:45:07 +08:00
rawAnim.SetFloat(EAnimParamConst.ReloadScaleNormal, _splitScaleNormalReload);
2024-04-11 18:14:10 +08:00
if (owner.weapon != null && owner.weapon.weaponAnim.rawAnim != null)
{
owner.weapon.weaponAnim.rawAnim.SetFloat(EAnimParamConst.ReloadScaleNormal, _splitScaleNormalReload);
}
2023-08-22 19:08:45 +08:00
}
}
private float _splitScaleNormalMove = 1;
public float splitScaleNormalMove
{
get
{
return _splitScaleNormalMove;
}
set
{
2023-10-19 15:00:19 +08:00
if (Math.Abs(_splitScaleNormalMove - value) < 0.01f) return;
2023-08-22 19:08:45 +08:00
_splitScaleNormalMove = value;
2024-04-11 17:45:07 +08:00
rawAnim.SetFloat(EAnimParamConst.MoveScaleNormal, _splitScaleNormalMove);
2023-08-22 19:08:45 +08:00
}
}
private float _splitScaleLowMove = 1;
public float splitScaleLowMove
{
get
{
return _splitScaleLowMove;
}
set
{
2023-10-19 15:00:19 +08:00
if (Math.Abs(_splitScaleLowMove - value) < 0.01f) return;
2023-08-22 19:08:45 +08:00
_splitScaleLowMove = value;
2024-04-11 17:45:07 +08:00
rawAnim.SetFloat(EAnimParamConst.MoveScaleLow, _splitScaleLowMove);
2023-08-22 19:08:45 +08:00
}
}
2024-11-08 14:46:04 +08:00
private float _splitScaleRaiseWeapon = 1;
public float splitScaleRaiseWeapon
{
get
{
return _splitScaleRaiseWeapon;
}
set
{
if (Math.Abs(_splitScaleRaiseWeapon - value) < 0.01f) return;
_splitScaleRaiseWeapon = value;
rawAnim.SetFloat(EAnimParamConst.RaiseWeaponScale, _splitScaleRaiseWeapon);
}
}
2023-08-22 19:08:45 +08:00
public float NORMAL_MOVESPEED = 3f;
public float LOW_MOVESPEED = 0.6f;
public CharacterAnim(Character owner)
{
this.owner = owner;
rawAnim = owner.RawAnimator;
}
2024-04-11 17:45:07 +08:00
public void ResetFloats()
{
rawAnim.SetFloat(EAnimParamConst.AttackScaleNormal, _splitScaleNormalShoot);
rawAnim.SetFloat(EAnimParamConst.ReloadScaleNormal, _splitScaleNormalReload);
rawAnim.SetFloat(EAnimParamConst.MoveScaleNormal, _splitScaleNormalMove);
rawAnim.SetFloat(EAnimParamConst.MoveScaleLow, _splitScaleLowMove);
2024-11-08 14:46:04 +08:00
rawAnim.SetFloat(EAnimParamConst.RaiseWeaponScale, _splitScaleRaiseWeapon);
2024-04-11 18:14:10 +08:00
if (owner.weapon.weaponAnim != null && owner.weapon.weaponAnim.rawAnim != null)
2024-04-11 18:14:10 +08:00
{
owner.weapon.weaponAnim.rawAnim.SetFloat(EAnimParamConst.AttackScaleNormal, _splitScaleNormalShoot);
owner.weapon.weaponAnim.rawAnim.SetFloat(EAnimParamConst.ReloadScaleNormal, _splitScaleNormalReload);
}
2024-04-11 17:45:07 +08:00
}
2023-08-22 19:08:45 +08:00
public async UniTask Init()
{
await _InitAnimInfo();
ResetAnim();
}
private async UniTask _InitAnimInfo()
{
_layerDict = new Dictionary<int, LTAnimLayerInfo>();
var fileName = owner.runtimeData.configData.nameId;
2023-08-22 19:08:45 +08:00
var animInfoPath = string.Format(Constants.ANIMATOR_CONFIG_FORMAT_PATH, fileName);
2023-10-19 15:00:19 +08:00
var loadAsset = await AssetManager.Instance.LoadAssetAsync<TextAsset>(animInfoPath);
2023-08-22 19:08:45 +08:00
if (loadAsset == null)
{
2023-10-19 15:00:19 +08:00
DebugUtil.LogError("[AnimatorInfoExporter] Load animator info failed: {0}", animInfoPath);
2023-08-22 19:08:45 +08:00
return;
}
var json = loadAsset.text;
var result = JsonUtility.FromJson<SaveAnimatorData>(json);
// 立即释放资源
AssetManager.Instance.Unload(animInfoPath);
2023-08-22 19:08:45 +08:00
var layers = result.layers;
// 遍历每个 Layer获取其中的所有动画状态信息
for (var i = 0; i < layers.Count; ++i)
{
var layer = layers[i];
GetAllStates(layer, i);
}
}
/// <summary>
/// 该方法需要在动画速度发生改变时进行调用
/// </summary>
public void ResetAnim()
{
2023-10-19 15:00:19 +08:00
ResetReloadAnim();
ResetShootAnim();
2024-11-25 15:01:30 +08:00
// ResetRaiseWeaponAnim();
ResetAttackEndAnim();
}
public void ResetAttackEndAnim()
{
var attackEndAnimLength = GetStateLength(EAnimFullState.S_ATTACK_END, EAnimStateIndex.Full);
var attackEndAnimTime = owner.fightData.attackEndTime;
var splitScaleAttackEnd = attackEndAnimLength / attackEndAnimTime;
rawAnim.SetFloat(EAnimParamConst.AttackEndScale, splitScaleAttackEnd);
2024-11-08 14:46:04 +08:00
}
public void ResetRaiseWeaponAnim()
{
var raiseTime = owner.runtimeData.fightData.raiseWeaponTime;
if (raiseTime <= 0)
{
DebugUtil.LogError("配置的 raiseWeaponTime 为 0, 请检查配置");
return;
}
2024-11-08 14:46:04 +08:00
var raiseAnimLength = GetStateLength(EAnimFullState.S_RAISE, EAnimStateIndex.Full);
splitScaleRaiseWeapon = raiseAnimLength / raiseTime;
2023-10-19 15:00:19 +08:00
}
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
public void ResetReloadAnim()
{
2023-08-22 19:08:45 +08:00
// reload时间
var reloadTime = owner.fightData.reloadTime;
if (reloadTime <= 0)
{
DebugUtil.LogError("配置的 reloadTime 为 0, 请检查配置");
return;
}
var reloadAnimLength = GetStateLength(EAnimFullState.S_RELOAD, EAnimStateIndex.Full);
2023-08-22 19:08:45 +08:00
splitScaleNormalReload = reloadAnimLength / reloadTime;
2023-10-19 15:00:19 +08:00
}
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
public void ResetShootAnim()
{
2023-08-22 19:08:45 +08:00
// 开枪时间
var shootTime = owner.fightData.shootCd;
if (shootTime <= 0)
{
DebugUtil.LogError("配置的 shootCd 为 0, 请检查配置");
return;
}
var shootAnimLength = GetStateLength(EAnimFullState.S_ATTACK, EAnimStateIndex.Full);
2023-08-22 19:08:45 +08:00
splitScaleNormalShoot = shootAnimLength / shootTime;
}
2024-04-11 17:45:07 +08:00
private void GetAllStates(SaveLayerData stateMachine,
int layerIndex)
2023-08-22 19:08:45 +08:00
{
// 获取 stateMachine 中的所有动画状态信息
var states = stateMachine.states;
var newLayer = new LTAnimLayerInfo(layerIndex);
_layerDict.Add(layerIndex, newLayer);
// 遍历每个动画状态信息并处理
foreach (var state in states)
{
var newStateInfo = new LTAnimStateInfo();
newStateInfo.stateName = state.stateName;
newStateInfo.clipName = state.clipName;
newStateInfo.clipLength = state.clipLength;
newLayer.stateMap.Add(state.stateName, newStateInfo);
}
}
public void ViewUpdate(float dt)
{
if (currentFullAnim != targetFullAnim)
{
if (currentFullAnim == null || noFade)
{
rawAnim.Play(targetFullAnim, EAnimStateIndex.Full, 0);
}
else
{
rawAnim.CrossFade(targetFullAnim, 0.1f, EAnimStateIndex.Full, 0);
}
currentFullAnim = targetFullAnim;
}
if (currentDownAnim != targetDownAnim)
{
// TODO: 下半身融合看着比较奇怪,暂时不用
2023-11-13 18:13:52 +08:00
if (currentDownAnim == null || noFade)
2023-08-22 19:08:45 +08:00
{
rawAnim.Play(targetDownAnim, EAnimStateIndex.Down, 0);
}
else
{
2023-11-13 18:13:52 +08:00
rawAnim.CrossFade(targetDownAnim, 0.05f, EAnimStateIndex.Down, 0);
2023-08-22 19:08:45 +08:00
}
currentDownAnim = targetDownAnim;
}
}
2024-04-11 17:45:07 +08:00
public float GetStateLength(string stateName,
int layerIndex)
2023-08-22 19:08:45 +08:00
{
var layer = _layerDict[layerIndex];
var stateInfo = layer.stateMap[stateName];
return stateInfo.clipLength;
}
//public void SetStateSpeed(string stateName, int layerIndex, float speed)
//{
// var layer = _layerDict[layerIndex];
// var stateInfo = layer.stateMap[stateName];
// stateInfo.rawState.speed = speed;
//}
}
}