using Spine.Unity;
using Spine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Base.Common;
using UnityEditor.SceneManagement;

public enum TargetType
{
    None = 0,
    Demonic = 1,
    Tower = 2,
    Player = 3,
    Enemy = 4,
    EnemyTower = 5,
}

public enum SearchState
{
    NoTarget = 0,//搜索范围内没有目标
    InSearchScope = 1,//在搜索范围内发现目标，但不在攻击范围内
    InAttackScope = 2,//目标在攻击范围内
}

public class Enemy : MoveCharacter
{
    public int id;
    public float jumpSpeed = 10;
    public SearchState searchState;
    public float attackDistance;
    public float maxAttackDis, minAttackDis;
    public bool needToChange;
    public bool canFly = false;
    public float flyHeight;
    public float flyUpSpeed = 10;
    public int sortingOrder = 0;

    public float attackRatio;
    public float maxMoveSpeed, minMoveSpeed;
    public float runSpeed;
    public int dropSoul = 1;
    public GameObject soulPrefab;
    public float soulStartSpeed = 5f;
    public float dropSoulAngle = 60f;

    [HideInInspector]
    public bool noOnSearchState;
    [HideInInspector]
    public bool isFindingPlayer;
    [HideInInspector]
    public bool isFindPlayer;
    public float hateDistance;
    [HideInInspector]
    public float distance;
    [HideInInspector]
    public Vector3 rushEndPos;
    public GameObject aimEffect;
    public float aimDistance;
    public float rushTime;
    public float rushSpeed;
    [HideInInspector]
    public float time;
    public float readyCD;
    public DashEffect dashEffect;
    [HideInInspector]
    public Vector3 targetDir;
    public bool haveDownRush;   //冲刺结束后是否可以接落地斩
    public bool rushHaveAttack; //冲刺是否带伤害
    public float downRushTime;
    public float finishRushTime;
    public bool isBack = false; //往反方向走

    private void Awake()
    {
        aimDistance = rushTime * rushSpeed / 2;
    }

    private void Start()
    {
        if (needToChange)
        {
            attackDistance = Random.Range(minAttackDis, maxAttackDis);
        }
    }

    public void OnDisable()
    {
        EnemyCreater.instance.OnEnemyRecycle(this);
    }

    public override void Init()
    {
        base.Init();
        moveSpeed = Random.Range(minMoveSpeed, maxMoveSpeed);
        ChangeSearchState(SearchState.NoTarget);
    }

    public override void FixedUpdate()
    {
        if (!noOnSearchState)
        {
            OnSearchState();

        }
        OnState();



    }

    public override Vector3 GetMoveDir()
    {
        Vector3 moveDir = Vector3.zero;
        if (canMove)
        {
            switch (searchState)
            {
                case SearchState.NoTarget:
                    moveDir = Vector3.right;
                    break;
                case SearchState.InSearchScope:
                    if (targetCharacter)
                    {
                        if (targetCharacter.transform.position.x - transform.position.x < 0)
                        {
                            moveDir = Vector3.left;
                        }
                        else
                        {
                            moveDir = Vector3.right;
                        }
                    }
                    else
                    {
                        moveDir = Vector3.zero;
                    }
                    break;
                case SearchState.InAttackScope:
                    if (targetCharacter)
                    {
                        if (targetCharacter.transform.position.x - transform.position.x < 0)
                        {
                            moveDir = Vector3.left;
                        }
                        else
                        {
                            moveDir = Vector3.right;
                        }
                    }
                    else
                    {
                        moveDir = Vector3.zero;
                    }
                    break;
                default:
                    break;
            }
        }
        if (!isBack)
        {
            return moveDir;
        }
        return -moveDir;
    }

    public bool GetAttack()
    {
        if (searchState == SearchState.InAttackScope)
        {
            return true;
        }
        return false;
    }

    public bool GetJump()
    {
        return false;
    }

    public void AdjustHeight()
    {
        if (canFly)
        {
            if (transform.position.y - flyHeight > 0.1f)
            {
                Vector3 pos = transform.position;
                pos.y -= flyUpSpeed * Time.deltaTime;
                transform.position = pos;
            }
            else if (transform.position.y - flyHeight < -0.1f)
            {
                Vector3 pos = transform.position;
                pos.y += flyUpSpeed * Time.deltaTime;
                transform.position = pos;
            }
        }
    }

