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); } } } } }