115 lines
4.3 KiB
C#
115 lines
4.3 KiB
C#
using SLSUtilities.General;
|
|
using UnityEngine;
|
|
|
|
namespace Cielonos.MainGame
|
|
{
|
|
public partial class TransformSubmodule : AttackAreaSubmoduleBase
|
|
{
|
|
public Transform targetTransform;
|
|
public float delay;
|
|
public float timer;
|
|
|
|
public bool isRelativePosition;
|
|
public bool applyPosition;
|
|
public float positionMoveDuration;
|
|
public EaseType positionEaseType;
|
|
public Vector3 startPosition;
|
|
public Vector3 endPosition;
|
|
private AnimationCurve positionCurve;
|
|
|
|
public bool applyRotation;
|
|
public float rotationMoveDuration;
|
|
public EaseType rotationEaseType;
|
|
public Vector3 startEulerAngles;
|
|
public Vector3 endEulerAngles;
|
|
private AnimationCurve rotationCurve;
|
|
|
|
public bool applyScale;
|
|
public float scaleMoveDuration;
|
|
public EaseType scaleEaseType;
|
|
public Vector3 startScale;
|
|
public Vector3 endScale;
|
|
private AnimationCurve scaleCurve;
|
|
|
|
public TransformSubmodule(AttackAreaBase attackArea, Transform targetTransform = null, float delay = 0f) : base(attackArea)
|
|
{
|
|
this.targetTransform = targetTransform ?? attackArea.topParent.transform;
|
|
this.delay = delay;
|
|
}
|
|
|
|
public AttackAreaBase ApplyPositionMove(bool isRelative, Vector3 startPosition, Vector3 endPosition, float duration, EaseType easeType = EaseType.Linear)
|
|
{
|
|
this.applyPosition = true;
|
|
this.startPosition = isRelative ? targetTransform.localPosition + startPosition : startPosition;
|
|
this.endPosition = isRelative ? targetTransform.localPosition + endPosition : endPosition;
|
|
this.positionMoveDuration = duration;
|
|
this.positionEaseType = easeType;
|
|
this.positionCurve = Ease.GetCurve(easeType);
|
|
return attackArea;
|
|
}
|
|
|
|
public AttackAreaBase ApplyRotationMove(Vector3 startEulerAngles, Vector3 endEulerAngles, float duration, EaseType easeType = EaseType.Linear)
|
|
{
|
|
this.applyRotation = true;
|
|
this.startEulerAngles = startEulerAngles;
|
|
this.endEulerAngles = endEulerAngles;
|
|
this.rotationMoveDuration = duration;
|
|
this.rotationEaseType = easeType;
|
|
this.rotationCurve = Ease.GetCurve(easeType);
|
|
return attackArea;
|
|
}
|
|
|
|
public AttackAreaBase ApplyScaleMove(Vector3 startScale, Vector3 endScale, float duration, EaseType easeType = EaseType.Linear)
|
|
{
|
|
this.applyScale = true;
|
|
this.startScale = startScale;
|
|
this.endScale = endScale;
|
|
this.scaleMoveDuration = duration;
|
|
this.scaleEaseType = easeType;
|
|
this.scaleCurve = Ease.GetCurve(easeType);
|
|
return attackArea;
|
|
}
|
|
}
|
|
|
|
public partial class TransformSubmodule
|
|
{
|
|
public virtual void Update()
|
|
{
|
|
if(timer > Mathf.Max(positionMoveDuration, rotationMoveDuration, scaleMoveDuration))
|
|
{
|
|
return;
|
|
}
|
|
|
|
float deltaTime = attackArea.creator != null ? attackArea.creator.selfTimeSm.DeltaTime : Time.deltaTime;
|
|
if (delay > 0f)
|
|
{
|
|
delay -= deltaTime;
|
|
return;
|
|
}
|
|
|
|
timer += deltaTime;
|
|
|
|
if (applyPosition)
|
|
{
|
|
float t = Mathf.Clamp01(timer / positionMoveDuration);
|
|
t = positionCurve.Evaluate(t);
|
|
attackArea.topParent.transform.localPosition = Vector3.LerpUnclamped(startPosition, endPosition, t);
|
|
}
|
|
|
|
if (applyRotation)
|
|
{
|
|
float t = Mathf.Clamp01(timer / rotationMoveDuration);
|
|
t = rotationCurve.Evaluate(t);
|
|
Vector3 currentEulerAngles = Vector3.LerpUnclamped(startEulerAngles, endEulerAngles, t);
|
|
attackArea.topParent.transform.localRotation = Quaternion.Euler(currentEulerAngles);
|
|
}
|
|
|
|
if (applyScale)
|
|
{
|
|
float t = Mathf.Clamp01(timer / scaleMoveDuration);
|
|
t = scaleCurve.Evaluate(t);
|
|
attackArea.topParent.transform.localScale = Vector3.LerpUnclamped(startScale, endScale, t);
|
|
}
|
|
}
|
|
}
|
|
} |