    public override void OnState()
    {
        base.OnState();
        hurtKeepTime -= Time.deltaTime;
        attackTime -= Time.deltaTime;
        dieKeepTime -= Time.deltaTime;
        invincibleTime -= Time.deltaTime;
        weakTime -= Time.deltaTime;
        Vector3 leftDir = GetMoveDir();
        bool isAttack = GetAttack();

        switch (state)
        {
            case CharacterState.Idle:
                if (isAttack)
                {
                    Attack2();
                    break;
                }
                if (!foot.TrigGround && !canFly)
                {
                    if (rb.velocity.y > 0)
                    {
                        ChangeState(CharacterState.Rise);
                        break;
                    }
                    else
                    {
                        ChangeState(CharacterState.Fall);
                        break;
                    }
                }
                if (leftDir.x > 0.3f || leftDir.x < -0.3f)
                {
                    ChangeState(CharacterState.Run);
                    break;
                }
                //rb.velocity = Vector3.zero;
                AdjustHeight();
                break;
            case CharacterState.Run:
                if (isAttack)
                {
                    Attack2();
                    break;
                }
                if (!foot.TrigGround && !canFly)
                {
                    if (rb.velocity.y > 0)
                    {
                        ChangeState(CharacterState.Rise);
                        break;
                    }
                    else
                    {
                        ChangeState(CharacterState.Fall);
                        break;
                    }
                }
                if (leftDir.x < 0.3f && leftDir.x > -0.3f)
                {
                    ChangeState(CharacterState.Idle);
                    break;
                }
                if (leftDir.x > 0.3f)
                {
                    //rb.velocity += Vector3.right * moveAcc * Time.deltaTime;
                    rb.velocity = Vector3.right * moveSpeed;
                    //if (rb.velocity.x > maxMoveSpeed)
                    //{
                    //    rb.velocity = new Vector3(maxMoveSpeed, rb.velocity.y, rb.velocity.z);
                    //}
                    if (bodyTrans.localScale.x > 0)
                    {
                        Turn();
                    }
                }
                else if (leftDir.x < -0.3f)
                {
                    //rb.velocity -= Vector3.right * moveAcc * Time.deltaTime;
                    rb.velocity = Vector3.left * moveSpeed;
                    //if (rb.velocity.x < -maxMoveSpeed)
                    //{
                    //    rb.velocity = new Vector3(-maxMoveSpeed, rb.velocity.y, rb.velocity.z);
                    //}
                    if (bodyTrans.localScale.x < 0)
                    {
                        Turn();
                    }
                }
                AdjustHeight();
                break;
            case CharacterState.Rush:
                if (isAttack)
                {
                    Attack2();
                    break;
                }
                if (!foot.TrigGround && !canFly)
                {
                    if (rb.velocity.y > 0)
                    {
                        ChangeState(CharacterState.Rise);
                        break;
                    }
                    else
                    {
                        ChangeState(CharacterState.Fall);
                        break;
                    }
                }
                if (leftDir.x < 0.3f && leftDir.x > -0.3f)
                {
                    ChangeState(CharacterState.Idle);
                    break;
                }
                if (leftDir.x > 0.3f)
                {
                    //rb.velocity += Vector3.right * moveAcc * Time.deltaTime;
                    rb.velocity = Vector3.right * runSpeed;
                    //if (rb.velocity.x > maxMoveSpeed)
                    //{
                    //    rb.velocity = new Vector3(maxMoveSpeed, rb.velocity.y, rb.velocity.z);
                    //}
                    if (bodyTrans.localScale.x > 0)
                    {
                        Turn();
                    }
                }
                else if (leftDir.x < -0.3f)
                {
                    //rb.velocity -= Vector3.right * moveAcc * Time.deltaTime;
                    rb.velocity = Vector3.left * runSpeed;
                    //if (rb.velocity.x < -maxMoveSpeed)
                    //{
                    //    rb.velocity = new Vector3(-maxMoveSpeed, rb.velocity.y, rb.velocity.z);
                    //}
                    if (bodyTrans.localScale.x < 0)
                    {
                        Turn();
                    }
                }
                AdjustHeight();
                break;
            case CharacterState.Rise:
                if (rb.velocity.y <= 0)
                {
                    ChangeState(CharacterState.Fall);
                    break;
                }
                //if (btnJumpPress || cacheJumpTime > 0)
                //{
                //    if (!airJumped && rb.velocity.y < airJumpSpeed)
                //    {
                //        airJumped = true;
                //        AirJump();
                //        break;
                //    }
                //}

                rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
                break;
            case CharacterState.Fall:
                if (foot.TrigGround || canFly)
                {
                    if (isFindingPlayer)
                    {
                        ChangeState(CharacterState.FindPlayer);
                    }
                    else
                    {
                        ChangeState(CharacterState.Idle);
                    }

                    break;
                }
                //if (foot.canStepPlayers.Count > 0)
                //{
                //    Jump(jumpSpeed / 2);
                //    StepOther();
                //    break;
                //}
                //if (foot.canStepEnemyList.Count > 0)
                //{
                //    Jump(jumpSpeed / 2);
                //    StepEnemy();
                //    break;
                //}
                //if (btnJumpPress || cacheJumpTime > 0)
                //{
                //    if (!airJumped)
                //    {
                //        airJumped = true;
                //        AirJump();
                //        break;
                //    }
                //    else if (canJumpTick >= runner.Tick)
                //    {
                //        Jump();
                //        break;
                //    }
                //}
                rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
                break;
            case CharacterState.Hurt:
                if (hurtKeepTime <= 0 && rb.velocity.magnitude < hurtChangeVelocity)
                {
                    ChangeState(CharacterState.Idle);
                    break;
                }
                if (!foot.TrigGround && !canFly)
                {
                    rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
                }
                Vector3 vel = rb.velocity;
                vel.x = vel.x * (1 - decelerationRatio * Time.deltaTime);
                rb.velocity = vel;
                break;
            case CharacterState.Attack:
                if (attackTime <= 0)
                {
                    ChangeState(CharacterState.Idle);
                    break;
                }
                break;
            case CharacterState.Die:
                if (dieKeepTime <= 0)
                {
                    gameObject.SetActive(false);
                    break;
                }
                break;
            case CharacterState.Weak:
                if (weakTime <= 0)
                {
                    ChangeState(CharacterState.Idle);
                    break;
                }
                break;
            case CharacterState.Coma:
                break;
            case CharacterState.FindPlayer:
                if (!isFindPlayer)
                {
                    if (!foot.TrigGround && !canFly)
                    {
                        if (rb.velocity.y > 0)
                        {
                            ChangeState(CharacterState.Rise);
                            break;
                        }
                        else
                        {
                            ChangeState(CharacterState.Fall);
                            break;
                        }
                    }
                    if (Vector3.Distance(transform.position, targetCharacter.transform.position)
                        < hateDistance)
                    {
                        rushEndPos = targetCharacter.transform.position;
                        isFindPlayer = true;
                        break;
                    }
                    if (targetCharacter.transform.position.x > transform.position.x)
                    {
                        rb.velocity = Vector3.right * moveSpeed;
                        if (bodyTrans.localScale.x > 0)
                        {
                            Turn();
                        }
                    }
                    if (targetCharacter.transform.position.x < transform.position.x)
                    {
                        rb.velocity = Vector3.left * moveSpeed;
                        if (bodyTrans.localScale.x < 0)
                        {
                            Turn();
                        }
                    }
                }

                break;
            case CharacterState.ReadyToRush:
                time += Time.deltaTime;
                aimEffect.SetActive(true);
                rb.constraints = RigidbodyConstraints.FreezeAll;
                ReadyToDash(rushEndPos + Vector3.up, transform.position + Vector3.up);
                if (time >= readyCD)
                {
                    time = 0;
                    if (rushHaveAttack)
                    {
                        ChangeState(CharacterState.RushAttack);
                    }
                    else
                    {
                        ChangeState(CharacterState.Rush);
                    }

                }
                break;
            case CharacterState.RushAttack:
                time += Time.deltaTime;
                dashEffect.canHit = true;
                Rush();
                if (time >= rushTime)
                {
                    time = 0;
                    if (haveDownRush)
                    {
                        if (foot.TrigGround)
                        {
                            ChangeState(CharacterState.FinishRush);
                        }
                        else
                        {
                            ChangeState(CharacterState.ReadyToDownRush);
                        }
                    }
                    else
                    {
                        ChangeState(CharacterState.FinishRush);
                    }
                }
                break;
            case CharacterState.ReadyToDownRush:
                time += Time.deltaTime;
                if (time >= downRushTime)
                {
                    time = 0;
                    ChangeState(CharacterState.DownRush);
                }
                break;
            case CharacterState.DownRush:
                
                if (transform.position.y > 0)
                {
                    dashEffect.canHit = true;
                    Rush();
                }
                if (foot.TrigGround || transform.position.y <= -1)
                {
                    ChangeState(CharacterState.FinishRush);
                }
                break;
            case CharacterState.FinishRush:
                time += Time.deltaTime;
                if (time > finishRushTime)
                {
                    time = 0;
                    ChangeState(CharacterState.Idle);
                }
                break;
            default:
                break;
        }
    }

