Files
Main/Assets/Code/Logic/_Required/Entity/Character/Utils/CharacherShaker.cs
2025-01-25 04:38:09 +08:00

93 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
namespace Thousandto.Code.Logic
{
//角色振动器,用于怪物在被攻击时的震动效果
public class CharacherShaker
{
private Character _owner = null;
private float _timeCounter = 0f;
private bool _isEnable = false;
private Vector3 _shakeDir = Vector3.zero;
private float _shakePower = 1f;
private float _shakeTime = 1f;
private static AnimationCurve _shakeCurve = null;
private static float _shakeCurveTime = 0f;
public CharacherShaker(Character owner)
{
_owner = owner;
_isEnable = false;
}
public void StartShake(Vector3 dir, float power, float time)
{
if (dir == Vector3.zero || power <= 0f || time <= 0f)
return;
if (_owner.Skin == null)
return;
if (_isEnable)
return;
_isEnable = true;
_timeCounter = 0f;
_shakeDir = dir.normalized;
_shakePower = power;
_shakeTime = time;
if (_shakeCurve == null)
{
_shakeCurve = new AnimationCurve();
_shakeCurve.AddKey(0f, 0f);
_shakeCurve.AddKey(0.065f, 0.0903f);
_shakeCurve.AddKey(0.134f, -0.0766f);
_shakeCurve.AddKey(0.233f, 0.1558f);
_shakeCurve.AddKey(0.305f, -0.1215f);
_shakeCurve.AddKey(0.414f, 0.1836f);
_shakeCurve.AddKey(0.517f, -0.1477f);
_shakeCurve.AddKey(0.603f, 0.1489f);
_shakeCurve.AddKey(0.703f, -0.1002f);
_shakeCurve.AddKey(0.703f, -0.1002f);
_shakeCurve.AddKey(0.798f, 0.1140f);
_shakeCurve.AddKey(0.84f, -0.0601f);
_shakeCurve.AddKey(0.923f, 0.0699f);
_shakeCurve.AddKey(1f, 0f);
_shakeCurveTime = 1f;
}
}
public void Update(float dt)
{
if (_isEnable)
{
if (_owner.Skin == null || _shakeCurve == null)
return;
var body = _owner.Skin.GetSkinPart(Core.Asset.FSkinPartCode.Body);
if(body == null)
{
return;
}
_timeCounter += dt;
if (_timeCounter > _shakeTime)
{
_isEnable = false;
body.SetLocalPosition(Vector3.zero);
}
else
{
float i = Mathf.Clamp(_timeCounter / _shakeTime, 0f, 1f) * _shakeCurveTime;
float value = _shakeCurve.Evaluate(i) * _shakePower;
body.SetLocalPosition(_shakeDir * value);
}
}
}
}
}