我有一个问题与敌人。 我想在玩家站在敌人的背后时,敌人保持原来的位置,直到玩家从他的肩膀范围离开,始终循环播放向后走的动画(如驱逐)的问题是,当玩家进入肩膀范围时,敌人就会转身,所以动画会从头开始。此外,当玩家离开敌人的肩膀范围,并开始循环播放向后走的动画时,敌人就会转身,不能正确跟随玩家的位置,所以他的身体会面向相反的方向,脸部也不会面向玩家(比如说,身体一样)。

如果需要一些视频,我可以上传它们。

代码:

public void StartWalkRandom()
{   
    //ghostStateMachine.ChangeState(GhostState.Walking);

    int walkingType = 0;

    // Se il fantasma è vicino a un muro, cambia la camminata
    if (IsNearWall(1f) && Random.value < 0.4f)
    {
        walkingType = 1;
    }

    Debug.Log($"Trying to start walk. canWalk={ghostAnimation.canWalk}, isWalking={ghostAnimation.isWalking}, IsBusy={ghostAnimation.IsBusy}");

    ghostAnimation.StartWalkSequence(walkingType);
}

private bool IsNearWall(float distance)
{
    RaycastHit hit;
    Vector3 origin = transform.position + Vector3.up * 0.5f;
    if (Physics.Raycast(origin, transform.forward, out hit, distance))
    {
        if (hit.collider.CompareTag("Wall"))
        {
            return true;
        }
    }
    return false;
}

// --- Segui il player ---
public void HandlePlayerFollow()
{
    if (player == null) return;

    Vector3 toPlayer = (player.position - transform.position).normalized;
    float distanceToPlayer = Vector3.Distance(transform.position, player.position);
    float dot = Vector3.Dot(transform.forward, toPlayer);

    if (distanceToPlayer > followDistance)
    {
        // Player troppo lontano → torna a patrol
        isFollowingPlayer = false;
        isAttacking = false;
        ghostStateMachine.GoToNextPatrol();
        return;
    }

    isFollowingPlayer = true;

    if (distanceToPlayer <= ghostAttack.attackDistance)
    {
        // Player vicino → attacco
        if (!isAttacking)
        {
            isAttacking = true;
            agent.isStopped = true;
            ghostAttack.AttackPlayer();
        }
    }
    else
    {
        // Insegui il player
        isAttacking = false;
        agent.isStopped = false;

        if (dot < -0.5f)
        {
            // Player dietro → camminata all'indietro
            ghostAnimation.TriggerWalkBack();
            agent.isStopped = true;  // Fermiamo il movimento del NavMeshAgent
            agent.updatePosition = false; // Non aggiorniamo la posizione tramite NavMeshAgent
            agent.updateRotation = false; // Disabilitiamo anche la rotazione automatica dell'agent

            Vector3 lookDirection = (player.position - transform.position).normalized;
            lookDirection.y = 0; // mantieni il piano orizzontale
            if (lookDirection != Vector3.zero)
            {
                Quaternion targetRotation = Quaternion.LookRotation(lookDirection);
                transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 5f);
            }

            // Muoviti all’indietro (gambe crab walk)
            if (ghostAnimation.isWalking)
            {
                float backwardSpeed = agent.speed * Time.deltaTime;
                transform.position += -transform.forward * backwardSpeed;  // Muoviamo indietro

                // Manteniamo la rotazione
                if (lookDirection != Vector3.zero)
                {
                    Quaternion targetRotation = Quaternion.LookRotation(lookDirection);
                    transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 5f);
                }
            }
        }
        else
        {
            // Player davanti → camminata normale
            ghostAnimation.StartWalkSequence(0); // tipo di camminata normale
            agent.updateRotation = true;

            agent.SetDestination(player.position);
        }
    }
}