    public override void ChangeState(CharacterState newState)
    {
        if (state == newState)
        {
            return;
        }
        switch (state)
        {
            case CharacterState.Idle:
                break;
            case CharacterState.Run:
                rb.velocity = Vector3.zero;
                break;
            case CharacterState.Rush:
                rb.velocity = Vector3.zero;
                break;
            case CharacterState.Rise:
                break;
            case CharacterState.Fall:
                rb.velocity = Vector3.zero;
                break;
            case CharacterState.Hurt:
                break;
            case CharacterState.Attack:
                aniCollider.Play("NotAttack", 1, 0);
                break;
            case CharacterState.Die:
                isDie = false;
                break;
            case CharacterState.Weak:
                break;
            case CharacterState.Coma:
                foreach (GameObject i in HitCols)
                {
                    i.SetActive(true);
                }
                break;
            case CharacterState.FindPlayer:
                noOnSearchState = false;
                rb.velocity = Vector3.zero;
                isFindPlayer = false;
                break;
            case CharacterState.ReadyToRush:
                time = 0;
                aimEffect.SetActive(false);
                aimEffect.transform.localScale = Vector3.zero;
                rb.constraints =
                    RigidbodyConstraints.FreezePositionZ | RigidbodyConstraints.FreezeRotation;
                break;
            case CharacterState.RushAttack:
                time = 0;
                dashEffect.canHit = false;
                rb.velocity = Vector3.zero;
                bodyTrans.rotation = Quaternion.Euler(Vector3.zero);

                break;
            case CharacterState.ReadyToDownRush:
                time = 0;
                rb.constraints =
                    RigidbodyConstraints.FreezePositionZ | RigidbodyConstraints.FreezeRotation;

                break;
            case CharacterState.DownRush:

                dashEffect.canHit = false;
                rb.velocity = Vector3.zero;
                bodyTrans.rotation = Quaternion.Euler(Vector3.zero);
                transform.position = new Vector3(transform.position.x, -1, 0);
                break;
            case CharacterState.FinishRush:
                time = 0;
                searchState = SearchState.NoTarget;
                noOnSearchState = false;
                ani.Play("idle", 0, 0);
                aniCollider.Play("Idle", 0, 0);
                break;
            default:
                break;
        }
        CharacterState oldState = state;
        state = newState;
        switch (newState)
        {
            case CharacterState.Idle:
                ani.Play("idle", 0, 0);
                aniCollider.Play("Idle", 0, 0);
                rb.velocity = Vector3.zero;
                //animalAni.SetInteger("state", (int)PlayerState.Idle);
                break;
            case CharacterState.Run:
                ani.Play("walk", 0, 0);
                aniCollider.Play("Walk", 0, 0);
                //animalAni.SetInteger("state", (int)PlayerState.Walk);
                break;
            case CharacterState.Rush:
                ani.Play("rush", 0, 0);
                aniCollider.Play("Rush", 0, 0);
                break;
            case CharacterState.Rise:
                aniCollider.Play("Rise", 0, 0);
                break;
            case CharacterState.Fall:
                aniCollider.Play("Fall", 0, 0);
                //animalAni.SetInteger("state", (int)PlayerState.Fall);
                break;
            case CharacterState.Hurt:
                switch (oldState)
                {
                    case CharacterState.ReadyToRush:
                    case CharacterState.RushAttack:
                    case CharacterState.ReadyToDownRush:
                    case CharacterState.DownRush:
                    case CharacterState.Rush:
                        state = oldState;
                        beRepelValue = totalBeRepelValue;
                        break;
                    default:
                        ani.Play("hitted", 0, 0);
                        aniCollider.Play("Hurt", 0, 0);
                        invincibleTime = totalInvincibleTime;
                        hurtKeepTime = minHurtKeepTime;
                        break;
                }
                break;
            case CharacterState.Coma:
                //ani.Play("Coma", 0, 0);
                ani.Play("idle", 0, 0);
                aniCollider.Play("Idle", 0, 0);
                rb.velocity = Vector3.zero;
                foreach (GameObject i in HitCols)
                {
                    i.SetActive(false);
                }
                break;
            case CharacterState.Attack:
                break;
            case CharacterState.Die:
                ani.Play("die", 0, 0);
                aniCollider.Play("Die", 0, 0);
                isDie = true;
                dieKeepTime = totalDieKeepTime;
                DropSouls();
                if (linked)
                {
                    PlayersInput.instance[0].sprintLinkTrigger.linkedEnemy.Remove(this);
                    PlayersInput.instance[0].playerRope.gameObject.SetActive(false);
                }
                break;
            case CharacterState.Weak:
                switch (oldState)
                {
                    case CharacterState.ReadyToRush:
                    case CharacterState.RushAttack:
                    case CharacterState.ReadyToDownRush:
                    case CharacterState.DownRush:
                        state = oldState;
                        beRepelValue = totalBeRepelValue;
                        break;
                    default:
                        aniCollider.Play("Weak", 0, 0);
                        ani.Play("weak", 0, 0);
                        Vector3 velocity = rb.velocity;
                        velocity.y = weakUpSpeed;
                        rb.velocity = velocity;
                        weakTime = totalWeakTime;
                        break;
                }

                break;
            case CharacterState.FindPlayer:
                isFindPlayer = false;
                isFindingPlayer = true;
                noOnSearchState = true;
                ChosePlayer();
                ani.Play("walk", 0, 0);
                aniCollider.Play("Walk", 0, 0);
                break;
            case CharacterState.ReadyToRush:
                time = 0;
                ani.Play("charge", 0, 0);
                
                break;
            case CharacterState.RushAttack:
                
                targetDir =
                        (rushEndPos - transform.position).normalized;
                ani.Play("rush_attack", 0, 0);
                break;
            case CharacterState.ReadyToDownRush:
                time = 0;
                rb.constraints = RigidbodyConstraints.FreezeAll;
                ani.Play("charge", 0, 0);
                break;
            case CharacterState.DownRush:
                time = 0;
                targetDir = Vector3.down;
                ani.Play("rush_attack", 0, 0);
                break;
            case CharacterState.FinishRush:
                time = 0;
                if (oldState == CharacterState.DownRush)
                {
                    ani.Play("fall_end", 0, 0);
                }
                else
                {
                    ani.Play("idle", 0, 0);
                    aniCollider.Play("Idle", 0, 0);
                }

                break;
            default:
                break;
        }
    }

