Untitled

mail@pastecode.io avatarunknown
plain_text
2 months ago
4.1 kB
2
Indexable
Never
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using EasyButtons;
using UnityEngine;

[ExecuteInEditMode]
public class TestAnima : MonoBehaviour
{
    [SerializeField] private AnimationCurve rotateXCurve;
    [SerializeField] private AnimationCurve rotateZCurve;

    [SerializeField]
    private Transform Attacker_pos;
    [SerializeField]
    private Transform Target_pos;
    
    public void AnimateAttack(bool isEnemy = false)
    {
        Vector3 direction = isEnemy
            ? Attacker_pos.position - Target_pos.position
            : Target_pos.position - Attacker_pos.position;
        Vector3 localDirectionToTarget = Attacker_pos.InverseTransformDirection(direction.normalized);

        Quaternion targetRotation = Quaternion.LookRotation(Vector3.forward, localDirectionToTarget);

        Vector3 originalRotation = Attacker_pos.rotation.eulerAngles;
        var targetXRotation = isEnemy ? -25f : 25;
        var targetZRotation = targetRotation.eulerAngles.z;

        // X tween
        Tween rotationXTween1 = DOTween.To(() => Attacker_pos.rotation.eulerAngles.x, UpdateRotateX, targetXRotation, 0.25f).SetEase(rotateXCurve).Pause();
        Tween rotationXTween2 = DOTween.To(() => Attacker_pos.rotation.eulerAngles.x, UpdateRotateX, 0, 0.025f).Pause();
        Tween rotationXTween3 = DOTween.To(() => Attacker_pos.rotation.eulerAngles.x, UpdateRotateX, targetXRotation * -1, 0.025f).Pause();
        Tween rotationXTween4 = DOTween.To(() => Attacker_pos.rotation.eulerAngles.x, UpdateRotateX, 0, 0.1f).Pause();
        
        Sequence rotationXSequence = DOTween.Sequence();
        rotationXSequence.AppendInterval(0.1f);
        rotationXSequence.Append(rotationXTween1);
        rotationXSequence.Append(rotationXTween2);
        rotationXSequence.Append(rotationXTween3);
        rotationXSequence.Append(rotationXTween4);
        rotationXSequence.Pause();
        
        // Y tween
        Tween rotationYTween1 = DOTween.To(() => Attacker_pos.rotation.eulerAngles.x, UpdateRotateY, -12, 0.1f).SetEase(rotateXCurve).Pause();
        Tween rotationYTween2 = DOTween.To(() => Attacker_pos.rotation.eulerAngles.x, UpdateRotateY, 0, 0.025f).Pause();

        Sequence rotationYSequence = DOTween.Sequence();
        rotationYSequence.AppendInterval(0.15f);
        rotationYSequence.Append(rotationYTween1);
        rotationYSequence.Append(rotationYTween2);
        rotationXSequence.Pause();
        
        // Z tween
        Tween rotationZTween1 = DOTween.To(() => Attacker_pos.rotation.eulerAngles.z, UpdateRotateZ, targetZRotation, 0.1f).SetEase(rotateZCurve).Pause();
        Tween rotationZTween2 = DOTween.To(() => Attacker_pos.rotation.eulerAngles.z, UpdateRotateZ, 0, 0.05f).SetEase(rotateZCurve).Pause();
        
        Sequence rotationZSequence = DOTween.Sequence();
        rotationZSequence.AppendInterval(0.05f);
        rotationZSequence.Append(rotationZTween1);
        rotationZSequence.AppendInterval(0.1f);
        rotationZSequence.Append(rotationZTween2);
        rotationZSequence.Pause();

        Sequence parallelSequence = DOTween.Sequence();
        parallelSequence.Append(rotationXSequence);
        parallelSequence.Join(rotationYSequence);
        parallelSequence.Join(rotationZSequence);
        parallelSequence.Play();
    }

    private void UpdateRotateX(float value)
    {
        Vector3 rotation = Attacker_pos.rotation.eulerAngles;
        rotation.x = value;
        Attacker_pos.rotation = Quaternion.Euler(rotation);
    }
    
    private void UpdateRotateY(float value)
    {
        Vector3 rotation = Attacker_pos.rotation.eulerAngles;
        rotation.y = value;
        Attacker_pos.rotation = Quaternion.Euler(rotation);
    }
    
    private void UpdateRotateZ(float value)
    {
        Vector3 rotation = Attacker_pos.rotation.eulerAngles;
        rotation.z = value;
        Attacker_pos.rotation = Quaternion.Euler(rotation);
    }

    [Button]
    public void Test()
    {
        AnimateAttack(false);
    }

}