93 lines
2.9 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|