    public void DropSouls()
    {
        if (dropSoul > 1)
        {
            for (int i = 0; i < dropSoul; i++)
            {
                float angleInterval = dropSoulAngle / (float)(dropSoul - 1);
                float angle = 90 + ((float)i - (float)(dropSoul - 1) / 2) * angleInterval;
                angle = angle / 180 * Mathf.PI;
                GameObject soulObj = PoolManager.Instantiate(soulPrefab, transform.position);
                Vector3 dir = new Vector3(Mathf.Cos(angle), Mathf.Sin(angle), 0);
                soulObj.GetComponent<Soul>().Burst(dir * soulStartSpeed);
            }
        }
        else
        {
            GameObject soulObj = PoolManager.Instantiate(soulPrefab, transform.position);
            Vector3 dir = Vector3.up;
            soulObj.GetComponent<Soul>().Burst(dir * soulStartSpeed);
        }
    }

    public void Jump()
    {
        SetUpSpeed(jumpSpeed);
        ani.Play("jump", 0, 0);
    }

    public void SetUpSpeed(float speed)
    {
        ChangeState(CharacterState.Rise);
        Vector3 velocity = rb.velocity;
        Vector3 leftDir = GetMoveDir();
        if (leftDir.x > 0.3f)
        {
            if (bodyTrans.localScale.x > 0)
            {
                Turn();
            }
        }
        else if (leftDir.x < -0.3f)
        {
            if (bodyTrans.localScale.x < 0)
            {
                Turn();
            }
        }
        velocity.y = speed;
        rb.velocity = velocity;
        //animalAni.SetInteger("state", (int)PlayerState.Rise);
    }

    public void ChangeSearchState(SearchState newState)
    {
        switch (searchState)
        {
            case SearchState.NoTarget:
                break;
            case SearchState.InSearchScope:
                break;
            case SearchState.InAttackScope:
                break;
            default:
                break;
        }
        searchState = newState;
        switch (searchState)
        {
            case SearchState.NoTarget:
                Character character0 = PlayersInput.instance[0];
                Character character1 = PlayersInput.instance[1];
                if (character0.beTargetCharacter.Exists(t => t == this))
                {
                    character0.beTargetCharacter.Remove(this);
                }
                if (character1.beTargetCharacter.Exists(t => t == this))
                {
                    character1.beTargetCharacter.Remove(this);
                }
                targetCharacter = null;
                break;
            case SearchState.InSearchScope:
                break;
            case SearchState.InAttackScope:
                break;
            default:
                break;
        }
    }

    public bool SearchTarget()
    {
        targetCharacter = searchTrigger.GetMinDisTarget(targetTypes, canHitFly);

        if (targetCharacter != null)
        {
            Character character0 = PlayersInput.instance[0];
            Character character1 = PlayersInput.instance[1];
            if (targetCharacter == character0
                && !character0.beTargetCharacter.Exists(t => t == this))
            {
                character0.beTargetCharacter.Add(this);
            }
            if (targetCharacter == character1
                && !character1.beTargetCharacter.Exists(t => t == this))
            {
                character1.beTargetCharacter.Add(this);
            }
            return true;
        }
        else
        {
            return false;
        }
    }

    public void OnSearchState()
    {
        switch (searchState)
        {
            case SearchState.NoTarget:
                if (SearchTarget())
                {
                    ChangeSearchState(SearchState.InSearchScope);
                    break;
                }
                //向玩家基地移动
                break;
            case SearchState.InSearchScope:
                if (!SearchTarget())
                {
                    targetCharacter = null;
                    ChangeSearchState(SearchState.NoTarget);
                    break;
                }
                if (targetCharacter != null && Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) <= attackDistance)
                {
                    ChangeSearchState(SearchState.InAttackScope);
                    break;
                }
                break;
            case SearchState.InAttackScope:
                if (targetCharacter != null)
                {
                    if (!targetCharacter.gameObject.activeInHierarchy || targetCharacter.isDie
                        || Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) > attackDistance)
                    {
                        ChangeSearchState(SearchState.NoTarget);
                    }
                }
                else
                {
                    ChangeSearchState(SearchState.NoTarget);
                }
                break;
            default:
                break;
        }
    }

    public override void Attack1()
    {
        base.Attack1();
        attackTarget = targetCharacter;
    }

    public override void Attack2()
    {
        base.Attack2();
        attackTarget = targetCharacter;
    }
    public void ChosePlayer()
    {
        float distance0 = 1000;
        float distance1 = 1000;
        if (PlayersInput.instance[0])
        {
            distance0 = Mathf.Abs(PlayersInput.instance[0].transform.position.x
                - transform.position.x);
        }
        if (PlayersInput.instance[1])
        {
            distance1 = Mathf.Abs(PlayersInput.instance[1].transform.position.x
                - transform.position.x);
        }
        if (distance0 <= distance1)
        {
            targetCharacter = PlayersInput.instance[0];
            if (!PlayersInput.instance[0].beTargetCharacter.Exists(t => t == this))
            {
                PlayersInput.instance[0].beTargetCharacter.Add(this);
            }
            
            distance = distance0;

        }
        else
        {
            targetCharacter = PlayersInput.instance[1];
            if (!PlayersInput.instance[1].beTargetCharacter.Exists(t => t == this))
            {
                PlayersInput.instance[1].beTargetCharacter.Add(this);
            }
                
            distance = distance1;
        }
    }
    public void ReadyToDash(Vector3 pos0, Vector3 pos1)
    {
        Vector3 target = (pos0 - pos1).normalized;
        float distance = aimDistance;
        aimEffect.transform.localScale =
            new Vector3(distance, 1, 1);

        targetDir = pos0 - pos1;
        float k = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
        if (targetDir.x < 0)
        {
            aimEffect.transform.rotation = Quaternion.Euler(new Vector3(0, 0, k));
            if (bodyTrans.localScale.x < 0)
            {
                bodyTrans.localScale =
                    new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
            }

        }
        else
        {
            aimEffect.transform.rotation = Quaternion.Euler(new Vector3(0, 0, k));
            if (bodyTrans.localScale.x > 0)
            {
                bodyTrans.localScale =
                    new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
            }
        }
    }

    private void Rush()
    {
        float k = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
        if (targetDir.x < 0)
        {
            dashEffect.offset = 1;
            if (bodyTrans.localScale.x < 0)
            {
                bodyTrans.localScale =
                    new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
            }

            bodyTrans.rotation = Quaternion.Euler(new Vector3(0, 0, k - 180));
        }
        else
        {
            if (bodyTrans.localScale.x > 0)
            {
                bodyTrans.localScale =
                    new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
            }

            dashEffect.offset = -1;
            bodyTrans.rotation = Quaternion.Euler(new Vector3(0, 0, k));
        }


        rb.velocity = targetDir * rushSpeed;
    }
}
